프로젝트는 작은 단위로 기능을 구현하고 있으며, 구현된 기능은 Jenkins를 통해 서버에 배포되고 있다.

현재 프로젝트는 작은 단위로 기능을 구현하고 있으며, 구현된 기능은 Jenkins를 통해 서버에 배포되고 있다.
GitHub에서 PR(Pull Request)이 Merge되면 Jenkins가 빌드(Build)와 배포(Deploy) 작업을 진행하는 상황
그러나 어느 날 PR을 Merge한 후에도 EC2 서버가 정상적으로 구동되지 않는 오류가 발생했다.
이를 해결하기 위해 다음과 같은 가정을 세웠다.
정답이었지만 정답이 아니었다.
Jenkins free style job에서 빌드 유발 설정을 Github hook trigger for GITScm polling 으로 선택해 사용 하고 있었다. 이 설정은 Github Webhook과 상호작용을 하면서 PR이 Merge가 되었는지 확인을 해야하는데 Github를 확인해보니 Webhook관련 설정이 사라진 상태였다. 다행히도 해당 설정을 하니 Jenkins 로그에 정상적으로 작동을 하는 것을 확인했다.
하지만..
여전히 서버에는 실행이 안되는 중이다..
Jenkins 빌드 실행 로그를 보니 다음과 같이 나와있었다.
19:42:41 if [ -z $CURRENT_PID ]
19:42:41 then
19:42:41 echo "실행되고 있는 애플리케이션이 없습니다."
19:42:41 else
19:42:41 echo "기존에 실행되고 있던 애플리케이션을 종료했습니다."
19:42:41 sudo kill -9 $CURRENT_PID
19:42:41 sleep 3
19:42:41 fi
19:42:41
19:42:41 echo "프로그램을 실행합니다."
19:42:41 sudo nohup java -jar ~/memic-0.0.1-SNAPSHOT.jar --spring.profiles.active=prod > /dev/null 2>&1 &] ...
19:42:41 SSH: EXEC: connected
19:42:41 기존에 실행되고 있던 애플리케이션을 종료했습니다.
19:42:45 프로그램을 실행합니다.
19:42:45 SSH: EXEC: completed after 3,203 ms
19:42:45 SSH: Disconnecting configuration [13.125.213.188] ...
19:42:45 SSH: Transferred 1 file(s)
19:42:45 Finished: SUCCESS
스크립트가 정상적으로 작동하고 끝마친 상태였다.
따라서 인스턴스가 실행하는 부분에서 문제가 발생한거라 생각을 하였고 nohup 실행 관련으로 검색해 보았다.
찾아보니 “보통 Jenkins Job 이 끝나면 실행되던 Process 도 함께 종료가 된다.” 라고 나와있고 BUILD_ID=dontkillME 를 사용하면 해결할 수 있다고 했다.
따라서
# AS-IS
sudo nohup java -jar ~/memic-0.0.1-SNAPSHOT.jar --spring.profiles.active=prod > /dev/null 2>&1
# TO-BE
BUILD_ID=dontKillMe sudo nohup java -jar ~/memic-0.0.1-SNAPSHOT.jar --spring.profiles.active=prod > /dev/null 2>&1
로 해결을 했다.
궁금한 점
이전에는 왜 BUILD_ID 설정없이 해당 정상적으로 프로세스가 실행이 되었던걸까?
관련 자료를 찾아보려고 했지만 찾을수가 없었다..
혹시 아시는 분 있으시면 댓글 남겨주시면 감사하겠습니다. (- - (_ _ (- - (꾸벅)
Reference
https://community.jenkins.io/t/background-job-is-killed-after-jenkins-job-finishes/13727
https://stackoverflow.com/questions/37160402/clean-way-of-launching-a-shell-script-in-background-from-jenkins