Jenkins를 활용한 SpringBoot gradle 빌드&배포

devdo·2022년 2월 13일
0

Jenkins

목록 보기
2/8
post-thumbnail

젠킨스 인스턴스, 젠킨스가 SSH로 접속할 worker 인스턴스 서버를 설치, 환경을 구성해야 한다.

이 블로그에서 jenkins 설치부분을 참조하길 바란다.
https://velog.io/@mooh2jj/젠킨스-자동배포하기


자 설치와 젠킨스 인스턴스, worker 인스턴스 서버(class101 backend)를 구성했다면, 이제. 젠킨스 프로젝트 구성해보자.


젠킨스 프로젝트 구성

새로운 Item > 프로젝트명 docker-jenkins-github-test으로.
Freestyle project로 해놓았다.

소스코드관리 > Git
Repositroy URL -> 배포할 프로젝트 URL 이름을 입력한다.

Build Steps

Freestyle project Build 방법에 2가지를 소재하겠습니다.

1) Excute Shell (추천)
Add build step -> Excute Shell 선택

Command에 다음과 같이 입력한다.

chmod +x gradlew
./gradlew clean build

2) Invoke Gradle script & Use Gradle Wrapper

Add build step -> Invoke Gradle script를 선택 -> Use Gradle Wrapper

Invoke Gradle을 선택할 경우 Jenkins에 Global Toll Configuration에서 Gradle 패키지를 설치해야 사용할 수 있습니다.

Use Gradle Wrapper의 경우 Gradle을 설치할 필요가 없다.

Make gradlew executable도 체크해준다. 체크하면 권한 문제로 실행이 안 되는 상황을 방지할 수 있다.

Tasks에 clean build를 입력하면 Build 정의는 한차례 완료된 것이게 됩니다.

그다음 Build Now 해서 제대로 실행되는 지 확인.


SSH서버에 jar 파일 배치 & excute commands 구성하기

Build > Send files or excute commands over SSH
여기선 Transfers에서 실질적으로 빌드한 파일을 Service Server(SSH 서버)로 보내고 배포하는 행위를 정의하는 것이다.

  • SSH Server : publish over SSH 폼화면에 등록한 서버

Name : 추가한 SSH Server의 이름이 리스트 형태로 나타난 걸 선택.

  • Source files : build/libs/*jar로 정의한다.
  • Remove prefix : build/libs
  • Remote directory : /service_server/target

Build Server의 Jenkins 계정의 루트 경로는 /var/lib/jenkins다.

Jenkins에서 Gradle Build를 하게 될 경우 /var/lib/jenkins/build/libs 에 jar 파일이 위치하게 되므로

Remote directory는 파일을 전송받는 Service Server의 경로를 의미한다.

SSH 접속 루트를 /home/ubuntu로 되어있으므로 결과적으로 Remote directory는

/home/ubuntu/service_server/target이 될 것이다.

Service Server에서 미리 service_server/target 디렉터리를 생성해 주자.

또한 프로젝트 구동 시의 로그 파일을 저장하기 위한 logs 디렉터리도 함께 만들어주자.

# Service Server 
mkdir -p ~/service_server/target 
mkdir -p ~/service_server/logs

이제 Exec command를 작성해주어야 한다.

이곳에는 빌드가 완료되어 jar파일이 Service Server에 전달되고 난 후 실행되는 스크립트를 작성하는 곳이다.

스크립트를 직접 작성해도 되고 .sh파일을 미리 준비했다 그것을 실행하는 형태로 해도 무방하다.

본 예제에서는 스크립트 구문을 직접 입력하는 방식으로 진행한다.

아래의 스크립트를 Exec commands에 입력한다.

echo "PID Check..." 

CURRENT_PID=$(ps -ef | grep java | grep gradle-springboot-test* | awk '{print $2}') 

echo "Running PID: {$CURRENT_PID}" 

if "$CURRENT_PID" [ -z CURRENT_PID ] ; then 
	echo "Project is not running"
​else 
	kill -9 $CURRENT_PID 
	sleep 10 
fi 

echo "Deploy Project...." 

nohup java -jar /home/ubuntu/service_server/target/gradle-springboot-test-0.0.1-SNAPSHOT.jar >> /home/ubuntu/service_server/logs/gradle-springboot-test.log & 

echo "Done"

💥주의) 여기서 jar 파일 이름은 프로젝트명과 다를 수 있으니 잘 확인하고 기입하자!
난 달라서 배포된 jar 이름 확인하고 기입했다.

실제 배포도 잘 됐고 브라우저 확인을 잘 실해된 것도 확인됐다.


💥Unstable 상태 오류 해결방법

출처: https://oingdaddy.tistory.com/189 [SI Supply Depot]

Build Now를 하고 콘솔 출력을 보니 Build Success가 나왔다. 하지만 잠시 Unstable 상태 오류는 난다...

SSH: Disconnecting configuration [batch_001] ...
ERROR: Exception when publishing, exception message [Exec timed out or was interrupted after 213,127 ms]
Build step 'Send files or execute commands over SSH' changed build result to UNSTABLE

결론은 timeout 관련된 오류다.

Jenkins는 스케쥴러 역할을 하는 녀석으로 B라는 서버에 올라가 있고 A라는 서버에는 Batch instance가 올라가있다. 이 B가 A한테 ssh를 사용해 "batch 수행해!" 라고 명령했고 A는 열심히 일을 했는데 B는 결과를 기다리다가 timeout이 난 것이다.

해결책은 간단하다. 명령을 날리는 Jenkins(B)가 충분한 시간동안 기다려줄수 있도록 timeout 옵션을 변경해주면 된다.

Exec timeout (ms) -> 0(무한시간)으로 바꿔준다.

저장하고 Build Now를 하니 정상적으로 작동되는 것을 확인할 수 있다.



참고

profile
배운 것을 기록합니다.

0개의 댓글