Jenkins에서 deploy.sh가 실행이 잘 안되네..

공병주(Chris)·2022년 8월 6일
2
post-thumbnail

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 파일을 실행시키는 로직이 있다.

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 파일을 실행하면 파일이 실행되지 않았다.

그 이유는 아래와 같다.

첫번째 이유 : “${pid}”에서

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 까지는 실행되었다.

두번째 이유 : Jenkins는 자신이 실행한 child process를 기록해두고 job이 끝날 때 모두 Kill한다.

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으로 잘 떴다!!!

참고 자료

https://blog.jiniworld.me/25

3개의 댓글

comment-user-thumbnail
2022년 8월 6일

돈킬미 왜케 기여움ㅋㅋㅋㅋ

1개의 답글
comment-user-thumbnail
2023년 5월 15일

안녕하세요 좋은글 감사드립니다!
한가지 궁금한게 ec2 sh 파일에서 echo 로 찍은 콘솔로그 내용을 jenkins 에서 어떻게 확인하셨는지 알수있을까요..?

답글 달기