[DevOps] Jenkins, Docker로 CI/CD 파이프라인 구축하기 (1)

이창윤·2024년 1월 8일
0


프로젝트를 진행하면서 간단하게 CI/CD를 구축해야했었다.
CI/CD의 존재를 알게 된 후 Jenkins라는 도구를 꼭 사용해보고 싶었다. 그래서 여러 블로그를 참고하며 내게 익숙한 docker를 사용하는 방법을 찾아 현재 진행 중인 프로젝트에 적용해 보았다.

구성 요소

  • Jenkins 서버
  • 개발 서버 (Spring Boot 서버)

Jenkins 서버 작업

Jenkins 전용 EC2 인스턴스 생성

Docker 설치

패키지 목록 업데이트
sudo apt update

패키지 설치
sudo apt install apt-transport-https ca-certificates curl gnupg-agent software-properties-common

Docker 공식 GPG키 추가
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

Docker 공식 apt 저장소 추가
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

한번 더 업데이트
sudo apt update

Docker 설치
sudo apt install docker-ce docker-ce-cli containerd.io

추후 모든 Docker 명령어 사용 시 sudo(관리자 권한으로 명령어 실행)가 필요없어도 되도록 설정
후 재시작
sudo usermod -aG docker $USER

Swap Memory 설정 (프리티어)

EC2 인스턴스를 프리티어로 생성한 경우 기본 RAM이 1GB밖에 안되기 때문에 CPU 과부하는 불가피하다..

Swap 공간을 부여할 때 권장 공간은 기존 RAM 용량의 두배(2GB)이다.
따라서 2G만큼을 swap 메모리로 설정한다.
sudo fallocate -l 2G /swapfile

swapfile에 대한 권한 수정
sudo chmod 600 /swapfile

swap 메모리 활성화

sudo mkswap /swapfile
sudo swapon /swapfile

확인하기
free -h 명령어로 확인해보면 Swap 메모리가 2GB 할당 된 것을 확인할 수 있다.

재부팅 시 설정이 초기화 되지 않도록 설정 파일에 한줄을 추가한다.

sudo vi /etc/fstab 
// 설정 파일 편집기로 이동

/swapfile swap swap defaults 0 0
// i로 입력 활성화-> 라인 추가 -> esc로 비활성화 -> :wq로 저장 후 종료

Jenkins 설치 및 실행하기

Docker로 Jenkins 이미지 파일 내려받기
docker pull jenkins/jenkins:lts

이미지 확인하기
docker images

Jenkins 컨테이너 실행 (Jenkins 컨테이너 내부에서 Docker를 실행해야 하기 때문에 옵션을 추가해 Docker의 소켓 파일을 마운트한다)

docker run -d -p 8080:8080 -p 50000:50000 -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

컨테이너 확인하기 (이름이 jenkins인 컨테이너가 생성됨)
docker ps

Jenkins 접속

인터넷 브라우저에서 [EC2 인스턴스의 Public IPv4 주소] :8080으로 접속한다.
다음 화면이 뜨는데, 관리자 비밀번호를 입력해야한다.
Jenkins 서버에 접속해서 로그를 확인해보면 비밀번호가 나온다.
docker logs jenkins

플러그인 - Suggested 선택

자동으로 플러그인이 설치되면 계정을 생성한다. Jenkins 메인 대시보드 페이지가 나오면 성공!

Github와 연동

Github Deploy Key를 등록한다.
CI/CD를 적용할 Repository -> Settings -> Deploy Keys -> Add deploy key
Key 칸에는 ssh key의 public key값을 입력하면 된다.

Jenkins 인스턴스에 접속 후 ssh키를 다음 명령어로 생성하면 Jenkins 컨테이너와 자동으로 연결된다.
ssh-keygen
전부 enter를 입력해 기본값으로 설정하면 생성이 완료된다.
/home/ubuntu/.ssh/id_rsa.pub 파일에서 public key를 확인할 수 있다.
cat /home/ubuntu/.ssh/id_rsa.pub

Github Deploy Key가 제대로 등록된 것을 확인한 다음
Jenkins 관리 -> Credentials -> global -> Add Credentials 순으로 들어간다.

아래와 같이 입력한다.

  • Kind: SSH Username with private key
  • ID: 알아보기 쉽게
  • Username: root (기본값)
  • Private Key -> Enter directly 선택
  • /home/ubuntu/.ssh/id_rsa 파일에서 private key 복사 후 붙여넣기
    cat /home/ubuntu/.ssh/id_rsa

Credentials가 추가된 것을 확인할 수 있다.

