도찐개찐

[Jenkins] Spring boot War 내장 톰캣 배포 자동화 본문

Infra -------------------------/젠킨스

[Jenkins] Spring boot War 내장 톰캣 배포 자동화

도개진 2023. 3. 2. 18:29

 

젠킨스 빌드 자동화

 

[Jenkins] GitHub WebHook 연동(자동화 빌드)

1. github 계정 설정 *** 대상 Repository가 Private 가 아닌 Public의 경우 본 단계는 Skip 하셔도 됩니다. 깃헙 계정 로그인 후 오른쪽 상단 본인 계정 프로필 클릭 > Settings > Developer Settings > Personal access token

dev-truly.tistory.com

0. 환경 체크

Gradle-7.6

openjdk-11

Jenkins Server : docker jenkins/jenkins:lts

Deployment Server : Docker openjdk:11-jdk

1. SSH Key(공개키) 발급 설정

Jenkins에서 Deployment서버로의 접근이 필요하다. 이때 바로 Jenkins 애플리케이션에 Deployment 서버의 Key 정보를 등록해줘야 접근이 가능하다.

- Deployment 서버로 접속을 위한 SSH 키 값을 생성하는 방법에 대해서 알아보자.

- 일단 key 를 생성하는것은 매우 간단하다. 아래의 명령어만 입력하면 키가 생성이 된다.

 

1) OpenSSH 버전 확인

$ ssh -V 
OpenSSH_8.4p1 Debian-5+deb11u1, OpenSSL 1.1.1n  15 Mar 2022

OpenSSH 버전에 따라 공개키 방법을 다르게 할 수 있습니다.

참고 포스팅

 

[Jenkins] Publish over SSH 인증시 BapPublisherException 오류 원인과 해결책

Jenkins Publish over SSH 플러그인을 제대로 설치도 하고 서버에 공개키 세팅해 주고, Jenkins에 개인키 설정까지 다 마쳤는데, 인증이 언젠가부터 안되는 분들 계시죠? Jenkins에서 BapPublisherException 발견

dev-truly.tistory.com

2) 공개키 발급

본 포스팅에서는 "OpenSSH 8.8" 에서 권장 하는 "ECDSA" 타입으로 공개키를 발행 하는 방법으로 진행 하겠습니다.

$ ssh-keygen -t ecdsa -b 521 -m PEM

 

완료 후 ls 명령어를 통해 ~/.ssh 디렉토리안을 확인 해 보면

다음과같이 .ssh 디렉토리 안에 private key와 public key가 생성 된것을 확인 할 수 있습니다..

private key : id_ecdsa-02 

public key : public key

Enter file in which to save the key : {key 파일 생성 경로}

Enter passphrase (empty for no passphrase) : {해당 키파일에 사용할 암호 불필요시 그냥 엔터}

Enter same passphrase again : {직전 입력한 키파일 암호 동일 하게 입력}

 

3) authorized_keys 파일 생성 및 권한 설정

~/.ssh/authorized_keys 파일이 존재 하지 않는 경우 하단 명령어를 통해 authorized_keys 파일을 생성해 주셔야 합니다.

$ touch ~/.ssh/authorized_keys
$ chmod 600 ~/.ssh/authorized_keys

 

4) authorized_keys 파일 public key 등록

$ scp ~/.ssh/id_ecdsa-02.pub ~/.ssh/authorized_keys

5) private key 확인 및 별도 복사

* 확인한 private key는 jenkins 관리를 통해 SSH 서버 등록시 사용 하게 됩니다.

$ cat id_ecdsa-02

2. 젠킨스 SSH Server 설정

1) Publish Over SSH 설치

젠킨스 Dashboard > Jenkins 관리 > Plugin 관리

설치 가능 목록에서 "Publish Over SSH" 검색 후 해당 플러그인 설치

 

2) SSH 서버 설정

젠킨스 Dashboard > Jenkins 관리 > 시스템 설정 > 

스크롤 최 하단 "Publish over SSH" 확인 > SSH Servers 추가 > 

SSH Server 설정 > 

Name : {프로젝트 설정시 SSH 서버 검색에 활용 할 서버 이름}

Hostname : {Deployments 서버 주소}

Username : {접근하고자 하는 계정}

Remote Directory : {접근 후 서비스 배포를 위해 사용할 경로} 

 

발급된 SSH key를 사용하기 위해 "Use password authentication, or use a different key" 체크

Passphrase / Password : {SSH key 발행시 "Passphrase" 값을 입력했다면 해당 폼 동일값 입력}

Path to key : {공개키 파일을 Jenkins 서버에 옮긴 후 사용하기 위해서 키파일 경로 입력}

Key : {SSH private key 값 붙여넣기}

 

설정 한 SSH Server 하단 "Test Configuration" 클릭 > Success 메세지 확인

3. Jenkins Gradle 환경 추가

젠킨스 Dashboard > Jenkins 관리 > Global Tool Configuration 설정 > 

Gradle > Gradle installations > Add Gradle

name : {gradle 설정 명}

Install automatically > gradle 버전 설정 후 설정 저장

4. 프로젝트 배포 설정

Jenkins Dashboard > 배포 자동화 할 Jenkins 프로젝트 > 구성 > 

Build Steps > Add build steps > "Invoke Gradle script" 2개 추가

 

아래와 같이 설정

같은 페이지 내 빌드 환경 > Send files or execute commands over SSH after the build runs > 

Name : {2번 항목에서 설정한  SSH Server 명 선택}

Transfers : build/libs/*.war

Remove prefix : {Transfers 에서 입력된 경로에서 build/libs 경로 삭제}

Remote directory : {Transfers 대상파일을 SSH Server Home directory + Remote direct}

ex) 아래와 같이 설정시 => /home/sftp-test/service_server/target/*.war

 

Exec command : sh deploy.sh

deploy.sh 내용

#deploy.sh
echo "PID Check..." 

CURRENT_PID=$(ps -ef | grep java | grep jenkins-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

JAVA=/usr/local/openjdk-11/bin/java 

echo "Deploy Project...." 

nohup $JAVA -jar /home/sftp-test/service_server/target/jenkins-test-0.0.1-SNAPSHOT.war >> /home/sftp-test/service_server/logs/jenkins-test.log 2>&1 &

echo "Done"
728x90
Comments