Jenkins와 Docker를 이용한 CI/CD - 1편
인턴 기간 중 맡은 프로젝트에서 CI/CD를 구축하고 이를 팀원들에게 공유하기 전, 스스로 개념과 과정을 익히고자 블로그에 관련 글을 포스팅 하고자 합니다😃
CI/CD 구축을 위한 환경

제가 구축하려는 시스템 아키텍쳐입니다. 환경은 bitbucket과 AWS Ec2 환경에서 진행하였습니다.
1. Dokcer 설치(Jenkins 서버/CI 서버)
CI Server에서 다음과 같이 Docker를 설치해줍니다.
// 모든 패키지 업데이트
$sudo yum update -y
// Dokcer 설치
$sudo yum install docker -y
위 명령어를 통해 Docker를 설치하셨다면
//docker 버전 확인
$docker -v
버전을 확인해 docker가 잘 설치되어있는 지 확인해주세요!

그 후에 docker 실행하고, docker를 관리하는 명단에 유저를 추가해줍시다.
//docker 실행
sudo service docker start
//docker 그룹에 ec2-user 추가
sudo usermod -aG docker ec2-user
그룹추가 명령어를 입력했으면 재시작하여, 적용시켜줍시다.
docker 설치가 완료되었으면, docker에 로그인을 하여 docker가 제대로 동작하는 지 확인해보실 수 있습니다.
//docker login
$docker login

저의 경우에는 이미 로그인을 해서, 저장된 자격증명으로 로그인 과정을 생략하게되었습니다.
로그인을 처음하시는 분이라면, dockerhub에서 만든 계정의 아이디와 패스워드를 입력하여 로그인하시면 됩니다.
Docker Hub Container Image Library | App Containerization
Build and Ship any Application Anywhere Docker Hub is the world's easiest way to create, manage, and deliver your team's container applications. Create your account Signing up for Docker is fast and free. Continue with GoogleContinue with GitHubContinue wi
hub.docker.com
젠킨스 설치 방법은 되게 번거로운 과정이 많다. jdk 설정, jenkins package를 내려받고, 설치하고 .. 등등 이러한 불편한 과정을 생략하고자 단지 단순하게 Docker를 통해 젠킨스 이미지를 사용합니다.
2.Docker로 젠킨스 설치하기
저 같은 경우는 도커로 젠킨스 이미지를 내려받아 사용합니다. 이에 따라 젠킨스가 Dokcer의 명령을 실행할 수 있게 jenkins안에 docker를 설치해서 사용하거나 호스트 Docker(젠킨스를 관리하는 Docker라고 생각하시면 됩니다)의 명령어를 같이 쓰게 하는 경우를 선택해야하는데요. 이러한 과정은 크게 DinD(Docker in Docker)와 DooD(Docker out of Docker)로 나뉩니다.
저희가 쓸 방법으로는 DooD인데, DooD에 대한 젠킨스 이미지를 만들어줘야합니다.
2-1. Custom Jenkins DockerFile
현재 접속해있는 터미널 위치에서 아래처럼 Dockfile을 생성해줍니다.
//Dockerfile 생성
sudo vim Dockerfile
//Dockerfile 작성 시작 - bash를 Jenkins 이미지로
FROM jenkins/jenkins:jdk11
//도커를 실행하기 위한 root 계정으로 전환
USER root
//도커 설치(도커내 도커)
COPY docker_install.sh /docker_install.sh
RUN chmod +x /docker_install.sh
RUN /docker_install.sh
//도커 그룹에 사용자 추가
RUN usermod -aG docker jenkins
USER jenkins
2.2 도커 내 도커 설치 파일(docker_install.sh)
이 파일도 마찬가지로 위 DockerFile을 생성한 디렉토리에서 생성해줍니다.
//docker_install.sh 파일 생성
sudo vim docker_install.sh
//docker_install.sh 파일 작성 시작
#!/bin/sh
apt-get update && \
apt-get -y install apt-transport-https \
ca-certificates \
curl \
gnupg2 \
zip \
unzip \
software-properties-common && \
curl -fsSL https://download.docker.com/linux/$(. /etc/os-release; echo "$ID")/gpg > /tmp/dkey; apt-key add /tmp/dkey && \
add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/$(. /etc/os-release; echo "$ID") \
$(lsb_release -cs) \
stable" && \
apt-get update && \
apt-get -y install docker-ce
2.3 파일 권한 변경
두 파일을 같은 디렉토리내에 만들었으면, 이 이미지를 빌드해야하는데, 그 전에 해야할 일이 있습니다.
이 두 파일로 만들어진 도커의 이미지는 host 도커의 docker.sock을 빌려서 사용하는데 host의 docker.sock의 파일 권한을 변경하여 다른 사용자도 접근 가능하게 만들어줘야 합니다.
//파일 권한 변경
sudo chmod 666 /var/run/docker.sock
2.4 도커 이미지 빌드 및 실행
이제 파일권한을 변경하였고, 이를 토대로 도커 젠킨스 이미지를 빌드하면됩니다.
//Dockerfile 빌드
docker build -t jenkins .
이제 마지막으로 만든 jenkins 이미지를 컨테이너로 실행시키면 됩니다.
sudo docker run -d --name jenkins \
-v /var/run/docker.sock:/var/run/docker.sock \
-p 8090:8080 \
-e TZ=Asia/Seoul \
jenkins
각 명령어에 대해 설명하면,
-d : 백그라운드 실행
-v : docker.sock을 사용하게 하는 부분(즉, 호스트 도커로 젠킨스 컨테이너 안의 도커를 사용하겠다는 뜻)
-p : 호스트 포트와 내부 포트 간의 매핑
이제 젠킨스로 접속해보시죠. 사용한 EC2의 public Ip : 8090으로 접속해주면됩니다.
3. Jenkins 환경설정

처음 화면에서 비밀번호를 입력해야하는데 해당 초기 비밀번호는 아래 명령어를 통해 확인할 수 있다.
//jenkins 컨테이너에 접속
$sudo docker exec -it jenkins bash
//초기 관리자 키 확인
$cat /var/jenkins_home/secrets/initialAdminPassword
확인한 비밀번호를 입력하고 Continue를 누르면 다음과 같은 화면이 나온다. 해당 화면은 플러그인을 설치할 때, jenkins쪽에서 제안한 플러그인을 설치할건지, 사용자가 직접 골라서 설치할건지 고르는 것이다. 저는 제안해주는 플러그인을 설치하겠습니다.

제안된 플러그인 설치를 누르면 아래와 같은 화면이 뜨는데, 다 설치될 때 까지 기달려주면 됩니다.

설치가 다 완료되면 유저 정보를 입력해주자.

유저 정보를 입력해주었으면

저의 경우 http://public_ip:8090/으로 유지해줬습니다.
이제 Jenkins의 웹 인터페이스를 통해 GUI로 CI/CD를 구축할 수 있게되었습니다.

다음포스트에서는 jenkins를 통해 CI/CD를 구축해보겠습니다.