Back-End

Jenkins CI/CD with github

jyp-on 2024. 6. 7. 14:22

jenkins에는 여러 종류의 Job이 있습니다.
가장 많이 쓰이는 것은 Freestyle Project이지만 최근에 간편하게
코드 하나로 CI & CD가 구현이 되는 Pipeline을 사용하였습니다.

Create jenkins pipeline

  1. Dashboard > new Item 에서 Pipeline 선택 후 이름 지정 (ex : jenkins_pipeline)
  2. 만든 pipeline에서 Configuration 진입
  3. GitHub Projcet : your repo -> 이것을 이용해 해당 레포에 푸쉬를 인지
  4. Pipeline speed/durability override - Perfomance-optimized
  5. Buil Triggers에 GitHub hook trigger for GITScm polling 선택
  6. Pipeline script 선택

    Write shell Script

Jenkins 파이프라인이 종료되면 해당 파이프라인에서 생성된 모든 프로세스도 함께 종료됩니다. 따라서 nohup 명령어를 사용하여 백그라운드에서 프로세스를 실행하더라도 파이프라인이 종료되면 파이프라인에서 생성한 프로세스도 종료되기 때문에 종료 하고싶지 않은 명령어의 앞에 해당 키워드를 추가합니다.

JENKINS_NODE_COOKIE=dontKillMe

Shell Script의 순서

  1. github repo를 clone해옵니다.
  2. gradlew의 실행권한을 얻은후 clean, bootJar로 jar 파일을 만듭니다.
  3. 기존의 실행중인 프로세스를 종료 후 (없다면 종료 X) 1초 기다립니다.
  4. repo 최상단에 만들어둔 deploy.sh를 이용해 jar 파일을 실행 시킵니다.
pipeline {
    agent any

    stages {
        stage('github Clone') {
            steps {
               git credentialsId: '{your credentials id}', url: '{your-repository}.git'
            }
        }
        stage('build') {
            steps {
               sh ''' 
                echo 'start bootJar' 
                chmod +x gradlew
                ./gradlew clean bootJar

                echo "Checking for running processes on port 8000"
                sudo lsof -t -i:8000 | xargs -r kill -9
                sleep 1

                chmod +x ./deploy.sh
                JENKINS_NODE_COOKIE=dontKillMe ./deploy.sh
                '''
            }
        }
    }
}

deploy.sh의 내용은 다음과 같습니다.

nohup java -jar -DServer.port=8000 ./build/libs/demo-0.0.1-SNAPSHOT.jar > nohup.out 2>&1 &

해당 코드는 jar 파일을 nohup 명령어로 백그라운드에서 실행하고, 그 과정에서 발생하는 모든 출력을 nohup.out 파일에 기록한다는 의미입니다.

포트번호와 jar 파일이름은 개인의 환경에 맞게 변경 해야합니다.