
나스 대체용으로 산 서버를 끝도없이 뽑아먹는 법
그건바로 내가 작성하는 프로그램을 직접 내 서버에서 돌려먹는 것이다.
몇개의 글로 분리할지는 아직 미정이다만
앞으로 몇개의 연결된 글들을 통해서 CI/CD를 내 서버상에 직접 구축해보고자 한다.
CI 솔루션에는 GIthub Actions가 좀더 편하다고는 하던데,
Docker Hub에 내 소스코드를 이미지 형태로 배포하게 된다는게 좀 마음에 걸렸다.
남한테 퍼블릭하게 배포할만큼 야무진 코드들은 아니니까 ㅠㅠ

그런관계로 젠킨스를 통해서 내 서버 로컬환경에서 이미지를 생성하고
그 이미지를 바로 도커상에서 실행시키는 방법으로 도커허브 배포 없이 CI/CD를 구축해보도록 하겠다.
내가 구축하고자 하는 배포 흐름은

- 코드를 깃허브의 특정 브랜치에 푸시
- 깃허브가 selfhosting 되고있는 젠킨스에 요청을 전달 ( 웹훅 사용 )
- 젠킨스가 도커 이미지를 빌드한다
- 젠킨스가 해당 이미지로 컨테이너를 구동, 서비스를 올린다.
도커 설치 및 설정
Proxmox 상에 Docker를 설치한 VM을 올리는 과정은
별도의 글로 분리해뒀기 때문에, 이쪽 글을 참고해서 진행하도록 한다.

만일 다른 VM 인스턴스에서 portainer가 이미 구동되고 있다면,
portainer를 두개 설치해서 사용하는 것이 아니라
portainer_agent를 통한 연결을 시도해봐도 좋을 듯 하다.
도커의 설치가 끝난 상태의 터미널창에
아래 명령어를 입력해서 portainer_agent를 설치한다.
docker run -d -p 9001:9001 --name portainer_agent --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v /var/lib/docker/volumes:/var/lib/docker/volumes portainer/agent
이미 설치되어있는 타 서버의 portainer에 접속해
Environments > Add environment를 선택한다.

Docker Standalone 선택 후,
portainer_agent를 실행시킨 VM의 ip를 넣어주고
포트는 9001로 맞춘다.
이름은 취향껏.

Jenkins 설치
portainer 상에서 진행하도록 하겠다.

컨테이너 이미지는
jenkins/jenkins:lts
를 사용하도록 하겠다.
포트 8080을 원하는 포트와 매칭시켜서 열어준다.

볼륨을 바인딩해주는데
첫번째는 설정파일을 백업하기 위해서이고
두번째, 세번째는 Jenkins가 구동되고 있는 도커 환경 위에 프로그램을 배포하기 위해서이다.

추가적으로 Privileged mode를 켜준다.
컨테이너를 구동시킨 후 <ip주소>:8080 으로 접속하면

해당 메시지가 뜬다.
Portainer > Containers 로 이동한 뒤

Quick Actions 의 왼쪽 첫번째 버튼을 클릭한다.
Please use the following password to proceed to installation:
문장 바로 아래의 코드를 복사해서 해당 브라우저창에 붙여넣기 하면 다음 단계로 넘어갈 수 있다.

추천 플러그인을 설치한다.

관리자 계정을 생성해준다.

리버스프록시 등을 씌울 예정인 경우 해당 URL을 기입해준다.
아직 정해지지 않은 경우 아래의 Not now 로 건너뛸 수도 있다.

젠킨스의 설치 과정이 끝났다.
Github과 연동하기
바로 위 화면에서
Jenkins 관리 > System 으로 이동한다.
아래로 쭉 스크롤하다보면
중간즈음에

Github 설정이 가능한 구역이 있다.
본인의 깃허브 프로필로 이동해서,
Settings > Developer settings 으로 이동한다.

Personal access tokens > Tokens (classic) > Generate new token(우상단 버튼) > Generate new token (classic) 선택.

Note는 알아보기 쉽게 적당히 지어주고
Expiration 을 No expiration, 만료 없음으로 설정해준다.
아래의 Select scopes에서

repo 와 admin:repo_hook 을 선택해준다.
하위목록이 모두 선택될 것이다.
토큰 발급 후 해당 토큰을 복사해준다.
다시 젠킨스로 돌아와서
Add Github Server > Github Server 선택.

Add > Jenkins 선택.

Domain : Global credentials
Kind : Secret text
Scope : Global
Secret에 아까 발급받은 토큰을 붙여넣고
ID는 깃허브 프로필 ID와 통일해준다.
Description은 취향껏.
추가해준 뒤에

Credentials를 방금 추가한것으로 변경하고 Test connection 을 통해 제대로 작동하는지 확인한다.
마지막으로 저장하고 나오면
Jenkins를 사용해 CI/CD를 구축할 기초적인 준비가 끝난 것이다.