Docker로 Jenkins 서버 구축하기

준비사항

  • Docker가 설치되고 사용할 수 있는 환경

이 글의 내용은 Linux/MacOS/Windows 운영체제에서 적용이 가능 하지만, 각 운영체제 별로 적용 방법이 조금씩 상이할 수 있다. 여기서는 기본적으로 MacOS를 기반으로 작성했음을 알린다. 운영체제 별로 몇 가지 차이점에 대해 미리 설명하자면 다음과 같다.

사전설명

  • Linux의 경우 sudo 권한을 이용해 Docker를 설치하기 때문에, 기본적으로 sudo 명령어를 병행해야 docker 명령어가 동작한다. 이것이 싫다면 root 권한으로 로그인 하거나, Docker 관리자 계정을 docker 그룹에 추가해야 한다. 이 중에서 추천하는 방식은 후자다.
  • Windows는 기본적으로 Unix 계열의 운영체제와 루트 디렉터리 관리 방식이 다르다. 따라서 디렉터리를 bind 할 때, 경로 지정 방식이 상이하다.

Jenkins 이미지 내려받기

Docker Hub에 접속해 검색 창에 jenkins를 검색해 보자. 엄청나게 많은 Jenkins 관련 이미지가 뜰 것이다. 이 중에 누가 봐도 내려받아야 할 것 같은 큼직한 'DOCKER OFFICIAL IMAGE' 로고가 달린 jenkins라는 이름의 이미지가 보일 것이다. 하지만 이 이미지는 함정이다.

이건 Jenkins 커뮤니티의 함정이다!

Jenkins 커뮤니티에서는 자신들의 이미지 관리 용이성을 위해, 원래의 이미지 관리를 포기하고 새로운 이미지를 만들었다. 따라서 저 큼직한 'DOCKER OFFICIAL IMAGE' 로고가 달린 이미지는 현재 관리가 되고 있지 않는 이미지다. 현재는 jenkins대신 jenkins/jenkins라는 이름의 이미지를 내려받아야 한다.

누가 봐도 위쪽을 내려받아야 할 것 같지만, 아래쪽이다(...)

그렇다면 이제 CLI 셸(이하 셸)을 열어 Jenkins 이미지를 내려받도록 하자. Jenkins에서 제공하는 이미지 태그는 엄청나게 많지만, 크게 두 개의 태그로 압축할 수 있다. 하나는 OpenJDK 11을 기반으로, 나머지 하나는 OpenJDK 17을 기반으로 동작하는 LTS(장기 지원 버전) 이미지다. 이 중에서 기본 LTS 태그는 OpenJDK 11을 기반으로 두고 있다. 일반적이라면 그냥 LTS 버전을 내려받으면 된다. 하지만 나처럼 OpenJDK 17을 기반으로 두는 프로젝트를 진행 중 이라면 OpenJDK 17 버전의 LTS 이미지를 내려받는 게 추가 작업이 없어서 편할 것이다.

# OpenJDK 11 기반의 Jenkins 이미지 내려받기
% docker pull jenkins/jenkins:lts
# 혹은
% docker pull jenkins/jenkins:lts-jdk11

# OpenJDK 17 기반의 Jenkins 이미지 내려받기
% docker pull jenkins/jenkins:lts-jdk17
jenkins 이미지 내려받는 명령어

로컬 디렉토리 생성

Jenkins 이미지를 내려받는데 성공 했다면, 그대로 도커 컨테이너로 올려서 사용해도 된다. 하지만 관리 차원에서 볼 때, 컨테이너 내부의 jenkins_home 디렉터리를 로컬 디스크의 특정 디렉터리와 연동 시키는 것이 편하다. 나 같은 경우에는 ~/Docker/jenkins/home 디렉터리와 jenkins_home을 연동 하려고 한다.

# -p 옵션을 쓰면 경로 상의 없는 디렉토리까지 모두 생성해준다
% mkdir -p ~/Docker/jenkins/home
~/Docker/jenkins/home 디렉토리 생성하는 명령어

Docker에 Jenkins 컨테이너 생성하기

로컬 디렉토리를 생성했다면, 다음 명령어를 입력해 Docker에 Jenkins 컨테이너를 생성해야 한다.

% docker run -d --name <container_name> \
         -v <local_directory_path>:/var/jenkins_home \
         -p 8080:<port1> -p 50000:<port2> \
         --restart=on-failure jenkins/jenkins:<tag_name>
Docker에 Jenkins 컨테이너를 생성하는 명령어

홑화살괄호<> 에 대해 설명하자면 다음과 같다.

  • container_name: 생성할 컨테이너 명
  • local_directory_path: jenkins_home 디렉터리와 연동할 로컬 디렉토리 경로
  • port1: 로컬에서 사용할 Jenkins 관리자 홈페이지 접속 용 포트
  • port2: 로컬에서 사용할 Jenkins 에이전트 용 포트
  • tag: Jenkins 버전을 나타내는 태그 명