필요한 플러그인 추가

Jenkins 관리 -> Plugins 이동
Available plugins ->
docker 검색 -> Docker, Docker Pipeline 플러그인 두개 선택
ssh agent 검색 -> SSH Agent 플러그인 선택 후 설치

설치 화면 하단에 재시작 옵션을 선택하면 플러그인 설치 이후 자동으로 재시작을 하는 줄 알았는데
docker restart jenkins
컨테이너가 종료되어있어서 재시작을 직접 해주었다.

Installed plugins에서 확인할 수 있다.

이후 DockerHub Credentials 추가하기
마찬가지로 Jenkins 관리 -> Credentials -> global -> Add credentials 이동 후 아래와 같이 작성한다.

  • Kind: Username with password
  • Username: DockerHub 계정 ID
  • Password: DockerHub 계정 비밀번호

Jenkins Pipeline에서 Docker 명령어를 사용할 수 있도록 Jenkins 컨테이너 내부에 Docker를 설치해야한다.
Jenkins 실행 시 추가 옵션으로 Docker의 소켓 파일을 연결해놨기 때문에
docker exec -it jenkins bash

위 명령어로 Jenkins 컨테이너에 접속 후 같은 방법으로 Docker를 설치하면 된다.
다만 sudo와 같은 명령어가 설치되어 있지 않아 sudo를 제외하고 모든 명령어를 실행했다.


그러던 중 오류가 발생했는데, 해당 명령어에서 lsb_release -cs에 자동으로 할당된 codename의 Release 버전이 존재하지 않는다는 오류였다.
add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

그래서 공식 문서를 참고해 설정 명령어를 실행하고 아래의 명령어로 설치를 완료했다.
apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

제대로 설치 되었는지 확인한 결과 - Docker 명령어를 Jenkins 컨테이너 내부에서 사용할 수 있게 되었다.

(선택) Slack Notification 플러그인 설치

Jenkins 파이프라인을 성공적으로 완료하면 Slack을 통해 알림을 받고싶어서 추가 플러그인을 설치했다.
Jenkins 관리 -> Plugins -> Available plugins에서 slack notification 검색 후 설치 & 재시작

Slack에서 원하는 워크스페이스에 새로운 채널을 생성한다.

이후 사이드바에서 앱 클릭 -> 앱 추가

Jenkins를 검색하고 구성을 클릭하면 웹 페이지로 연결이 되고, Slack에 추가버튼을 클릭한다.
새로 생성한 채널을 선택하고 앱을 추가한다.
설정 지침이 나오는데, 3단계의 팀 하위 도메인과 통합 토큰 자격 증명 ID 두개를 복사해놓는다.

Slack Credentials 등록
Jenkins 관리 -> Credentials -> global -> Add Credentials 이동 후 아래와 같이 작성한다.

  • Kind: Secret Text
  • Secret: 위에서 복사해둔 통합 토큰 자격 증명 ID
  • ID: 알아보기 쉬운 ID

마지막으로 Jenkins 관리 -> System 제일 하단에서 Slack 설정 추가

  • Workspace: 팀 하위 도메인 정보
  • Credential: 위에서 생성한 Slack Credentials 선택
  • Default channel / member id: 알림을 받고싶은 채널명

Test Connection으로 Success가 뜨는지 확인 후 저장

Spring Boot 서버 SSH 연결 설정

Jenkins 관리 -> Credentials -> global -> Add credentials 이동 후 아래와 같이 작성한다.

  • Kind: SSH Username with private key
  • ID: 알아보기 쉬운 ID
  • Username: root(기본값)
  • Private Key -> Enter directly 체크 -> Jenkins 서버의 private key 입력
    cat /home/ubuntu/.ssh/id_rsa

    사실상 위의 Github Credentials와 동일하지만 id를 구분하여 사용하기 위해 추가했다.

Spring Boot 서버 작업

Spring Boot 서버에 접속한 다음 아래 명령어로 Jenkins 서버의 public key를 추가해 줘야 Jenkins 서버에서 원격으로 Spring Boot 서버에서 명령어를 실행할 권한이 생긴다.
vi /home/ubuntu/.ssh/authorized_keys
(public key 확인)
cat /home/ubuntu/.ssh/id_rsa.pub

그리고 Docker 명령어를 통해 빌드된 이미지를 불러오고 실행하기 위한 환경을 만들어야 한다.
위의 명령어를 참고해 같은 방법으로 Docker를 설치하면 된다.

Pipeline 생성 및 Script 작성

참고

0개의 댓글