일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 1차원 DP
- 2차원 dp
- 99클럽
- @Builder
- @Entity
- @GeneratedValue
- @GenericGenerator
- @NoargsConstructor
- @Query
- @Table
- @Transactional
- Actions
- Amazon EFS
- amazon fsx
- Android Studio
- ANSI SQL
- ApplicationEvent
- assertThat
- async/await
- AVG
- AWS
- Azure
- bind
- builder
- button
- c++
- c++ builder
- c03
- Callback
- case when
- Today
- Total
기록
배포자동화: 배포스크립트 작성 본문
시작하면서
스크립트 파일을 사용하여 배포를 조금더 편하게 하는 방법에 대해 공유하려고 한다. 현재 진행하고 있는 사이드 프로젝트는 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을 적용하여 쉽고 빠른 배포가 가능하도록 한다. 이후에는 배포전략에 대해서 소개하고 어떻게 적용할 수 있는지 정리해보자.
'DevOps' 카테고리의 다른 글
CICD 파이프라인 구축기(1) - 브런치 전략과 GITACTION (0) | 2024.09.02 |
---|---|
[issue] 쉘스크립트에서는 상대경로 대신 절대경로를 사용하자. (0) | 2024.07.08 |
[issue] .Ds_store 파일 관리하기 (0) | 2024.02.26 |
[issue] AWS-EC2: 연결성 검사에 실패했습니다, CPU 100% 점유 (0) | 2024.02.13 |
DevOps/AWS EC2 jar 배포하기 (0) | 2023.11.20 |