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 스크립트 실행 시간을 줄일 수 있도록 최적화 해보자.
sh 'nohup java -jar build/libs/*SNAPSHOT.jar > /dev/null'
어플리케이션을 실행하면 초기화에 시간이 들고
이를 출력하느라 시간이 많이 잡아 먹힌다.
개발자 입장에서는 어플리케이션이 잘 실행되는지 확인할 필요가 있으나,
스크립트 입장에서는 이를 기다릴 필요없다.
/dev/null
을 추가하여 표준출력을 null로 버리도록 재지정 해준다.
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의 환경 변수를 사용하여 나를 죽이지말아달라고 애원하면,
백그라운드 프레세스가 종료하지 않도록 할 수 있다.
출력 재지정과 백그라운드 실행으로 스크립트 실행 시간을 줄일 수 있었다.