본문 바로가기
Server/서버 배포과정

SpringBoot 프로젝트 서버 배포하기 5 - Jenkins에서 SSH 설정 및 배포하기

by hhyyyjun 2024. 8. 5.

이전 포스팅은 젠킨스와 깃허브를 연동하여 빌드 시 jar파일을 젠킨스 서버 내에 생성되는 작업을 했다.

 

이번엔 SSH 설정을 통해 빌드 시 배포를 원하는 서버로 파일을 전달하도록 했다.

 

또한 빌드 및 배포 시 이전 jar파일을 백업하는 로직까지 추가했다.

1. plugins 에서 publish over ssh 설치

Jenkins 관리 탭 > 플러그인 관리 > publish over ssh 검색 후 해당 플러그인을 설치한다.

 

2. System 최하단에서 SSH Server 추가

 

Name : 서버 이름

HostName : ip

UserName : 서버 계정 아이디

Remote Directory : 절대경로(가장 상위 위치)

3. 고급 눌러서 서버 포트번호 입력

4. Send files or execute commands over ssh 

 

추가한 프로젝트의 설정의 send files or execute commands over ssh 메뉴에서 등록한 서버 선택

Add transfer set 
Source files : 프로젝트 명을 제외한 경로/jar

Remove prefix :  jar파일 제외한 경로

Remote directory : 2번에서 지정한 절대경로를 제외하고 파일을 옮길 경로

Exec command : 실행할 명령

Stop.sh

#!/bin/bash

SERVICE_NAME=security
PID_PATH_NAME=/data/security.pid
echo "===============================STOP============================="
if [ -f $PID_PATH_NAME ]; then
            PID=$(cat $PID_PATH_NAME);
            echo "$SERVICE_NAME stoping ..."
            kill $PID;
            echo "$SERVICE_NAME stopped ..."
            rm $PID_PATH_NAME
else
            echo "$SERVICE_NAME is not running ..."
fi
echo "================================================================"

 

현재 서비스 중인 프로젝트의 PID를 확인하여 STOP 시키는 쉘파일을 작성했다.

Backup.sh

#!/bin/bash

backupFileNm=security-0.0.1-SNAPSHOT.jar
backupTime=$(date +"%Y-%m-%d_%H:%M:%S")

mkdir /data/backup/${backupTime}_backup

echo "=============================COPY==============================="
cp /data/remote/security-0.0.1-SNAPSHOT.jar /data/backup/${backupTime}_backup/security-0.0.1-SNAPSHOT.jar
cp /data/remote/security-0.0.1-SNAPSHOT.jar /data/security-0.0.1-SNAPSHOT.jar
echo "copy complete.."
echo "================================================================"


echo "=======================DELETE BACKUP FILE======================="
find /data/backup -maxdepth 1 -type d -exec stat -c '%Y %n' {} \; | sort -rn | tail -n +7 | awk '{print $2}' | xargs rm -rf
echo "delete backup file complete.."
echo "================================================================"

 

프로세스를 종료 후 backup 폴더에 현재 '연도/월/일/시간/분/초_backup' 명으로 폴더를 생성한 후 복사 명령어를 통해 jar파일을 복사하여 백업하도록 했다. 또한 백업파일을 최대 5개까지만 지정하여 5개 이상 넘어가면 가장 오래된 폴더를 삭제하도록 작성했다.

Start.sh

#!/bin/bash

SERVICE_NAME=security
PATH_TO_JAR=/data/security-0.0.1-SNAPSHOT.jar
PID_PATH_NAME=/data/security.pid

PORT=7878
APPLICATION_LOCAL=/data/application.yml
ENV_SET=local

#export JAVA_HOME=/data/jdk-11.0.22
#export PATH=$PATH:/data/jdk-11.0.22/bin
JAVA_HOME=/data/jdk-11.0.22/bin/java

echo "==============================START============================="
        echo "Starting $SERVICE_NAME ..."
        if [ ! -f $PID_PATH_NAME ]; then
#               $JAVA_HOME -jar -Dserver.port=$PORT -Dspring.profiles.active=$ENV_SET $PATH_TO_JAR --spring.config.location=file:${APPLICATION_LOCAL} > nohup.out &
#                        echo $! > $PID_PATH_NAME


                $JAVA_HOME -jar -Dserver.port=$PORT -Dspring.profiles.active=$ENV_SET $PATH_TO_JAR --spring.config.location=file:${APPLICATION_LOCAL} > /dev/null 2>&1 &
                        echo $! > $PID_PATH_NAME

            echo "$SERVICE_NAME started ..."
        else
            echo "$SERVICE_NAME is already running ..."
        fi
echo "================================================================"

 

이전 포스팅에서 올렸던 로직과 동일한 start 쉘파일이다.

 

마지막으로 빌드 시 콘솔에서 시간을 확인할 수 있도록 빌드 환경에서 Add timestamps to the console output을 추가했다.

 

위와 같이 설정 후 빌드를 해봤다.

로그 확인 결과 쉘 스크립트에 설정한대로 잘 이행되었다.

 

또한 

빌드 후 프로젝트가 실행되었는지 확인

 

로그 파일 역시 확인했다.

 

JPA를 적용했기 때문에 테이블도 생성되었음을 확인했다.

 

다음은 빌드된 파일이 제대로 이동되었는지, 이전 빌드파일은 백업이 되었는지 확인했다.

4번 항목에서 지정한 파일을 전달할 경로에 빌드된 파일이 잘 전달되었다.

 

또한 백업 폴더도 잘 생성된 것을 확인했다.

백업 폴더 내에 이전 빌드파일도 잘 전달되었다.

 

마지막으로

작업한 폴더 화면이다. 

JDK 폴더

 

댓글