Jenkins의 multibranch 통해서 CI/CD 환경을 구축했다.
Jenkins의 Mulitbranch Pipeline을 통한 CI/CD
stage('BE-Deploy'){
steps{
script{
withCredentials([sshUserPrivateKey(credentialsId: "back-key", keyFileVariable: 'my_private_key_file')]) {
dir('backend/sokdak/build/libs'){
sh "scp -o StrictHostKeyChecking=no -i ${my_private_key_file} *.jar ubuntu@${env.DEV_BACK_IP}:/home/ubuntu/sokdak"
}
sh "ssh -o StrictHostKeyChecking=no -i ${my_private_key_file} ubuntu@${env.DEV_BACK_IP} 'cd sokdak && ./deploy.sh'"
}
}
}
}
CI/CD 파이프라인 마지막에, scp를 통해서 EC2로 .jar 파일을 옮기고 ssh를 통해 해당 EC2에 접속하여 deploy.sh 파일을 실행시키는 로직이 있다.
chmod +x ./sokdak-0.0.1-SNAPSHOT.jar
pid=$(pgrep -f sokdak)
if [ -n “${pid}” ]
then
sudo kill -9 ${pid}
echo kill process ${pid}
else
echo no process
fi
nohup java -jar -Dspring.config.location=/home/ubuntu/sokdak/application-dev.yml sokdak-0.0.1-SNAPSHOT.jar > nohup.out 2>&1 &
echo "######프로젝트 실행 완료######"
위 deploy.sh 파일이 있는 실제 Spring이 구동되는 EC2에서 deploy.sh 를 직접 실행하면 잘 실행이 되었지만,
Jenkins에서 ssh를 통해 EC2에 접속하여 deploy.sh 파일을 실행하면 파일이 실행되지 않았다.
그 이유는 아래와 같다.
chmod +x ./sokdak-0.0.1-SNAPSHOT.jar
pid=$(pgrep -f sokdak)
echo "###########first check point###########"
if [ -n “${pid}” ]
then
sudo kill -9 ${pid}
echo kill process ${pid}
else
echo no process
fi
echo "###########second check point###########"
nohup java -jar -Dspring.config.location=/home/ubuntu/sokdak/application-dev.yml sokdak-0.0.1-SNAPSHOT.jar > nohup.out 2>&1 &
echo "######프로젝트 실행 완료######"
어디서 문제인지 확인해보려고 위와 같이 check point를 지정하고 jenkins에서 pipeline을 빌드해보았다.
first check point는 echo가 실행되었지만, second check point는 실행되지 않았다.
따라서, 기존의 process를 kill하는 로직에 대한 문법 오류라는 추측이 들었다.
if [ -n "${pid}" ]
위 조건문에서 ${pid}가 “”로 감싸져있는 문제인가..?
라는 생각이 들어서
“”를 제거해보니, second check point 까지는 실행되었다.
second check point 까지는 실행이 되었지만, Spring이 동작하질 않았다.
찾아보니, Jenkins가 파이프라인 빌드를 완료한 후, Jenkins가 실행한 child process를 전부 kill 시켜서
nohup java -jar이 실행되지 않는다는 것을 알았다.
따라서, 아래와 같이 나를 죽이지 마!!! 라는 구문을 작성해주었다.
BUILD_ID=dontKillMe nohup java -jar -Dspring.config.location=/home/ubuntu/sokdak/application-dev.yml sokdak-0.0.1-SNAPSHOT.jar > nohup.out 2>&1 &
위의 구문을 추가하니 Spring이 nohup으로 잘 떴다!!!
끗
참고 자료
돈킬미 왜케 기여움ㅋㅋㅋㅋ