💡 CICD 과정LINK의 개요에 따라 작성되었습니다.
순서를 따르면 순조롭게 진행할 수 있습니다.

Jenkins 설치 및 실행

Jenkins란 코드에 대한 지속적 통합(CI)지속적 배포(CD) 를 지원하기 위한 도구이다. 즉, 컴파일 오류를 검출하고, 자동화된 테스트를 수행하며, 정적 코드 분석을 제공하고, 성능 변화도 감시할 수 있다. 또한, 지속적인 배포를 가능하게 해준다.

한마디로 정리하면 Jenkins는 소스코드를 작성하고 출시하기 까지의 모든 작업을 자동화 해줄 수 있는 툴이다.

물론 자동화를 구축하는 일은 그렇게 쉬운 일은 아니다. 해당 포스트 시리즈를 보며 차근차근 따라할 수 있도록 작성해 보겠다.

이번 포스트에서는 Docker를 통해 Jenkins를 설치하고 실행까지 진행해 보자.

Docker 설치

개요에서 말했듯이 실제 환경에서는 Jenkins 서버를 따로 두지만, 우리는 CICD를 연습하기 위한 것이니 Local에 Jenkins를 설치하도록 하겠다. Jenkins 전용 서버를 둘 여유가 있다면 그 곳에서 진행하면 된다.

Local 컴퓨터로 macOS를 사용하고 있다. 따라서 Docker Desktop을 다음과 같은 명령어로 설치해 준다.

Docker Engine은 리눅스에서만 구동된다. 윈도우나 맥에서 Docker Engine을 사용하기 위해서는 리눅스 가상 머신을 설치하고 세팅하는 복잡한 과정이 필요하다. 이런 귀찮은 과정을 한번에 해결해주는 Docker Desktop을 설치했다. 설치하고자 하는 OS가 리눅스인 경우, LINK에서 운영체제에 맞게 docker engine을 설치하면 된다.

1
$ brew install --cask docker

위의 명령어를 입력하면 아래와 같이 설치가 진행된다.

다음 명령어로 Docker가 잘 설치 되었는지 확인해보자.

1
$ docker --version

아래와 같이 작성일 기준 20.10.21버전이 잘 설치된 것을 확인할 수 있다.

이로써 간단하게 Docker 설치를 마쳤다.

Jenkins Container 실행

Docker Container를 이용해 Jenkins를 실행 시킬 것이다.

가장 먼저, Jenkins의 공식 이미지를 pull하고 필요한 설정을 한 뒤 컨테이너를 띄우면 된다. 여러가지 해주어야 하는 설정을 생략하기 위해 Dockerfile을 작성할 수 있지만, 현재는 연습하는 과정이기 때문에 직접 해보고 추후 Dockerfile을 작성해 쉽게 Jenkins Container를 띄워보자.

Docker 이미지 다운로드

다음 명령어로 Docker Hub에서 Jenkins공식 이미지pull해준다.

1
$ docker pull jenkins/jenkins

그러면 다음과 같은 오류가 생길 수 있다.

1
2
3
$ docker pull jenkins/jenkins                                                                                                                                               
Using default tag: latest
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

docker deamon이 실행되고 있지 않다는 의미이다. docker desktop을 실행시켜 deamon을 실행상태로 만들어 주자.

docker desktop을 띄우고 다음과 같은 화면이 보이면 docker deamon이 실행되고 있는 상태이다. 다시 위의 명령어를 입력하면 다음과 같이 docker image를 받아올 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
$ docker pull jenkins/jenkins

Using default tag: latest
latest: Pulling from jenkins/jenkins
c3e6129b48b6: Pull complete
a0408b343c56: Pull complete
77aecf6dd9e0: Pull complete
d60176504adc: Pull complete
011eff629313: Pull complete
fbf087153ea6: Pull complete
918364f83914: Pull complete
6e83ec4026ce: Pull complete
5fee921d4688: Pull complete
994bab7b70d4: Pull complete
99515d9d6eca: Pull complete
a6abb55c90a4: Pull complete
359a3c3ca1df: Pull complete
Digest: sha256:055adadf1544ca40ffa4d771a8741fc17074fbb492dc261d4e48905bc5c401ba
Status: Downloaded newer image for jenkins/jenkins:latest
docker.io/jenkins/jenkins:latest

Jenkins Container 실행

