Infra
Spring boot 서버를 쉘스크립트 배포하기
Greensky0026
2023. 6. 5. 18:13
반응형
0. 개요
지난번 글에선 서버에서 직접 커맨드 명령어를 사용해 spring boot 서버를 빌드/배포했었습니다.
이번에는 스크립트를 실행하는 한번의 명령어로 spring boot 서버를 빌드/배포 할 수 있도록, 쉘 스크립트를 짜보면서 남긴 기록입니다.
1. 쉘 스크립트란?
저번에는 서버에서 여러 줄의 Unix 커맨드를 통해 spring boot 서버를 빌드하고 배포했었습니다.
git에서 소스를 끌어 오고, gradlew로 빌드 하고, 만약 서버가 실행중이라면 배포를 위해 종료하고, nohup 명령어로 백그라운드에서 실행시키고...
배포할때마다 매번 반복해서 입력해야 하는 명렁어들을 하나의 파일로 작성해,
나란히 실행시킬 수 있도록 하는 것이 바로 쉘 스크립트 입니다.
2. 작성하기
작성하면서 생각한 포인트는 아래와 같습니다.
- 중간중간 echo로 빌드 상황 comment
- 혹시모를 권한문제 회피를 위해 권한부여
- 백그라운드에서 실행중인 동일 프로젝트 존재할때만 process kill 할 수 있도록 분기처리
- nohup log를 일별로 분리하기 위해서 배포 전 백업
echo "> 애플리케이션 배포작업 시작"
PROJECT_REPOSITORY=~/URLumberjack
JAR_FILE_NAME=demo-0.0.1-SNAPSHOT.jar
chmod -R 775 $PROJECT_REPOSITORY
# git pull이 정상적으로 진행되는지 확인하기 위해 reset
git pull origin main
echo "> git pull"
git pull
echo "> gradle build"
chmod -R 775 $PROJECT_REPOSITORY
./gradlew build
echo "> 구동중 PID 확인"
CURRENT_PID=$(pgrep -f $JAR_FILE_NAME)
echo " 현재 구동중인 애플리케이션 PID: $CURRENT_PID"
if [ -z "$CURRENT_PID" ]; then
echo "> 현재구동중인 애플리케이션이 없으므로 종료하지 않습니다."
else
echo "> kill -9 $CURRENT_PID"
kill -9 $CURRENT_PID
sleep 10
fi
CUR_DTTM=$(date +%Y%m%d%H%M%S)
echo "nohup 백업 : nohup-${CUR_DTTM}.out"
mv $PROJECT_REPOSITORY/build/libs/nohup.out $PROJECT_REPOSITORY/nohup/nohup-${CUR_DTTM}.out
echo "> 새 애플리케이션 배포"
nohup java -jar $PROJECT_REPOSITORY/build/libs/$JAR_FILE_NAME 2>&1 &
echo "> 새 애플리케이션 배포작업 종료"
* 참고 if문과 -z 옵션
스크립트에서 if문은 다음과 같이 사용합니다.
if [ 옵선, 값1 또는 조건식 ]; then
수행문
else
위 조건과 불일치시 수행할 조건문
fi
저는 아래와 같이 사용했 습니다.
if [ -z "$CURRENT_PID" ]; then
echo "> 현재구동중인 애플리케이션이 없으므로 종료하지 않습니다."
else
echo "> kill -9 $CURRENT_PID"
kill -9 $CURRENT_PID
sleep 10
fi
"$CURRENT_PID" 변수의 길이가 0인지, 즉 할당된 값이 없는지 확인합니다.
0이면 if 문이 true이고 스크립트는 실행 중인 응용 프로그램이 없다는 메시지를 인쇄합니다.
0이 아닌 경우(할당된 값이 있음을 의미) if 문은 false이고 스크립트는 명령을 실행하여 실행 중인 프로세스를 종료합니다.
[ -z ] : 문자열의 길이가 0이면 참
[ -n ] : 문자열의 길이가 0이 아니면 참
[ -eq ] : 값이 같으면 참
[ -ne ] : 값이 다르면 참
[ -gt ] : 값1 > 값2
[ -ge ] : 값1 >= 값2
[ -lt ] : 값1 < 값2
[ -le ] : 값1 <= 값2
[ -a ] : &&연산과 동일 and 연산
[ -o ] : ||연산과 동일 xor 연산
[ -e ] : 파일이 있으면 참
[ -s ] : 파일의 크기가 0 보다 크면 참
[ -L ] : 파일이 심볼릭 링크면 참
[ -d ] : 파일이 디렉토리면 참
[ -r ] : 파일이 읽기 가능하면 참
[ -w ] : 파일이 쓰기 가능하면 참
[ -x ] : 파일이 실행 가능하면 참
[ 파일1 -nt 파일2 ] : 파일1이 파일2보다 최신파일이면 참
[ 파일1 -ot 파일2 ] : 파일1이 파일2보다 이전파일이면 참
[ 파일1 -ef 파일2 ] : 파일1이 파일2랑 같은 파일이면 참
반응형