[ CI / CD ] Ubuntu Jenkins 파이프라인 구축

5tr1ker·2023년 4월 11일
0

CI/CD

목록 보기
2/4
post-thumbnail

해당 포스팅에서는 AWS EC2 서버를 기준으로 하고 , 만약 AWS EC2 서버가 구축되어 있지 않다면 해당 포스팅 을 먼저 참고해주세요.

또한 CI / CD 및 Jenkins 에 대한 기본 지식을 요구하므로 해당 포스팅 을 통해 학습할 수 있습니다.

Jenkins 설치

Jenkins를 설치하기 전에 Jenkins 에서는 JDK 8 이상의 자바를 필요로 합니다. 자바 설치는 해당 링크 를 통해 설치할 수 있습니다.

  1. 젠킨스 Keys 설치

    sudo wget -q -O - https://pkg.jenkins.io/debian/jenkins.io.key | sudo apt-key add -
    echo deb http://pkg.jenkins.io/debian-stable binary/ | sudo tee /etc/apt/sources.list.d/jenkins.list'

  2. key 등록

    sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys FCEF32E745F2C3D5

  3. apt-get 업데이트

    sudo apt-get update

  4. 젠킨스 설치

    sudo apt-get install jenkins

해당 그림과 같은 오류가 발생하면 다음의 명령어를 입력합니다.

sudo vi /etc/apt/sources.list

i 를 눌러 입력 모드를 전환 후 밑의 내용을 하단에 적어줍니다.

deb https://pkg.jenkins.io/debian-stable binary/

다음 명령어를 입력해줍니다.

sudo apt-get update
sudo apt-get install jenkins

그럼에도 오류가 지속된다면 Jenkins 공식 홈페이지에 나와있는 Debian jenkins Packages 설치 절차를 활용해봅니다.

젠킨스 실행

sudo systemctl daemon-reload
sudo systemctl start jenkins
sudo systemctl status jenkins

참고된 블로그 : https://abbo.tistory.com/184
https://hyunmin1906.tistory.com/272

젠킨스 초기 설정

Jenkins 초기 비밀번호 확인

sudo cat /var/lib/jenkins/secrets/initialAdminPassword

Jenkins 사이트로 이동 후 11번에서 확인한 비밀번호 입력

젠킨스 플로그인 설치

젠킨스 포트번호 변경

젠킨스의 기본 포트번호는 8080 이지만 SpringBoot 포트와 겹칠 수 있어 포트를 바꿔야 하는 일이 있을 수 있습니다.

Jenkins Version 2.335 이전
sudo vi /etc/default/jenkins
Jenkins Version 2.335 이후
sudo vi /lib/systemd/system/jenkins.service

해당 명령어를 통해 해당 파일의 HTTP_PORT 를 수정하고 재시작을 해줍니다.
만약 HTTP_PORT가 없다면 Environment="JENKINS_PORT= 8080" 을 변경해 줍니다.

만약 HTTP_PORT를 수정했음에도 포트가 변경되지 않는다면 jenkins.service를 수정해서 해결할 수 있습니다.

sudo chmod 777 /usr/lib/systemd/system/jenkins.service
sudo vi /usr/lib/systemd/system/jenkins.service
sudo chmod 444 /usr/lib/systemd/system/jenkins.service

vim을 통해 파일로 들어가 Environment="JENKINS_PORT=8080" 부분을 포트로 바꿔주시면 됩니다. 포트 변경 뒤에는 권한을 readOnly로 변경합니다.

데몬 프로세스 & 젠킨스 재시작

sudo systemctl daemon-reload
sudo service jenkins restart

WebHook 연결

웹훅은 깃허브 레포지토리에 변화가 발생한다면 깃허브에서 젠킨스로 이벤트가 생겼다고 알람을 보내야 합니다. 알려줄 때 사용하는 그 경로를 설정하는 작업을 깃허브 레포지토리에서 해주어여 합니다. 하단의 참고 블로그의 2. Github Repository Webhook 설정의 절차를 따릅니다.

참고 블로그 : 블로그

파이프 라인 스크립트 예제

