기록

배포자동화: 배포스크립트 작성 본문

DevOps

배포자동화: 배포스크립트 작성

youngyin 2024. 3. 25. 00:00

시작하면서

스크립트 파일을 사용하여 배포를 조금더 편하게 하는 방법에 대해 공유하려고 한다. 현재 진행하고 있는 사이드 프로젝트는 EC2에 ssh콘솔에 접속해서 배포를 진행하고 있다. (2023.11.20 - [DevOps] - DevOps/AWS EC2 jar 배포하기)

배포 프로세스를 단순하고 쉽게 하기 위해서 배포때 사용할 스크립트를 작성하였다. 아래에서는 스크립트의 구성과 주의해야 할점을 몇가지 소개하려고 한다.

본문

스크립트 작성하기

  • 전체스크립트
더보기
공통함수를 모아둔 apiProject.sh
#!/bin/bash

# Functions
check_running() {
  pgrep -f "$COMMAND" > /dev/null
}

find_pid_using_port() {
  netstat -tulpn | grep ":$PORT" | awk '{print $7}' | cut -d'/' -f1
}

start_service() {
  if check_file_existence "$JAR_FILE"; then
    echo "JAR file exist..."
  else
    echo -e "JAR file does not exist. Cannot proceed.\n"
    exit 0
  fi

  if check_running; then
    echo -e "ApiService is already running.\n"
  else
    if netstat -tulpn | grep ":$PORT" > /dev/null; then
      echo "Another service is running on port $PORT"
      echo "Service details:"
      netstat -tulpn | grep ":$PORT"

      read -p "Do you want to kill it and start ApiService? (y/n): " answer
      if [ "$answer" == "y" ]; then
        kill $(find_pid_using_port)
      else
        echo "Start aborted."
        exit 1
      fi
    fi

    nohup $COMMAND > /dev/null 2>&1 &
    echo -e "ApiService started on port $PORT with profiles.active=$PROFILES_ACTIVE \n"
  fi
}

stop_service() {
  if check_running; then
    pkill -f "$COMMAND"
    echo -e "ApiService stopped.\n"
  else
    echo -e "ApiService is not running.\n"
  fi
}

print_status() {
  if check_running; then
    echo -e "ApiService is running.\n"
  else
    echo -e "ApiService is not running.\n"
  fi
}

check_file_existence() {
    local file_path="$1"
    if [ -f "$file_path" ]; then
        return 0
    else
        return 1
    fi
}

 

local 환경에서 서비스를 배포하기 위한 스크립트
#!/bin/bash

# Variables
readonly PROFILES_ACTIVE="local"
readonly PORT="9090"
readonly JAR_FILE="apiProject.jar"
readonly COMMAND="java -jar -Dspring.profiles.active=$PROFILES_ACTIVE $JAR_FILE"
source apiProject.sh

# Service Management
case "$1" in
  start)
    start_service
    ;;
  stop)
    stop_service
    ;;
  status)
    print_status
    ;;
  *)
    echo "Usage: $0 {start|stop|status}"
    exit 2
    ;;
esac

exit 0
  • 변수선언
PROFILES_ACTIVE="dev"

위처럼 선언할수 있다. 다만 주의할 점은 띄어쓰기를 포함하면 유효하지 않은 명령어라는 오류가 난다.

  • 함수 선언/호출
check_file_existence() {
    local file_path="$1"
    if [ -f "$file_path" ]; then
        return 0
    else
        return 1
    fi
}

check_file_existence "$JAR_FILE"

함수는 위처럼 선언할수 있고, 매개변수는 순서대로 #1, #2.. 로 함수내부에서 전달받을 수 있다.

  • 외부파일 import
source apiProject.sh
  • case when
case "$1" in
  start)
    start_service
    ;;
  stop)
    stop_service
    ;;
  *)
    echo "Usage: $0 {start|stop|status}"
    exit 2
    ;;
esac
  • 옵션값 받기
TARGET_FILE_PATH=$1
TO_PATH=$2
CONFIG_FILE_PATH=$3
echo "Usage: $0 $TARGET_FILE_PATH $TO_PATH $CONFIG_FILE_PATH>"

순서대로 1, 2, 3번째로 입력받은 값이 할당된다. 예를 들어서 "./sample.sh a b c"라고 쉘에서 입력했으면 "Usage: ./sample.sh ㅁ b c"가 쉘에 출력된다.

실행권한 부여하기

스크립트 파일에 실행권한을 적용하지 않으면 권한거부 오류가 발생한다.

# 오류 발생
permission denied: ./deploy-dev.sh

# 실행권한 부여
chmod +x deploy-dev.sh

적용하기

더 공부할 것

EC2 관련 스크립트

AWS ssh 콘솔에 연결하고, 로컬의 jar 파일을 EC2 인스턴스 내부로 옮기기 위해서 사용하는 명령어가 너무나 길다. 그래서 매번 명령어를 입력하는 것이 귀찮고, 오타도 자주 났었다. 이를 위한 스크립트 파일들도 작성하였고, 다음 포스팅에서 소개하겠다.

Github Action 적용하기

프로젝트에 변경사항이 있을 때마다 쉽게 반영할수 있도록 CI/CD가 구축되어야 한다. 현재는 배포 프로세스가 복잡하다보니 매번 새로 배포하는 것이 어렵다. Github Action을 적용하여 쉽고 빠른 배포가 가능하도록 한다. 이후에는 배포전략에 대해서 소개하고 어떻게 적용할 수 있는지 정리해보자.

 

Comments