HomeAboutMeBlogGuest
© 2025 Sejin Cha. All rights reserved.
Built with Next.js, deployed on Vercel
🛁
공부기록
/
📹
DevOps
/
배포스크립트 이해하기

배포스크립트 이해하기

#!/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번

  • 프로젝트 디렉터리 주소는 스크립트 내에서 자주 사용하는 값이기 때문에 변수로 지정
  • PROJECT_NAME도 동일하다.
  • 쉘에서는 타입 없이 선언하여 저장한다.
  • 쉘에서는 $ 변수명으로 변수를 사용할 수 있다.

2번

  • 제일 처음 깃을 clone 받았던 디렉토리로 이동
  • 바로 위의 쉘 변수 설명을 따라 이동하게 된다.

3번

  • 디렉토리 이동 후 master브랜치의 최신 내용을 받는다.

4번

  • 프로젝트 내부의 gradlew로 build를 수행한다.

5번

  • 빌드 결과물인 jar파일을 복사해 jar 파일을 모아둔 위치로 복사한다.

6번

  • 기존에 수행중이던 스프링 부트 애플리케이션을 종료시킨다
  • pgrep은 process id에만 추출하는 명령어다.
  • f 옵션은 프로세스 이름으로 찾는 기능이다.

7번

  • 현재 구동 중인 프로세스가 있는지 없는지를 판단해서 기능을 수행한다.
  • 프로세스 id 값을 보고 프로세스가 있으면 해당 프로세스를 종료한다.

8번

  • 새로 실행할 jar파일명을 찾는다.
  • 여러 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 &