pipeline {
    agent any

    stages {
        stage('git Clone') {
            steps {
                git branch: '브랜치 명', url: '깃 허브 주소'
                echo 'Clone Success'
            }
        }
        
        stage('Build & Test') {
            steps {
                sh '''
                    chmod +x gradlew
                    ./gradlew clean test bootJar
                '''
                echo 'Build and Test Success!'
            }
            
            post {
                success {
                    echo 'success deploying laika spring project'
                }
                failure {
                    error 'fail deploying laika spring project' // exit pipeline
                }
            }
        }
        
        stage('Deploy') {
            steps {
                dir('build/libs'){
                    sh '''
                    CURRENT_PID=$(ps -ef | grep java | grep comma | grep -v nohup | awk '{print $2}')
                    if [ -z ${CURRENT_PID} ] ; then
                        echo "> 현재 구동중인 애플리케이션이 없으므로 종료하지 않습니다."
                    else
                        echo "> 실행중인 어플리케이션 : $CURRENT_PID"
                        sudo kill -9 $CURRENT_PID
                        sleep 10
                    fi
                    
                    echo "> comma 배포 작업 시작"
                    JENKINS_NODE_COOKIE=dontKillMe nohup java -jar  comma-0.0.1-SNAPSHOT.jar &
                    '''
                }
            }
        }
    }
}
  • 코드 설명
    현재 실행중인 프로세스 중에 comma 와 java가 포함되어 있고 nohup인 상태인 프로세스의 2번째 출력값 ( PID 값 ) 을 가져옵니다.

    ps -ef | grep java | grep comma | grep -v nohup | awk '{print $2}'

git 저장소에서 해당 branch 명의 프로젝트를 가져옵니다.

git branch: '브랜치 명', url: '깃 허브 주소'

해당 PID가 NULL 값이면 true

if [ -z ${CURRENT_PID} ]

해당 PID를 Kill 하고 10초 동안 기다립니다. ( 종료 시간 )

sudo kill -9 $CURRENT_PID
sleep 10

해당 stage를 수행한 후 성공 & 실패에 대한 작업을 정의합니다.

post - success
failure

JENKINS_NODE_COOKIE=dontKillMe : jenkins는 작업이 끝난 후 생성한 프로세스를 제거합니다. 따라서 해당 명령어를 통해 프로세스를 죽이지 않게 설정합니다.

nohup & : 백그라운드에서 실행합니다.

JENKINS_NODE_COOKIE=dontKillMe nohup java -jar comma-0.0.1-SNAPSHOT.jar &

참고 블로그 : https://sihyung92.oopy.io/e5300d92-1a4e-40f4-b927-a93b2bbb17d2

부록..

젠킨스 권한 없음

sudo: a terminal is required to read the password; either use the -S option to read from standard input or configure an askpass helper Build step 'Execute shell' marked build as failure

  1. root 계정으로 sudoers.d 폴더로 이동

    cd /etc/sudoers.d

  2. jenkins 파일 생성

    touch jenkins

  3. jenkins 파일에 [jenkins ALL=(ALL) NOPASSWD: ALL] 를 입력

    vi jenkins
    jenkins ALL=(ALL) NOPASSWD: ALL

  4. jenkins 파일에 보안을 위해 권한을 지정

    chmod 0440 jenkins

참고 블로그 : https://hyunmin1906.tistory.com/282

그레이들 빌드 명령어

  1. 프로젝트 실행 ( run )

    ./gradlew bootRun

  2. 빌드를 통해서 jar 나 war 파일 생성

  • 프로젝트이름-버전.jar 파일이 build/libs 경로에 생성

    ./gradlew build

  1. 빌드 파일 제거

    ./gradlew clean

  2. 테스트

    ./gradlew test

  3. Jar 파일 생성

    ./gradlew bootJar

  4. War 파일 생성

    ./gradlew bootWar

참고 블로그 : https://velog.io/@apayaya/%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-run-and-build-gradle#test

FreeStyle 로 웹 구축하기

참고 블로그 1 : https://lemontia.tistory.com/660
참고 블로그 2 : https://kitty-geno.tistory.com/91

함께 보면 좋은 글

파이프라인 기능에 대해 알기 : 링크

profile
https://github.com/5tr1ker

0개의 댓글