도커와 젠킨스를 이용한 CI/CD

10000DOO·2023년 2월 26일
1

YouHaveTo

목록 보기
6/12
post-thumbnail

📌 계기

프로젝트를 안드로이드 개발하는 팀원분들하고 같이 하다 보니 개발 과정에서 지속적으로 배포를 해야 됐다.
도커를 사용해서 배포를 하고 있었지만 매번 빌드하고 도커허브에 올리고 pull 해서 실행시키기 번거롭기 때문에 젠킨스를 사용해서 자동화를 해보기로 했다.

📌 구조


1. 로컬에서 작업을 마치면 github으로 push한다.
2. github webhook이 젠킨스에 전달되고 자동으로 build된다.
3. 빌드가 완료되면 기존의 스프링부트 도커 컨테이너와 이미지를 지우고 다시 도커 이미지를 만든다.
4. 만들어진 이미지를 실행시키면 배포 끝!

기존에는 도커 허브를 사용해서 로컬에서 도커 허브에 push 하고 우분투 서버에서 pull 받아 실행시키는 방식으로 진행했었으나 젠킨스를 사용하는 과정에서 서버를 한대로 구성하려다 보니 도커 허브를 사용하지 않고 바로 도커 이미지를 만드는 방식으로 진행했다.
서버 두대를 사용하면 한 서버에서는 젠킨스을 통해 빌드하고 도커 허브에 올린 후 배포 서버에서 도커 이미지를 내려받아 배포만을 진행하는 방식으로 구성된다.

📌 진행 과정

🔶 젠킨스 실행

서버에 도커가 설치되어 있기 때문에 바로 젠킨스를 설치한다.

$ docker pull jenkins/jenkins:lts

완료되면 젠킨스를 실행시킨다.

$ docker run -d -p 9090:8080 -v /jenkins:/var/jenkins -v /home/ubuntu/.ssh:/root/.ssh -v /var/run/docker.sock:/var/run/docker.sock --name jenkins -u root jenkins/jenkins:lts
-d = 백그라운드에서 실행
-p = 포트 설정
-v = 볼륨 마운트(컨테이너 안 디렉토리와 밖 디렉토리 연결)
--name = 컨테이너 이름
-u = 실행할 유저

정상적으로 실행됐다면

# 젠킨스 컨테이너 내부 쉘 진입
$ docker exec -it jenkins bash

# 젠킨스 컨테이너 내부에 도커 설치
$ apt-get update && \
apt-get -y install apt-transport-https \
     ca-certificates \
     curl \
     gnupg2 \
     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

# docker jenkins에서 host docker 접근 권한을 부여해주기 위해
$ groupadd -f docker
$ usermod -aG docker jenkins
$ chown root:docker /var/run/docker.sock

$ docker ps

라고 입력했을 때 실행중인 젠킨스 컨테이너에 대한 정보가 나오면서 STATUS에 UP이라고 나온다.

🔶 젠킨스 접속

브라우저를 열고 서버 접속 IP:9090 or 서버 접속 IP:설정한 포트 번호로 접속한다.
접속하면 아래와 같은 화면이 나온다.

// Container에 접속하지 않고 확인
$ docker logs jenkins

위의 명령어를 통해 비밀번호를 확인하고 입력하면 된다.

아래와 같은 화면이 나오면 Install suggested plugins를 선택하면 된다.


설치가 완료되면 계정을 만들어주면 된다.

계정을 만들고 다음으로 넘어가면 아래와 같은 화면이 나온다.(처음에는 가운데 보이는 YouHaveTo 항목이 없다.)

🔶 젠킨스 - github 연동

jenkins 컨테이너를 실행할 때 -v옵션을 통해 컨테이너 밖 /home/ubuntu/.ssh와 컨테이너 안 /root/.ssh를 연결시켰다. 따라서 컨테이너 밖에서 key를 만들어도 젠킨스에서 사용할 수 있다.

//키 생성
$ ssh-keygen
키를 생성했다면 해당 프로젝트 github repository로 이동해서 settings -> Deploy keys에 접속한다. 
Add를 눌러 키를 추가한다.(Title은 자유롭게 작성하면 된다. key는 방금 발급한 공개키를 적어주면 된다.)
//공개키 보기
$ cd /home/ubuntu/.ssh
$ cat id_rsa.pub

아래 화면처럼 키를 등록하면 성공이다.

이후 젠킨스 화면에서 왼쪽에 Jenkins관리 -> Manage Credentials로 접속한다.

이후 밑에 Stores scoped to Jenkins에서 Domains아래 있는 global 클릭 -> Add Credentials클릭

