::: IT인터넷 :::

Jenkins에 Docker 이미지 빌드 에이전트 연결하기

곰탱이푸우 2022. 1. 27. 08:20
Jenkins에서 Docker 이미지 빌드를 위한 에이전트로 사용하기 위해, VirtualBox 기반으로 가상 머신을 생성했다.

 

VirtualBox로 Docker 이미지 빌드를 위한 가상 머신 생성 방법은 다음 포스팅을 참고한다.
가상 머신 생성이 완료되면 Jenkins에 빌드 에이전트로 등록해야 한다.
이미 이전에 파이썬과 Visual Studio 빌드 에이전트를 연결하는 방법을 다룬 적이 있다.
우분투 환경에 Java로 에이전트 설정 파일을 실행하는 방법인데, 기존에 진행한 경험이 있거나 이해가 있다면 어렵지 않게 적용할 수 있다.
 
기존의 파이썬과 Visual Studio 빌드 에이전트 연결 방법은 아래 포스팅을 참고한다.
 

Jenkins 설정

당연한 이야기이지만 Jenkins에 빌드 에이전트를 등록하기 위해서는 Jenkins가 동작 중이어야 한다.
 
Docker를 이용한 Jenkins 설치와 기본 설정 방법은 아래 포스팅을 참고한다.

Jenkins 에서 빌드 에이전트 생성

Jenkins에 로그인하고 좌측의 Jenkins 관리 버튼을 클릭한다.
그리고 노드 관리 버튼을 클릭한다.
 

 

좌측의 신규 노드를 클릭한다.
 
 
생성하려는 에이전트의 이름을 지정하고 Permanent Agent에 체크하면  OK 버튼이 활성화 된다.
OK 버튼을 클릭한다.
 
 

생성한 빌드 에이전트 세부 설정

OK 버튼을 클릭하면 생성한 빌드 에이전트의 세부 설정 화면으로 이동한다.
 
 
Name
생성하고자 하는 빌드 에이전트의 이름을 입력한다. Jenkins에서 표시 되는 이름이다.
첫 번째 Docker 빌드 에이전트이므로 docker-build01로 지정했다.
 
Remote root directory
연결하려는 우분투 가상 환경의 계정 경로를 지정한다.
계정은 dockerbuild이며, 계정 경로는 /home/dockerbuild이다.
 
Labels
해당 에이전트에 대한 별칭이다.
docker-build01은 길기 때문에 build를 제외하고 docker01로 지정했다.
 
아래로 스크롤을 내리면 추가 설정이 있다.
 
 
Usage
Use this node as much as possible 설정을 유지한다. 
 
Launch method
Launch agent by connecting it to the controller 설정을 유지한다.
빌드 에이전트에서 Java 프로그램을 실행해서 에이전트로 연결하는 방식이다.
 

 

아래 포스팅에서 이미 시도했던 방법이다. 기존 방법이 윈도우 환경이었다면, 이번에는 리눅스 환경에서 진행하는 것이다.
Custom WorkDir path
빌드 에이전트 내부에서 Jenkins가 작업을 수행할 경로를 지정한다. remote root directory 하위의 agent 경로를 지정했다.
remote root directory 하위의 특정 경로를 지정했는데, 나중에 빌드 파이프라인을 설정할 때 작업 폴더를 통채로 지울 수 있기 때문이다.
retmote root directory와 동일하게 지정하면 어려운 부분이 있어 하위 경로를 지정했다.
 
Internal data directory
WorkDir 하위에 Jenkins가 생성하는 로그 및 원격 실행 관련 파일들을 저장하는 공간이다.
Jenkins 내부적으로 사용하는 데이터가 저장되기 때문에 큰 신경을 쓰지 않아도 된다.
 
Save 버튼을 눌러 설정을 완료하면 아래와 같이 에이전트가 추가 된 것을 확인할 수 있다.
그러나 아직 가상 환경과 연결 된 것이 아니기 때문에 아이콘 옆에 X 마크가 있는 것을 확인할 수 있다.
 
 
 

가상 머신 설정

이제 가상 머신에서 작업을 수행한다.
 

가상 머신 설정 변경

VirtualBox에서 빌드 에이전트로 등록할 가상 머신을 선택하고 시작 버튼을 클릭한다.
 
 
hostname 명령을 실행해서 해당 가상 머신의 호스트명을 확인한다. dockerbuild-VirtualBox로 되어 있다.
 
 
나중에 에이전트 개수를 늘리게 될 경우 동일한 호스트명이 있으면 네트워크에서 충돌이 발생할 수 있다.
따라서 아래 명령으로 호스트명에 숫자를 포함하도록 변경한다.
$ sudo hostname dockerbuild01
 
hostname 명령으로 확인해보면 정상적으로 변경 된 것을 확인할 수 있다.
 
 
특별히 사용할 일은 없지만 가상 환경에 추가적인 설정이 필요한 경우 아래 설정을 변경한다.
 
