[Jenkins]Pipeline 백그라운드 실행

HW·2024년 4월 27일
0
post-thumbnail

서론

Jenkins Pipeline에서
nohup으로 백그라운드 실행할 경우
Pipeline 스크립트가 종료되지 않은 채, 행이 걸린다.

stage('Run') {
            steps {
                script {
                    try {
                        
                        dir("./backend"){
                        sh 'nohup java -jar build/libs/*SNAPSHOT.jar '
                    }
                        
                    } catch (Exception e) {
                        echo ';오류 발생: ${e.message}'
                        currentBuild.result = 'FAILURE'
                    }
                }
            }
        }

Git pull => Build => Run으로 이어지는 Pipeline을
Run 이후에 종료하여 결과를 리포트하고
실행된 프로그램은 유지하고 싶다.

본론

행이 걸리는 이유는 어플리케이션을 백그라운드에 실행 하면
스크립트가 어플리케이션을 종료할 때 까지 기다리고 있는 것이다.
스크립트가 어플리케이션 종료를 기다리지 않도록 해야한다.
더불어 Jenkins 스크립트 실행 시간을 줄일 수 있도록 최적화 해보자.

표준출력 redirect

sh 'nohup java -jar build/libs/*SNAPSHOT.jar > /dev/null'
  • 표준출력 null 재지정

어플리케이션을 실행하면 초기화에 시간이 들고
이를 출력하느라 시간이 많이 잡아 먹힌다.
개발자 입장에서는 어플리케이션이 잘 실행되는지 확인할 필요가 있으나,
스크립트 입장에서는 이를 기다릴 필요없다.
/dev/null을 추가하여 표준출력을 null로 버리도록 재지정 해준다.

표준에러출력 redirect

sh 'nohup java -jar build/libs/*SNAPSHOT.jar > /dev/null 2>&1'
  • 표준에러출력 재지정

표준출력을 null로 버리도록 재지정하면,
표준에러출력도 현재 표준출력(null)에 버리도록 재지정 해준다.

날 기다리지 말아요

터미널이 백그라운드 실행 프로세스를 기다리지 않도록
뒤에 &을 붙여준다.

sh 'nohup java -jar build/libs/*SNAPSHOT.jar > /dev/null &'
  • 백그라운드 실행 & 추가

이렇게 하면 행 해결을 할 수 있을거라 예상했으나..

매정한 스크립트

기다리지 말라 했더니 뒤도 안 돌아보고 스크립트를 끝내버린다.
좋아좋아

엇 아니 근데,

스크립트 종료와 함께 어플리케이션도 종료되어 버린다

스크립트가 뒤끝 없게 어플리케이션 실행 프로세스와의 연결을 끊도록 해주자.

날 기다리지말고 죽이지도 말아요

Jenkins의 스크립트는
정리된 step을 차례대로 실행하고
스크립트가 종료되면 실행 환경을 정리하고 종료한다.
즉, 자식 프로세스도 함께 생을 마감하게 된다.

sh 'JENKINS_NODE_COOKIE=dontKillMe && nohup java -jar ./backend/build/libs/hyeonworld-0.0.1-SNAPSHOT.jar > /dev/null 2>&1 &'
  • Jenkins 환경변수 JENKINS_NODE_COOKIE=dontKillMe 추가

Jenkins의 환경 변수를 사용하여 나를 죽이지말아달라고 애원하면,
백그라운드 프레세스가 종료하지 않도록 할 수 있다.

결론

출력 재지정과 백그라운드 실행으로 스크립트 실행 시간을 줄일 수 있었다.

profile
예술융합형 개발자🎥

0개의 댓글