인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

highjune님의 프로필 이미지

작성한 질문수

Jenkins를 이용한 CI/CD Pipeline 구축

PollSCM 설정을 통한 지속적인 파일 업데이트

젠킨스 빌드 성공후 shutdown

작성

·

38

0

안녕하세요 우선 저는 gradle 로 진행을 했습니다.

다른건 다 동일하게 했고
젠킨스 도커 안에 들어가서

cd /var/jenkins_home/workspace/My-Third-Proejct

nohup java -jar build/libs/jenkins_cicd_project-0.0.1-SNAPSHOT.jar --server.port=9000 --server.address=0.0.0.0 > app.log 2>&1 &

로 실행을 하면 브라우저에서 localhost:9000 으로 접근이 잘 됩니다.

그런데 젠킨스 스크립트로 실행을 하게 되면 젠킨스 도커 내의 로그를 확인해보면 계속 꺼져요.

image.png

이유가 있을까요?

젠킨스 구성 설정의 shell script 는 아래와 같아요.

# 기존 프로세스 종료
PID=$(ps -ef | grep "jenkins_cicd_project-0.0.1-SNAPSHOT.jar" | grep -v grep | awk '{print $2}')
if [ ! -z "$PID" ]; then
  echo "종료 중인 애플리케이션 PID: $PID"
  kill -15 $PID
  sleep 5
fi

# 새 프로세스 시작 (setsid 사용하여 별도 세션에서 실행)
echo "애플리케이션 시작 중..."
setsid nohup java -jar build/libs/jenkins_cicd_project-0.0.1-SNAPSHOT.jar --server.port=9000 --server.address=0.0.0.0 > app.log 2>&1 &
APP_PID=$!
echo "애플리케이션 PID: $APP_PID"

# 시작 확인
sleep 10
ps -p $APP_PID > /dev/null
if [ $? -eq 0 ]; then
  echo "애플리케이션이 PID $APP_PID로 실행 중입니다."
  curl -s http://localhost:9000 > /dev/null
  if [ $? -eq 0 ]; then
    echo "애플리케이션에 정상적으로 접근할 수 있습니다."
  else
    echo "애플리케이션 접근 테스트 실패!"
  fi
else
  echo "애플리케이션 시작 실패!"
  exit 1
fi
그리고 젠킨스 빌드 console out 도 아래와 같습니다.Started by user 허강준
Running as SYSTEM
Building in workspace /var/jenkins_home/workspace/My-Third-Proejct
The recommended git tool is: NONE
No credentials specified
 > git rev-parse --resolve-git-dir /var/jenkins_home/workspace/My-Third-Proejct/.git # timeout=10
Fetching changes from the remote Git repository
 > git config remote.origin.url https://github.com/Highjune/jenkins_cicde_project.git # timeout=10
Fetching upstream changes from https://github.com/Highjune/jenkins_cicde_project.git
 > git --version # timeout=10
 > git --version # 'git version 2.39.5'
 > git fetch --tags --force --progress -- https://github.com/Highjune/jenkins_cicde_project.git +refs/heads/*:refs/remotes/origin/* # timeout=10
 > git rev-parse refs/remotes/origin/main^{commit} # timeout=10
Checking out Revision 6353899ff277302005bce6da4d498211ebeab06b (refs/remotes/origin/main)
 > git config core.sparsecheckout # timeout=10
 > git checkout -f 6353899ff277302005bce6da4d498211ebeab06b # timeout=10
Commit message: "포트번호 수정"
 > git rev-list --no-walk 6353899ff277302005bce6da4d498211ebeab06b # timeout=10
[My-Third-Proejct] $ /bin/sh -xe /tmp/jenkins9188074144619929309.sh
+ ps -ef
+ grep jenkins_cicd_project-0.0.1-SNAPSHOT.jar
+ grep -v grep
+ awk {print $2}
+ PID=283
+ [ ! -z 283 ]
+ echo 종료 중인 애플리케이션 PID: 283
종료 중인 애플리케이션 PID: 283
+ kill -15 283
+ sleep 5
+ echo 애플리케이션 시작 중...
애플리케이션 시작 중...
+ APP_PID=420
+ echo 애플리케이션 PID: 420
애플리케이션 PID: 420
+ sleep 10
+ setsid nohup java -jar build/libs/jenkins_cicd_project-0.0.1-SNAPSHOT.jar --server.port=9000 --server.address=0.0.0.0
+ ps -p 420
+ [ 0 -eq 0 ]
+ echo 애플리케이션이 PID 420로 실행 중입니다.
애플리케이션이 PID 420로 실행 중입니다.
+ curl -s http://localhost:9000
+ [ 0 -eq 0 ]
+ echo 애플리케이션에 정상적으로 접근할 수 있습니다.
애플리케이션에 정상적으로 접근할 수 있습니다.
Finished: SUCCESS