APT 저장소

사설 저장소를 사용하거나 우분투 사이트가 아닌 카카오 미러 사이트를 사용하려는 경우에 해당한다.

아래 포스팅의 클라이언트 설정 부분을 참고한다.
 
Docker의 insecured-registry 설정 변경

만약 Docker 사설 저장소가 https를 제공하지 않는 경우, 해당 옵션을 지정하지 않으면 정상적인 접근이 불가능하다.

아래 포스팅의 클라이언트 설정 부분을 참고한다.
 

Nexus3를 이용한 Docker 사설 저장소 구축

Nexus3를 이용한 Docker 사설 저장소 구축은 3개의 저장소가 필요하다. hosted (Local) - 내부에서 생성한 Docker 이미지 파일을 배포 (Push)한다. proxy (Remote) - 외부의 Docker 저장소의 이미지들을 저장하고..

www.bearpooh.com

 

 

 

Docker를 배포할 사설 저장소 로그인

또한 사설 저장소에 이미지를 배포하기 위해서는 로그인 되어 있어야 한다.
 
먼저 Jenkins와 Nexus를 연동하는 방법은 아래 문서를 참고한다.
 

Jenkins에서 윈도우 에이전트를 이용한 Visual Studio 빌드 구성 (1)

이제 Jenkins에 등록한 윈도우 에이전트를 이용하여 Visual Studio 빌드를 구성한다. Jenkins와 Nexus에 추가로 설정할 것들이 있기 때문에 사전 준비와 빌드 설정을 나눠서 포스팅한다. 빌드 구성에 필요

www.bearpooh.com

 
연동한 이후 가상 머신에서 아래 명령으로 로그인을 수행한다.
$ docker login 사설저장소주소:포트
 
 
로그인에 성공하면 다음과 같은 성공 메시지가 출력된다.
 

가상 머신에서 Jenkins 접속

가상 머신의 브라우저를 실행해서 Jenkins에 접속한다.
 

 

Jenkins에 로그인 하고 좌측의 Jenkins 관리를 클릭한 다음, 우측의 노드 관리를 클릭하여 빌드 에이전트 목록 화면으로 이동한다.
 
 
앞서 생성한 docker-build01 에이전트를 클릭한다.
 

 

현재 Jenkins에 가상 머신이 에이전트로 등록 되지 않은 상태여서, 가상 환경에서 실행해야 하는 코드가 나와있다.
 

 

 

Jenkins 에이전트 실행

먼저 agent.jar 부분의 링크를 우클릭하고 URL을 복사한다.
 

 

터미널을 열고  jenkins 경로를 생성하고, 생성한 경로로 이동한다.
 

 

wget 명령어에 복사한 URL을 이용하여 agent.jar 파일을 다운로드한다.
 

 

agent.jar 파일 다운로드가 끝났으면 아래 페이지의 java 명령어 부분을 복사한다.
 
 
복사한 명령어를 터미널에서 실행하면 아래와 같이 실행된다. 
 

 

&는 백그라운드 실행인데, 터미널을 닫으면 프로세스가 종료되어서 큰 의미가 없다.
해당 프로세스가 터미널을 닫아도 상시 동작하도록 하는 설정은 다음 포스팅에서 다룰 예정이다.

 

 

Jenkins에서 연결 상태 확인

실행이 완료되면 Jenkins 노드 상태 페이지에서 새로고침 한다.
아래와 같이 정상적으로 연결 된 것을 확인할 수 있다.
 

 

참고사항
에이전트 연결이 되지 않을 경우 아래 사항을 점검할 필요가 있다.
 
  1. HTTPS를 사용 중이라면 Jenkins 관리 - Global Security Manage - TLS 옵션을 켜고 재시도한다.
  2. Jenkins의 Docker Container를 생성할 때 포트 바인딩은 동일하게 지정한다. (8080:8080, 50000:50000)
 
JNLP 포트인 50000번 포트를 변경할 경우 아래와 같이 지정한다.
  1. Jenkins의 Docker Container를 생성할 때 내부 포트와 외부 포트를 동일하게 지정한다.
  2. Jenkins 관리 - Global Security Manage에서 변경한 포트를 입력하고 저장한다.
 

터미널을 종료하면 연결 종료

가상 머신에서 터미널을 종료하면 생성 된 프로세스가 종료 되기 때문에 연결이 다시 끊어진다.
 
해결 방법은 두 가지이다.
 
첫 번째는 터미널을 띄워 놓은 상태에서 가상 머신이 백그라운드로 동작하도록 종료하는 것이다.
아래 포스팅을 참고한다.
두 번째는 가상 머신에 해당 명령어를 서비스로 등록하는 방법이다.
해당 방법은 다음 포스팅을 참고한다.
 
위의 방법으로 해결 되면 스냅샷을 생성한다.
이후 설정이 꼬이거나 불필요한 파일이 많이 쌓여 초기화가 필요할때 유용하게 활용 가능하다.