#!/bin/bash
REPOSITORY=/home/ec2-user/app/step1 --- 1
PROJECT_NAME=karrot_market
cd $REPOSITORY/$PROJECT_NAME/ --- 2
echo "> Git Pull" --- 3
git pull
echo "> 프로젝트 build 시작"
./gradlew build --- 4
echo "> step1 디렉토리 이동"
cd $REPOSITORY
echo "> Build 파일 복사"
cp $REPOSITORY/$PROJECT_NAME/build/libs/*.jar $REPOSITORY/ --- 5
echo "> 현재 구동중인 애플리케이션 pid 확인하기"
CURRENT_PID=$(pgrep -f ${PROJECT_NAME}.*.jar) --- 6
echo "현재 구동중인 애플리케이션 pid : $CURRENT_PID"
if [ -z "$CURRENT_PID" ]; then --- 7
echo "> 현재 구동중인 애플리케이션이 없으므로 종료하지 않습니다."
else
echo "> kill -15 $CURRENT_PID"
kill -15 $CURRENT_PID
sleep 5
fi
echo "> 새 애플리케이션 배포"
JAR_NAME=$(ls -tr $REPOSITORY/ | grep jar | tail -n 1) --- 8
echo "> Jar Name: $JAR_NAME"
nohup java -jar $REPOSITORY/$JAR_NAME 2>&1 & --- 9
1번
- 프로젝트 디렉터리 주소는 스크립트 내에서 자주 사용하는 값이기 때문에 변수로 지정
- 쉘에서는 $ 변수명으로 변수를 사용할 수 있다.
2번
- 제일 처음 깃을 clone 받았던 디렉토리로 이동
- 바로 위의 쉘 변수 설명을 따라 이동하게 된다.
3번
- 디렉토리 이동 후 master브랜치의 최신 내용을 받는다.
4번
- 프로젝트 내부의 gradlew로 build를 수행한다.
5번
- 빌드 결과물인 jar파일을 복사해 jar 파일을 모아둔 위치로 복사한다.
6번
- 기존에 수행중이던 스프링 부트 애플리케이션을 종료시킨다
- pgrep은 process id에만 추출하는 명령어다.
7번
- 현재 구동 중인 프로세스가 있는지 없는지를 판단해서 기능을 수행한다.
- 프로세스 id 값을 보고 프로세스가 있으면 해당 프로세스를 종료한다.
8번
- 여러 jar 파일이 생기기 때문에 tail -n으로 가장 나중의 jar 파일을 변수에 저장한다.
9번
- 찾은 jar 파일명으로 해당 jar 파일을 nohup으로 실행한다.
- 스프링 부트의 장점으로 특별히 외장 톰캣을 설치할 필요가 없다.
- 내장 톰캣을 사용해서 jar 파일만 있으면 바로 웹 애플리케이션 서버를 실행할 수 있다.
- 일반적으로 자바를 실행할 때는 java -jar라는 명령어를 사용하지만 이렇게 하면 사용자가 터미널 접속을 끊을 때 같이 애플리케이션도 종료된다.
- 애플리케이션 실행자가 터미널을 종료해도 애플리케이션은 계속 구동될 수 있도록 nohup 명령어를 사용한다.
자동배포를 위한 쉘 스크립트
# !/bin/bash
REPOSITORY=/home/ec2-user/app/deploy
PROJECT_NAME=rentshop
echo "> 현재 구동중인 애플리케이션 pid 확인"
CURRENT_PID=$(pgrep -f ${PROJECT_NAME}.*.jar)
echo "현재 구동 중인 애플리케이션 pid: $CURRENT_PID"
if [ -z "$CURRENT_PID" ]; then
echo "> 현재 구동중인 애플리케이션이 없으므로 종료하지 않습니다."
else
echo "> kill -15 $CURRENT_PID"
kill -15 $CURRENT_PID
sleep 5
fi
echo "> 새 애플리케이션 배포"
JAR_NAME=$(ls -tr $REPOSITORY/*.jar | tail -n 1)
echo "> Jar Name : $JAR_NAME"
nohup java -jar \\
-Dspring.config.location=classpath:/application.yml,/home/ec2-user/app/application-real-db.yml,classpath:/application-real.yml \\
-Dspring.profiles.active=real \\
$JAR_NAME > $REPOSITORY/nohup.out 2>&1 &