그런데 계속 Graceful shutdown complete 가 뜹니다.

참고로 다른 포트랑 충돌같은 것은 없습니다 원래 8081로 진행하다가 일부러 다른 포트로 시도해보려고 9000으로 했습니다.

이렇게 젠킨스 내 컨테이너 내에서 수동 실행하면 되는데 왜 젠킨스 빌드로 하면 꺼지는 걸까요?

참고로 젠킨스 도커 실행 명령어는 아래와 같습니다.

docker run -d -v jenkins_home:/var/jenkins_home -p 8080:8080 -p 9000:9000 -p 50000:50000 --restart=on-failure --name jenkins-server jenkins/jenkins:lts-jdk21

답변 2

0

Dowon Lee님의 프로필 이미지
Dowon Lee
지식공유자

안녕하세요, 이도원입니다.

답변이 늦어 죄송합니다.

아래 AI 인턴이 답변해 준 내용과 동일한 답변이 될수 있을 것 같네요. 우선 Jenkins에서 빌드가 종료되면, 빌드에 사용되었던 프로세스도 같이 종료되어 버리기 때문에, 원하시는 작업이 지속적으로 백그라운드에서 작동되지 않습니다. 반대로, 백그라운드 작업이 아니고, java -jar ~ 처럼 그냥 서비스 실행하는 커맨드를 실행해 버리면, Jenkins 빌드는 종료되지 않고 (타임아웃 설정까지) 계속 대기상태가 되기도 합니다. 따라서 지속적으로 계속 기동하고 싶은 서비스라면 docker 컨테이너 실행이나, linux의 서비스 형태로 등록하여 실행할 수 있는 커맨드(systemctl 또는 service 등)로 실행하셔야 합니다.

감사합니다.

0

인프런 AI 인턴님의 프로필 이미지

안녕하세요, 인프런 AI 인턴입니다. highjune님.

질문해주신 사항을 살펴보면, Jenkins에서 실행할 때 애플리케이션이 바로 종료되는 문제를 겪고 계신 것 같습니다. 기본적으로 Jenkins의 빌드 스크립트는 성공적으로 종료되는 것을 목표로 하므로, 애플리케이션이 백그라운드에서 계속 실행되길 원하신다면 백그라운드로 작업을 실행하는 방법이 필요합니다.

문제의 원인

Jenkins가 스크립트를 실행하면, 실행이 완료되면 스크립트가 종료되고 Jenkins는 빌드를 종료합니다. 이 때, Jenkins에서 실행된 프로세스가 스크립트 종료와 동시에 종료될 수 있습니다.

해결 방법

Jenkins에서 nohup을 사용하고 계시지만 프로세스가 종료되는 이유는 Jenkins가 할당한 세션 종료와 관련이 있을 수 있습니다. 아래와 같은 방법들을 고려해볼 수 있습니다:

  1. 스크린이나 Tmux를 활용: Jenkins 빌드가 백그라운드 실행을 유지하도록 하려면 screen이나 tmux와 같은 터미널 멀티플렉서를 사용해 보세요. 이렇게 하면 터미널 세션과 무관하게 프로세스가 계속 실행될 수 있습니다.
   screen -dmS jenkins_cicd_project java -jar build/libs/jenkins_cicd_project-0.0.1-SNAPSHOT.jar --server.port=9000 --server.address=0.0.0.0 > app.log 2>&1
  1. Jenkins의 ‘Execute Shell’ 단계 변경: 다른 shell 명령으로 변경하여 스크립트를 강화하거나 실수로 종료되거나 중단되는 것을 방지하는 명령을 넣어보세요.

  2. 데몬화: nohup에 특정 신호가 전달되면 종료될 수 있으므로, nohup 외에 프로세스를 완전히 데몬화하는 대체 방안을 생각해 볼 수 있습니다.

  3. 로그 검토: Jenkins 로그에서 추가적인 에러나 경고 메시지를 확인하여 상세한 이유를 찾습니다.

참고 URL

아래는 Spring과 관련된 Jenkins 배포 문제를 해결한 사례에 대한 참고 URL입니다. 유사한 문제를 해결하는데 도움을 줄 수 있습니다:

  • 젠킨스 설치 오류 문의: Jenkins와 도커 설치 중 만나는 일반적인 문제들을 다룬 포스트입니다. 포트 및 설정 관련 문제에 대한 구체적인 팁이 포함되어 있습니다.

관련된 문제나 추가적으로 궁금한 점이 있다면 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

highjune님의 프로필 이미지

작성한 질문수

질문하기