위의 화면에서 Kind를 **SSH Username with private key**로 바꿔준다.
ID와 Username에는 식별할 수 있는 아무 값이나 넣어주면 된다.
github와 연결할 것이라 ID에는 github Username에는 root를 적어주었다.
이후 Private Key에서 Add를 누른 후 아까 발급받은 키를 추가해준다.
$ cd /home/ubuntu/.ssh
$ cat id_rsa
-----BEGIN OPENSSH PRIVATE KEY-----
~~~~~~~~~~~~내용~~~~~~~~~~~~~~~~~~~~~
-----END OPENSSH PRIVATE KEY-----

등록 후 아래 화면처럼 등록된 것을 확인할 수 있다.

github에 푸시가 되면 자동으로 빌드와 배포가 이루어져야 하기 때문에 github webhook을 사용한다.
먼저 jenkins관리 -> Plugin Manager로 들어가서 아래와 같은 플러그인을 다운로드 한다.

이후 github settings -> webhook에 가서 추가한다.
Payload URL에는 [Jenkins Server URL]:[Jenkins Server 포트]/github-webhook/를넣고 Content type은 application/x-www-form-urlencoded으로 설정한다.

성공하면 이렇게 ✅표시가 나온다.

🔶 젠킨스 프로젝트 세팅

github으로부터 신호를 받으면 자동 빌드와 배포를 하기 위해 jenkins에서 프로젝트를 만든다(이름은 자유)


아래 사진 위치에 github repository 주소를 입력하면 된다.

git 설정에서는 Repository URL에는 github URL을 넣고 Credentials에 이전에 만들어둔 것을 넣으면 된다.
Branch Specifier에는 master 브랜치의 push event에만 동작하게 할 것이기 때문에 master로 두었다.


마지막으로 빌드와 배포를 실행할 명령어를 적어준다. 기존 동작중인 컨테이너와 이미지를 지우고 새로운 이미지를 통해 새로운 컨테이너를 동작시킨다.

이제 master 브랜치에 push event가 발생하면 프로젝트를 빌드하고 새로운 도커 이미지, 컨테이너로 교체, 배포한다.

🔶 젠킨스 자바 버전 세팅

 젠킨스는 기본적으로 자바11을 사용한다.
 하지만 지금 프로젝트는 스프링부트 3.0.1 버전으로 자바 17을 사용하고 있다.
 따라서 추가적으로 자바 버전 세팅을 해줘야된다.
 
 jenkins 관리 -> Global Tool Configuration로 들어가서
 Add JDK -> Add Installer에서 Extract *.zip/*.tar.gz를 선택한다.
 
 Download URL에는 JDK를 다운받을 링크,
 Subdirectory에는 JDK압축파일 해제했을 시 폴더 이름을 적는다.

한번 빌드 후 JDK가 설치 되었다면 아래 사진과 같이 자바 환경변수를 잡아준다.

종종 환경변수를 설정해도 안되는 경우가 있어 빌드 명령어를 작성할 때 상단에 자바 환경변수를 설정하는
export JAVA_HOME=/var/jenkins_home/tools/hudson.model.JDK/amazon-corretto-17.0.6.10.1-linux-x64/amazon-corretto-17.0.6.10.1-linux-x64
명령어를 추가했다.

🔶 젠킨스 - Slack 연동

먼저 슬랙에서 앱 추가에서 젠킨스를 추가한다.
이후 젠킨스 플러그인 관리에서 아래 사진과 같은 플러그인을 설치한다.

slack과 연동하기 위해 위에서처럼 credentials를 만들어야된다.
이번에는 kind에 Secret text,
Secret에는 앱 추가 시 제공되는 토큰 값,
ID는 자유롭게 적으면 된다.

jenkins 관리 -> 시스템 설정에서 슬랙의 워크스페이스 이름과 알림을 받을 채널을 적어주고 Credential에 방금 만든 것을 추가한다.

마지막으로 프로젝트 -> 구성 -> 빌드 후 조치 항목에서 사진처럼 해주면 된다.

젠킨스를 통해 CI/CD를 해보았다. 중간중간 계속 실패해서 그냥 하지 말까 하는 생각도 들었지만 막상 성공하니 어렵지 않은거 같다는 생각이 들었다.
그리고 배포 관련된 작업이 자동화 되니 편하고 개발에만 더 집중할 수 있게 된 것 같다.

📚 참고자료

https://hyeinisfree.tistory.com/23
https://learnote-dev.com/java/Spring-젠킨스-배포/
https://kitty-geno.tistory.com/153
https://zayson.tistory.com/entry/Jenkins-CICD-5-Jenkins와-Slack-연동-및-알림-받기

profile
iOS 개발자 지망생 https://github.com/10000DOO

0개의 댓글