나 같은 경우에는 OpenJDK 17 기반의 LTS 버전을 설치하고 jenkins_home을 위에서 생성한 ~/Docker/jenkins/home 디렉토리에 연동하였으며 jenkins라는 이름의 컨테이너로 생성했다. 포트는 컨테이너에서 사용하는 기본 포트와 동일하게 설정했다.

% docker run -d --name jenkins \
         -v ~/Docker/jenkins/home:/var/jenkins_home \
         -p 8080:8080 -p 50000:50000 \
         --restart=on-failure jenkins/jenkins:lts-jdk17
내가 사용한 Jenkins 컨테이너 생성 명령어

Jenkins 관리자 페이지 접속

Jenkins 컨테이너가 실행되고 나면 웹 브라우저 주소창에 http://localhost:8080을 입력해 관리자 페이지에 접속할 수 있다. 만약 본인의 서버가 GUI 환경을 지원하지 않는다면, 다른 컴퓨터에서 해당 서버의 IP로 접속할 수 있다.

관리자 패스워드를 입력하는 페이지

처음 접속하고 나면 Unlock Jenkins 페이지가 뜨면서, 관리자 패스워드를 입력하라고 한다. 해당 패스워드는 /var/jenkins_home/secrets/initialAdminPassword 파일에 저장되어 있다고 알려준다. 하지만 우리는 로컬 디렉터리에 jenkins_home 디렉터리를 연동했기 때문에 직접 접근할 필요가 없다. 다음 명령어를 셸에 입력해 패스워드 값이 셸에 표시되도록 하자.

% cat ~/Docker/jenkins/home/secrets/initialAdminPassword
해당 명령어를 입력하면 셸에 숫자와 소문자 영어로 무작위 조합된 문자열이 보인다

위 명령어를 통해 표시된 무작위 문자열을 복사한 다음 관리자 패스워드 입력 칸에 입력하고 Continue 버튼을 클릭하면 된다.


Continue 버튼을 클릭하고 나면 Customize Jenkins 페이지가 뜨는데, 좌측의 'Install suggested plugins' 버튼을 클릭해 플러그인들을 설치하자.

좌측의 버튼을 눌러 진행하자

버튼을 누르고 나면 다음과 같은 페이지가 뜨면서 자동으로 플러그인이 설치된다.

플러그인 설치 중

혹시나, 플러그인 설치가 완료되고 Installation Failures가 뜨더라도 당황하지 말고 Retry 버튼을 클릭하자. 그래도 계속 실패한다면 그냥 무시하고 Continue 버튼을 클릭하면 된다. (Jenkins 설정 페이지에서 다시 설치가 가능하다.)

설치 실패가 떠도 당황하지 말자... 생각보다 흔히 일어난다

그 다음으로는 최초 관리자 계정을 생성해야 한다. 빈칸을 입력하고 Save and Continue 버튼을 클릭해 진행하자.

첫 번째 관리자 계정 생성

마지막으로 Jenkins URL을 설정해줘야 한다. Jenkins는 스스로 URL을 생성하지 못하기 때문에, 사용자가 입력해준 URL을 기반으로 동작한다. http://localhost:8080을 통해 접속했다면 'http://localhost:8080'가 기본 입력되어 있겠지만, 이렇게 하면 외부 환경에서 접속이 불가능해진다. 따라서 외부에서 접속할 필요가 있다면 localhost가 아닌 해당 host의 IP를 입력해줘야 한다. URL을 입력했다면 Save and Continue 버튼을 클릭해 최종 페이지로 이동하자.

Jenkins URL 설정

Jenkins URL을 설정한 뒤, 다음으로 넘어가면 Jenkins is ready! 라는 페이지가 뜬다. 해당 페이지에 start using Jenkins 버튼이 보일 것인데, 망설이지 말고 곧바로 클릭해주자.

(스크린 샷을 못 찍었다...)


잠시 기다린 뒤, 설정해준 URL로 접속하면 다음과 같은 페이지가 뜰 것이다. 여기서 첫 번째로 생성한 관리자 계정으로 로그인이 되면 정상적으로 설치가 완료된 것이다.

Jenkins 설치의 마지막 단계다, 로그인까지 되는지 확인해주자!

정리하며

원래는 AWS의 EC2 호스팅 서비스를 이용해 Jenkins 서버를 구축 했었는데, 요금이 너무 비싸서 Lightsail 서비스로 옮겼었다. 그런데 이번엔 성능이 너무 안 좋아서 고민하던 차에 맥북 에어가 생겨서, 새로운 Jenkins 서버를 구축하며 이 글을 작성하게 되었다. 다음 글에서는 Jenkins를 이용해 vue3.js + Spring Boot 2 프로젝트를 배포하는 방법에 대해서 다룰 예정이다.