1
2
3
4
5
6
7
8
$ mkdir ~/docker
$ sudo docker run -d \
-p 8090:8080 \
-v ~/docker/jenkins:/var/jenkins_home \
-v /var/run/docker.sock:/var/run/docker.sock \
--name jenkins \
-u root \
jenkins/jenkins
  • -d : 컨테이너를 데몬(백그라운드)으로 띄운다.

  • -p 8090:8080 : 컨테이너 외부와 내부 포트를 포워딩한다. Jenkins의 기본 포트는 8080이다. 컨테이너의 8080 포트를 호스트의 8090포트를 포워딩한다. 추후 작성할 Spring Project의 기본 포트도 8080이기 때문에 겹치지 않게 하기 위해 외부포트를 8090으로 변경해 주었다. 그러면 http://localhost:8090으로 Jenkins에 접속할 수 있다.

  • -v ~/docker/jenkins:/var/jenkins_home : 도커 컨테이너의 데이터는 컨테이너가 종료되면 휘발된다. 따라서 호스트의 볼륨을 마운트 하면 컨테이너가 종료되어도 해당 데이터를 보존할 수 있다. 즉, 젠킨스 컨테이너의 /var/jenkin_home 디렉터리를 로컬의 ~/docker/jenkins 디렉토리에 마운트하고 데이터를 보존한다.

  • -v /var/run/docker.sock:/var/run/docker.sock : 호스트의 docker socket을 빌려 사용할 수 있다. 소켓 통신을 통해 에이전트컨테이너는 호스트의 daemon에 docker 명령을 전달한다. 이 방식은 DooD(Docker Out Of Docker)로 불리며 Docker측에서 DinD(Docker in Docker)보다 권장하는 방식이다. 즉, 해당 옵션으로 Jenkins 컨테이너 내에서도 Docker를 실행할 수 있다.

  • –name jenkins : 도커 컨테이너의 이름을 설정한다.

  • -u root : 컨테이너가 실행될 리눅스의 사용자 계정을 root 로 명시한다.

docker-ce-cli 설치

Jenkins Container가 Docker Socket에 연결되어있지만 Docker 명령어를 사용하려먼 연결된 Docker Engine에 명령을 내릴 수 있는 docker-ce-cli를 설치해야한다.

다음과 같은 명령어로 Jenkins Container에 직접 접속해 docker-ce-cli를 설치하자

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# jenkins bash 접속
$ docker exec -it jenkins /bin/bash

# jenkins container 내부에서
$ apt-get update
$ apt-get install \
    ca-certificates \
    curl \
    gnupg \
    lsb-release
$ mkdir -p /etc/apt/keyrings
$ curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg 
$ echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian \
  $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null
$ apt-get update
$ apt-get install docker-ce-cli

$ exit

이제 Jenkins Container 안에 docker-ce-cli가 설치되었다. 하지만 직접 bash에 접속해 docker-ce-cli를 설치하면 Jenkins Container를 종료하면 설치된 docker-ce-cli가 같이 삭제되어, 다시 Jenkins Container를 다시 켰을 때 재설치가 필요하다.

이를 방지하기위해 Dockerfile을 구성해 Jenkins Container가 시작될 때 자동적으로 docker-ce-cli가 설치되게 할 수 있다. 하지만 이번 포스트에서는 테스트용 컨테이너이기 때문에 Dockerfile을 따로 구성하지는 않겠다.

Jenkins 접속

위의 명령어를 실행하고 브라우저로 http://localhost:8090으로 접속하면 다음과 같이 Jenkins를 확인할 수 있다.

초기 비밀번호를 입력해야 하는데, 초기 비밀번호를 확인할 수 있는 방법은 두가지 방법이 있다.

  • docker logs로 확인
  • 직접 /var/jenkins_home/secrets/initialAdminPassword에 접근해서 확인

먼저 docker logs로 확인해 보자. 다음과 같은 명령어를 입력하면 수많은 별 사이에 초기 비밀번호를 확인할 수 있다.

1
$ docker logs jenkins

다음은 /var/jenkins_home/secrets/initialAdminPassword에 직접 접근해 확인해 보자. /var/jenkins_home~/docker/jenkins에 매핑해놓았기 때문에 다음과 같은 명령어로 확인할 수 있다.

1
$ cat ~/docker/jenkins/secrets/iniitalAdminPassword

위에서 얻은 초기 비밀번호를 입력하면 다음과 같은 화면을 확인할 수 있다.

특별하게 설치할 플러그인이 없으면 왼쪽 버튼을 눌러 추천된 플러그인을 설치하자.

플러그인 설치가 완료되고 접속할 admin 계정을 생성한다.

Jenkins Instance Configuraion을 설정한다. Jenkins Resource에서 절대값으로 사용할 URL 값을 설정하는 단계이다.

외부에서 접속할 수 있는 URL을 입력하는 것이 권장된다. 이미지는 http://localhost:8090으로 되어 있지만, 외부에서 접속할 수 있는 URL을 입력하자.

local에 설치했다면 ddns나 포트포워딩 설정을 마치면 외부에서 접속할 수 있게 된다. 설정을 해당 포스트의 범위를 넘어가므로 설정했다고 가정하고 진행하겠다.

그리고 만들어준 admin 계정으로 접속하면 다음과 같은 화면을 확인할 수 있다.

이로써 Jenkin를 Docker Container로 띄우고 실행하는 과정을 마쳤다.

댓글남기기