작성
·
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 으로 접근이 잘 됩니다.
그런데 젠킨스 스크립트로 실행을 하게 되면 젠킨스 도커 내의 로그를 확인해보면 계속 꺼져요.
이유가 있을까요?
젠킨스 구성 설정의 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
안녕하세요, 이도원입니다.
답변이 늦어 죄송합니다.
아래 AI 인턴이 답변해 준 내용과 동일한 답변이 될수 있을 것 같네요. 우선 Jenkins에서 빌드가 종료되면, 빌드에 사용되었던 프로세스도 같이 종료되어 버리기 때문에, 원하시는 작업이 지속적으로 백그라운드에서 작동되지 않습니다. 반대로, 백그라운드 작업이 아니고, java -jar ~ 처럼 그냥 서비스 실행하는 커맨드를 실행해 버리면, Jenkins 빌드는 종료되지 않고 (타임아웃 설정까지) 계속 대기상태가 되기도 합니다. 따라서 지속적으로 계속 기동하고 싶은 서비스라면 docker 컨테이너 실행이나, linux의 서비스 형태로 등록하여 실행할 수 있는 커맨드(systemctl 또는 service 등)로 실행하셔야 합니다.
감사합니다.
0
안녕하세요, 인프런 AI 인턴입니다. highjune님.
질문해주신 사항을 살펴보면, Jenkins에서 실행할 때 애플리케이션이 바로 종료되는 문제를 겪고 계신 것 같습니다. 기본적으로 Jenkins의 빌드 스크립트는 성공적으로 종료되는 것을 목표로 하므로, 애플리케이션이 백그라운드에서 계속 실행되길 원하신다면 백그라운드로 작업을 실행하는 방법이 필요합니다.
Jenkins가 스크립트를 실행하면, 실행이 완료되면 스크립트가 종료되고 Jenkins는 빌드를 종료합니다. 이 때, Jenkins에서 실행된 프로세스가 스크립트 종료와 동시에 종료될 수 있습니다.
Jenkins에서 nohup을 사용하고 계시지만 프로세스가 종료되는 이유는 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
Jenkins의 ‘Execute Shell’ 단계 변경: 다른 shell 명령으로 변경하여 스크립트를 강화하거나 실수로 종료되거나 중단되는 것을 방지하는 명령을 넣어보세요.
데몬화: nohup
에 특정 신호가 전달되면 종료될 수 있으므로, nohup
외에 프로세스를 완전히 데몬화하는 대체 방안을 생각해 볼 수 있습니다.
로그 검토: Jenkins 로그에서 추가적인 에러나 경고 메시지를 확인하여 상세한 이유를 찾습니다.
아래는 Spring과 관련된 Jenkins 배포 문제를 해결한 사례에 대한 참고 URL입니다. 유사한 문제를 해결하는데 도움을 줄 수 있습니다:
관련된 문제나 추가적으로 궁금한 점이 있다면 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.