개발놀이터

CI / CD 자동화 (2) : Jenkins 시작하기 본문

배포/CI , CD

CI / CD 자동화 (2) : Jenkins 시작하기

마늘냄새폴폴 2023. 6. 14. 17:05

앞선 포스팅과 이어지는 내용입니다. 

https://coding-review.tistory.com/413

 

CI / CD 자동화 (1) : Jenkins vs Github Action

이전 포스팅을 보고 오시면 더 이해하기 쉽습니다! https://coding-review.tistory.com/410 Docker + Nginx를 이용해 스프링 프로젝트 무중단 배포하기 : 과정 저번 포스팅에선 docker + nginx를 가지고 무중단 배포

coding-review.tistory.com

 

저는 EC2 환경에서 Linux 22.04 LTS 버전을 이용해 Jenkins를 구축했습니다. 이 점 참고하시기 바랍니다. 

 

Jenkins를 우분투 환경에서 시작하는 방법에는 두가지가 있습니다. 

 

  1. 직접 설치
  2. docker를 이용해 설치

 

Jenkins를 직접 우분투에 설치하면 방화벽 설정을 비롯해 여러가지 설정을 만져줘야 하기 때문에 굉장히 귀찮은데요. 

 

그래서 저는 아무런 설정도 할 필요가 없는 도커를 이용해서 Jenkins를 시작했습니다. 도커를 이용하면 사전 준비가 상대적으로 편해서 진입장벽이 굉장히 낮아지는 특징이 있습니다. 

 

그럼 이제 본격적으로 시작해보겠습니다. 

 

Jenkins 시작하기

1. 도커, 도커 컴포즈 다운

그럼 먼저 도커와 도커 컴포즈를 다운받습니다. 

 

$ apt-get update
$ apt-get install docker
$ apt-get install docker-compose

 

2. Jenkins 이미지 내려받기

$ docker pull jenkins/jenkins:lts

 

이미지를 다운 받고 이제 도커 컴포즈를 작성해야겠죠. 

 

3. docker-compose.yml 파일 작성

version: "3.8"
services:
  jenkins:
    image: jenkins/jenkins:lts
    container_name: jenkins_container
    user: root
    volumes:
      - ./volumes:/var/jenkins_home
      - /home/ubuntu/project:/var/jenkins_home/project/deploy
      - /home/ubuntu/project/capston:/var/jenkins_home/project/capston
      - /var/run/docker.sock:/var/run/docker.sock
    ports:
      - 8082:8080

제가 작성한 도커 컴포즈입니다. 여기서 가장 중요한 것이 바로 마운트하는 volumes 부분입니다. 

 

  • ./volumes:/var/jenkins_home : 이 코드는 혹여 Jenkins 컨테이너가 혹시모를 상황에 죽어버려도 다시 docker-compose를 이용해 띄울 때 설정 정보를 그대로 가져가기 위해서 적는 코드입니다. 
  • /home/ubuntu/project:/var/jenkins_home/project/deploy : 왼쪽에 있는 /home/ubuntu/project는 제 디렉토리인데요. 이 디렉토리에는 실제로 실행해야하는 make-docker-compose.sh 파일이나 deploy.sh 그리고 각종 docker-compose 파일들이 들어있습니다. Jenkins를 띄운 다음에 파이프라인을 작성할 때 반드시 필요한 디렉토리이죠. 
  • /home/ubuntu/project/capston:/var/jenkins_home/project/capston : 위의 명령어와 같습니다. 
  • /var/run/docker.sock:/var/run/docker.sock : 이것도 만만치않게 중요한 코드입니다. 지금 우리는 도커로 Jenkins를 띄워서 사용하고 있죠. 그리고 파이프라인은 Jenkins 컨테이너 안에서 docker-compose 나 docker 명령어를 실행합니다. 

    그런데 문제가 있습니다. 컨테이너 안에서 docker-compose를 실행하면 컨테이너 안에 컨테이너가 또 만들어질 것 아니에요? 이렇게 되면 문제가 발생할 수 있습니다. 

    그래서 docker는 컨테이너 내부에서 소켓을 열어서 컨테이너 외부에 있는 Docker와 소통하는 방법을 제공합니다. 그게 바로 이 방식이구요. 이 방식을 DooD (Dock out of Docker) 라고 합니다. 
  • ports : 마지막으로 포트인데 제가 지금 프로젝트를 블루 버전을 8080 그린 버전을 8081로 쓰고 있어서 Jenkins는 8082로 설정했습니다. 

 

이렇게 도커 컴포즈를 작성하고 Jenkins 컨테이너를 띄워보겠습니다. 

 

$ docker-compose -f ./docker-compose-jenkins.yml up -d

 

