[CI/CD] Jenkins로 CI/CD 구축하기

기존에 GitHub Action과 aws(S3, CodeDeploy)를 이용해서 CI/CD를 구현해보았고 현재 가장 많이 사용하고 있는 CI/CD 툴인 젠킨스로는 구현한 경험이 없어 젠킨스로 구축한 과정을 담아보았다.

Item

젠킨스로 CI/CD를 구현하기 위해서는 하나의 Item을 생성해야 한다. 젠킨스 서버에 여러개의 Item을 생성 할 수 있고 해당 item들은 개발자가 설정한 대로 개별적으로 동작한다. 아이템을 만드는 방법에는 FreeStylePipeline이 존재한다.

FreeStyle vs Pipeline

FreeStyle

  • 장점
    • 웹 기반의 GUI를 통해 쉽게 구축이 가능하다.
  • 단점
    • CI/CD 과정을 콘솔을 통해서 확인이 가능하다.
    • 각 과정을 한번에 보기 힘들다.
    • CI 과정을 변경하기 위해서는 로그인해서 프리스타일 잡을 변경해야한다.

Pipeline

  • 장점
    • 하나의 스크립트 파일로 CI/CD를 구현할 수 있다.
    • step마다의 속도를 볼 수 있다.

Pipeline으로 구현하는게 전체 흐름을 파악하기 좋을 것 같아 Pipeline 구축 내용을 다루겠습니다.

Jenkins로 구축시작

아래와 같은 다이어 그램으로 CI/CD를 구축할 생각입니다. 배포서버는 EC2를 활용하고, Jenkins 서버는 집에서 동작하는 Ubuntu Server를 활용할 예정입니다.

Ubuntu에 Jenkins 설치

1. wget 명령을 사용하여 jenkins 리포지토리의 GPG 키를 가져옵니다

wget -q -O - https://pkg.jenkins.io/debian/jenkins.io.key | sudo apt-key add -

2. jenkins 리포지토리를 시스템에 추가합니다.

sudo sh -c 'echo deb http://pkg.jenkins.io/debian-stable binary/ > /etc/apt/sources.list.d/jenkins.list'

3. 패키지 목록을 업데이트 후에 jenkins를 설치합니다.

sudo apt update
sudo apt install jenkins

4. 제대로 설치되었는지 확인하기 위해 상태를 확인합니다.

systemctl status jenkins

5. jenkins는 8080 포트에 실행되기에 개발 PC에서 접근하도록 방화벽을 열어줍니다.

sudo firewall-cmd --zone=public --add-port=8080/tcp --permanent
sudo firewall-cmd --reload

Jenkins 접속 후 설정

1. 8080포트를 이용해 jenkins 서버에 접속 후 이용권한 등록

아래의 화면에 암호를 입력해야하는데 cat /var/lib/jenkins/secrets/initialAdminPassword을 통해 암호를 확인후 입력해줍니다.

2. 젠킨스 플러그인 설치

Install suggested plugins를 눌러서 젠킨스에 필요한 프러그인을 다운 받습니다.

3. 계정 생성

CI 구축하기

item 생성

아이템 이름을 설정하고 pipeline으로 구축할거기에 pipeline을 선택하면 됩니다.

Pipeline 스크립트 작성

pipeline {
    agent any
    stages {
        stage('Git Clone') {
            steps {
                git branch: 'main', url: 'https://github.com/pyjhoop/jenkins-test.git'
            }
        }
        stage('BE-Build') {
            steps {
                sh 'chmod +x gradlew'
                sh "./gradlew clean build"
            }
        }
    }
}

CI 테스트

CI가 제대로 구축되었는지 확인하기 위해 Build Now를 클릭해 GitHub에서 레파지토리를 제대로 클론하는지, 해당 레파지토리를 제대로 빌드하는지 테스트 진행.

CD 구축

CI에 대한 구축이 완료되었으니 CD를 구축하겠습니다.

1. SSH Plugin 설치

젠킨스 서버에서 EC2 서버로 빌드된 파일을 전달하기 위해 SSH를 이용합니다.
📌 Jenkins 관리 -> Plugin Manager -> 설치 가능 앱 -> SSH Agent 설치

2. AWS 접속을 위한 접속 키 등록

📌 Jenkins 관리 -> Credentials -> Add Credentials 에 입장 후
key에 add를 누른 뒤에 ec2 에서 사용하는 pem의 값을 넣으면 됩니다.

-----BEGIN RSA PRIVATE KEY-----
key 내용
-----END RSA PRIVATE KEY-----

위와 같은 형태로 키를 입력해줘야 합니다.

3. 스크립트 재작성

xxx.xxx네 CE2 IP 주소를 입력하면 됩니다.

pipeline {
    agent any

    stages {
        stage('Git Clone') {
            steps {
                git branch: 'main', url: 'https://github.com/pyjhoop/jenkins-test.git'
            }
        }
        stage('BE-Build') {
            steps {

                sh 'chmod +x gradlew'

                sh "./gradlew clean build"

            }
        }
        stage('Deploy') {
            steps {
                sshagent(credentials: ['aws_key']) {
                    sh '''
                        ssh -o StrictHostKeyChecking=no ubuntu@xxx.xxx uptime
                        scp /var/lib/jenkins/workspace/jenkins-test/build/libs/test-1.0-SNAPSHOT.jar ubuntu@xxx.xxx:/home/ubuntu/hello
                        ssh ubuntu@xxx.xxx chmod +x deploy.sh
                        ssh ubuntu@xxx.xxx /home/ubuntu/deploy.sh
                    '''
                }
            }
        }
    }
}

4. 배포파일 작성하기

#!/bin/bash
pid=$(pgrep -f momo)
if [ -n "${pid}" ]
then
        kill -15 ${pid}
        echo kill process ${pid}
else
        echo no process
fi
chmod +x ./hello/test-1.0-SNAPSHOT.jar
nohup java -jar ./hello/test-1.0-SNAPSHOT.jar >> application.log 2> /dev/null &

Webhook 등록하기

이제까지 CI/CD를 구축했지만 git에 새로운 코드가 생기거나 수정이될때 자동적으로 CI/CD가 되도록 Webhook을 설정해야 합니다.
📌 {앞서 만든 파이프라인 아이템}접속 → 구성 → Build Triggers → GitHub hook trigger for GITScm polling 활성화

깃허브 레파지토리에 들어가서 📌 Setting → Webhook → Add webhook

마무리

모든 설정은 끝났고 이제 git main에 push가 발생하면 Webhook을 통해 jenkins에 전달이 되고 CI/CD가 자동적으로 실행이 됩니다.