코알못

[Jenkins] 젠킨스 배포 자동화 (with. gradle, git) 본문

ETC

[Jenkins] 젠킨스 배포 자동화 (with. gradle, git)

코린이s 2021. 4. 17. 08:48
728x90

우리에게는 5가지의 업무가 있다!

이걸 자동화 해주는게 바로 Jenkins!

아래 자동화에 등록할 업무를 살펴보자!

  1. [젠킨스 서버] 젠킨스와 깃을 연동하여 해당 브랜치에 맞는 소스를 받아온다.
  2. [젠킨스 서버] 받아온 소스를 gradle 을 통해 빌드 하여 jar 파일로 만든다.
  3. [젠킨스 서버] 운영 서버에 있는 프로세스 STOP 스크립트를 실행한다.
  4. [젠킨스 서버 > 운영 서버] 만든 jar 파일을 운영 서버 라이브러리 폴더에 옮긴다.
  5. [젠킨스 서버] 운영 서버에 있는 프로세스 START 스크립트를 실행한다.

배포 완료!

운영 서버에 띄울 프로젝트는 아래 이전 포스팅한 간단한 프로젝트로 진행 하겠다.

:: co-de.tistory.com/18

 

[Gradle] 실행 가능한 JAR 파일 만들기 (with 스프링 멀티 모듈)

간단한 프로젝트를 만들어 보겠다! - 모듈 3개 core-util : 공통으로 사용하는 메소드 모듈 run-a , run-b: base64로 암호화된 값을 보내면 디코딩 한 후 해당 메세지에 모듈명을 붙인뒤, Base64로 암호화해

co-de.tistory.com

사전에 운영 서버에 프로세스 start , stop 하는 스크립트를 만들어 둔다.

  • JAR_HOME : jar 파일 경로
  • P_NAME : 프로세스 명으로 프로세스 찾을때 유용함
  • LOG_DIR : 로그 저장 경로
  • JAVA_HOME : 자바 경로
  • > $LOG_DIR 2>&1 & : (>) LOG_DIR 에 로그를 이어 쓰며, (&) 백그라운드로 실행하며, (2>&1) 표준에러를 표준 출력으로 한다. (=에러를 해당 로그경로에 출력하겠다는 뜻)

* 참고

- 2>&1 를 안하면, ssh 로 해당 스크립트 실행시 종료 되지 않는 이슈가 발생한다.

- & 를 안하면 백그라운드로 실행 되지 않아 젠킨스 서버에서 해당 스크립트 실행 프로세스를 종료하면 해당 프로세스도 종료된다. 

// start_run_a.sh
#!/bin/bash
JAR_HOME=/Users/hongyoolee/IdeaProjects/multi-module/run-a/build/libs/run-a-1.0.0-SNAPSHOT.jar
P_NAME=MULTI_MODULE_RUN_A
LOG_DIR=/Users/hongyoolee/logs/service_a.log
JAVA_HOME=/Library/Java/JavaVirtualMachines/adoptopenjdk-15.jdk/Contents/Home/bin/
$JAVA_HOME/java -jar $JAR_HOME -Dname $P_NAME > $LOG_DIR 2>&1 &

//stop_run_a.sh
#!/bin/bash
P_NAME=MULTI_MODULE_RUN_A
PID=`ps -ef | grep $P_NAME | grep -v grep | awk '{print $2}'`
if [[ -z "$PID" ]];
	then(
		echo "start proceess not running !!!"
	)else(
		kill -9 $PID
		echo "stop process pid : "$PID
	)
fi

// start_run_b.sh
#!/bin/bash
JAR_HOME=/Users/hongyoolee/IdeaProjects/multi-module/run-b/build/libs/run-b-1.0.0-SNAPSHOT.jar
P_NAME=MULTI_MODULE_RUN_B
LOG_DIR=/Users/hongyoolee/logs/service_b.log
JAVA_HOME=/Library/Java/JavaVirtualMachines/adoptopenjdk-15.jdk/Contents/Home/bin/
$JAVA_HOME/java -jar $JAR_HOME -Dname $P_NAME > $LOG_DIR 2>&1 &

//stop_run_b.sh
#!/bin/bash
P_NAME=MULTI_MODULE_RUN_B
PID=`ps -ef | grep $P_NAME | grep -v grep | awk '{print $2}'`
if [[ -z "$PID" ]];
	then(
		echo "start proceess not running !!!"
	)else(
		kill -9 $PID
		echo "stop process pid : "$PID
	)
fi

자 그럼 시작해보자!

테스트 환경은 젠킨스 서버와 운영 서버를 동일한 로컬 서버에서 진행했음을 참고해라 (실제 구성시는 맞는 IP 를 입력해서 하면 된다)

- 젠킨스 프로젝트 생성

1. [젠킨스 서버] 젠킨스와 깃을 연동하여 해당 브랜치에 맞는 소스를 받아온다. (main 브랜치 소스를 가져온다.)

- 해당 소스는 아래 경로에 받아진다

$ cd /Users/hongyoolee/.jenkins/workspace/Multi-Module (젠킨스설치경로/workspace/젠킨스프로젝트명)
$ ls
README.md	build.gradle	gradle		gradlew.bat	run-b		src
build		core-util	gradlew		run-a		settings.gradle

2. [젠킨스 서버] 받아온 소스를 gradle 을 통해 빌드 하여 jar 파일로 만든다.

3~5. 빌드후 조취 (빌드한 소스 운영 서버에 옮기고 프로세스 재기동)

- post build task 는 빌드 완료후 실행 되는 부분으로 log text에 있는 로그가 있을 경우 아래 script 를 실행하도록 할 수 있다.

- 여러 조건을 추가하여 해당 로그중 하나라도 or 모두 있어야 script 부분을 실행 하도록 할 수도 있다.

- script 단에 적혀지는 부분은 만든 프로젝트 루트 경로 부터 시작한다. (해당 경로에는 깃에서 받은 소스가 있다)

:: 시작 경로 : /Users/hongyoolee/.jenkins/workspace/Multi-Module

 

6. 자동화 시작

- bulid history 아래 로딩바 클릭시 로그 확인이 가능하다

7. 확인

- 프로세스 확인

$ ps -ef | grep 'MULTI_MODULE_RUN_A\|MULTI_MODULE_RUN_B' | grep -v grep
  501 32099     1   0 12:54PM ??         0:11.67 /Library/Java/JavaVirtualMachines/adoptopenjdk-15.jdk/Contents/Home/bin//java -jar /Users/hongyoolee/IdeaProjects/multi-module/run-a/build/libs/run-a-1.0.0-SNAPSHOT.jar -Dname MULTI_MODULE_RUN_A
  501 32105     1   0 12:54PM ??         0:11.14 /Library/Java/JavaVirtualMachines/adoptopenjdk-15.jdk/Contents/Home/bin//java -jar /Users/hongyoolee/IdeaProjects/multi-module/run-b/build/libs/run-b-1.0.0-SNAPSHOT.jar -Dname MULTI_MODULE_RUN_B

- 테스트

정상적으로 배포가 되었다!

배포후 테스트 하는 시간이 있으며, 매번 하는 테스트도 자동화 한다면 업무 효율이 높아지지 않을까?

NewMan 을 이용하여 테스트를 자동화 해보자!

* NewMan : postman 에서 만든 테스트 케이스를 CLI 상에서 실행 시킬수 있도록 하는 서비스

다음 포스팅에서 다루겠습니다 ㅎㅎ

그럼 이만!

728x90
Comments