정상적으로 컨테이너가 띄워졌다면 EC2 퍼블릭 IP:8082 를 주소창에 치고 들어가면 이와 같은 모습이 나옵니다. 

 

이는 Jenkins를 사용하기 위해서 초기 비밀번호를 입력하라는 뜻입니다. 암호를 푸는 방법은 두가지입니다. 

 

  1. 로그를 확인해서 들어가기 (제일 간단함)
  2. 컨테이너 내부에서 확인하기 (조금 귀찮)

두가지 모두 소개해 드릴건데 개인적으로 1번을 추천합니다. 가장간단하거든요. 

 

$ docker container logs ${컨테이너 이름} 
# 저는 컨테이너 이름이 jenkins_container여서 jenkins_container를 치면 됩니다. 
# 컨테이너 이름은 우리가 아까 만들었던 docker-compose에 명시할 수 있습니다. 
# 혹은 docker ps 명령어를 치고 나와있는 컨테이너 이름을 확인하시거나 컨테이너 ID를 입력하시면 됩니다.

 

 

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 부분이 암호입니다. 저부분 그대로 복사하셔서 입력하시면 됩니다. 

 

두 번째 방법은 컨테이너 내부로 들어가는 방법인데요. 

 

먼저 컨테이너 내부로 들어가줍니다. 

 

$ docker exec -it jenkins_container bash
$ cat /var/jenkins_home/secrets/initialAdminPassword

이렇게 치고 나온 결과를 복사하시면 됩니다. 

 

그럼 이제 Jenkins에 들어갈 수 있습니다. 

 

 

Jenkins에 들어가면 이런 창이 뜨는데 Install suggested plugins 를 클릭해줍니다. Jenkins에서 추천해주는 플러그인을 자동으로 다운받을 수 있습니다. 

 

이제 기본 설정을 해봅시다.

4. Jenkins 기본 설정

우리는 우선 AWS의 private key와 git hub을 credential로 등록할겁니다. 그러기위해선 아래 보이는 스샷처럼 Jenkins 관리를 들어가줍니다. 

 

Scope : Global로 냅두세요. 

ID : 이 credential의 이름입니다. 

Description : 써도 되고 안써도 되는데 저는 간단하게 설명을 써놨습니다. ssh credential 이라고 적었습니다. 

Username : Jenkins에서 만들라고 하는 Username을 적었습니다. 저는 garlicpollpoll 이었구요. 

 

Enter directly를 누르고 Add 버튼을 누릅니다. 

 

그럼 아래 입력창이 뜨는데 여기다가 aws ssh private key를 넣을겁니다. 

 

EC2 콘솔로 돌아와서요. 아래의 명령어를 작성합니다. 

 

$ cat /home/ubuntu/.ssh/id_rsa

아마 github와 연동할 때 ssh 키를 만들었다면 존재하겠지만 없으신 분들은 아래와 같이 하시면 됩니다. 

 

$ ssh-keygen -t rsa

패스워드 입력하라고 하면 원하는 패스워드 입력하시고 엔터 치시면 위와같은 디렉토리에 저장이됩니다. 

 

cat 명령어로 쳐서 나온 어마어마하게 긴 문자열을 반드시 처음부터 끝까지 복사해줍니다. 이 말은 BEGIN OPENSSH PRIVATE KEY 라고 써있는 부분 전부 다를 의미합니다. 

 

마지막으로 Passphrase는 생략하고 create 하시면 하나 완성!

 

이제 Github도 만들어보죠. 

 

똑같이 Add Credential하시고 이번엔 SSH 가 아니고 Username with password를 누르셔야합니다. 

 

Username : github 아이디를 적으시면 됩니다. 

Password : github 패스워드 적으시면 됩니다. 

ID : 이 Credential의 고유 ID입니다. 저는 Github Credential이라고 적었습니다. 

Description : 적으셔도 되고 안적으셔도 됩니다. 저는 Github이라고 적었습니다. 

 

자 이제 모든 준비가 끝났습니다. 

 

엄청 길었습니다. 긴 글 읽어주셔서 감사합니다. 다음 포스팅에선 Jenkins를 이용해 파이프라인을 만드는 방법에 대해서 알아보죠!

 

https://coding-review.tistory.com/415

 

CI / CD 자동화 (3) : Jenkins 파이프라인 작성하기

이전 포스팅과 이어집니다. https://coding-review.tistory.com/414 CI / CD 자동화 (2) : Jenkins 시작하기 앞선 포스팅과 이어지는 내용입니다. https://coding-review.tistory.com/413 CI / CD 자동화 (1) : Jenkins vs Github Action

coding-review.tistory.com