aws로 그럴듯한 인프라 만들기 3 - 배포스크립트
1. 배포 스크립트 작성
우선 두괄식으로다가 내가 만든 배포 스크립트를 공개해보겠다.
#!/bin/bash## 변수 설정txtrst='\033[1;37m' # Whitetxtred='\033[1;31m' # Redtxtylw='\033[1;33m' # Yellowtxtpur='\033[1;35m' # Purpletxtgrn='\033[1;32m' # Greentxtgra='\033[1;30m' # GrayBRANCH='miniminis'## 함수 설정### 저장소 변경사항 체크function check_df() { git fetch
master=$(git rev-parse $BRANCH) remote=$(git rev-parse origin/$BRANCH) echo -e ">>>>> master : $master" echo -e ">>>>> remote : $remote" if [[ $master == $remote ]]; then return 1 fi return 0}### 저장소 pullfunction pull() { echo -e "${txtgrn}>>>>> Pull Request 🏃♂️ 통해 코드를 업데이트 합니다. (from origin $BRANCH) ${txtrst}" git pull origin $BRANCH echo -e "${txtgrn}>>>>> origin $BRANCH 으로부터 성공적으로 Pull 완료되었습니다. ${txtrst}"}### 현재 process 조회 후 종료function killProcess() { pid=$(pgrep -f subway-0.0.1-SNAPSHOT.jar) if [[ -n "$pid" ]]; then echo -e "${txtgrn}>>>>> 진행 중인 process($pid)가 존재하므로 종료합니다. ${txtrst}" kill -15 $pid echo -e "${txtgrn}>>>>> 프로세스가 정상적으로 종료되었습니다. ${txtrst}" return 0 fi echo -e "${txtgrn}>>>>> 진행 중인 process가 없습니다. ${txtrst}"}## 배포 스크립트echo -e "${txtylw}=======================================${txtrst}"echo -e "${txtgrn} << subway의 배포를 시작합니다 🧐 >>${txtrst}"echo -e "${txtylw}=======================================${txtrst}"echo -e "${txtgrn}>>>>> 원격 저장소의 변경사항을 체크합니다.${txtrst}"check_dfif [[ $? -eq 1 ]];then echo -e ">>>>> [$(date)] 업데이트 내용이 없으므로 프로그램을 종료합니다. 😫" exit 0
fiecho -e ">>>>> [$(date)] 업데이트 내용이 있습니다. "pullecho -e "${txtgrn}>>>>> 현재 진행 중인 process가 있는지 조회하고 있다면, 종료합니다. ${txtrst}"killProcessecho -e "${txtgrn}>>>>> 새로운 앱 빌드를 실행합니다.${txtrst}"./gradlew clean build -x test
echo -e "${txtgrn}>>>>> 빌드한 앱을 시작합니다. 실행 환경을 선택해주세요(local/prod) ${txtrst}"read envif [[ "$env" = "prod" ]]; then echo -e "${txtgrn}>>>>> 운영 환경에서 앱 배포를 시작합니다.${txtrst}" java -jar -Dspring.profiles.active=prod ./build/libs/subway-0.0.1-SNAPSHOT.jar &elif [[ "$env" = "local" ]]; then echo -e "${txtgrn}>>>>> 로컬 환경에서 앱 배포를 시작합니다.${txtrst}" java -jar -Dspring.profiles.active=local ./build/libs/subway-0.0.1-SNAPSHOT.jar &else echo -e "${txtgrn}>>>>> 존재하지 않는 환경입니다. 프로세스를 종료합니다. ${txtrst}" exit 0
fiecho -e "${txtylw}=======================================${txtrst}"echo -e "${txtgrn}<< subway의 배포가 성공적으로 완료되었습니다 🎉>>${txtrst}"echo -e "${txtylw}=======================================${txtrst}"
Shell
복사
사실 위의 스크립트는 코드를 읽을 줄 안다면, 어느정도는 이해하는데 무리가 없을 것이라고 생각한다. 그래서 아래에는 위의 스크립트를 만드는데 유용하게 사용했던 내용들을 몇 가지 소개할까한다.
2. 뼈대 - 반복적으로 작성하는 명령어를 script 로 작성해보기
#!/bin/bash## 변수 설정txtrst='\033[1;37m' # Whitetxtred='\033[1;31m' # Redtxtylw='\033[1;33m' # Yellowtxtpur='\033[1;35m' # Purpletxtgrn='\033[1;32m' # Greentxtgra='\033[1;30m' # Grayecho -e "${txtylw}=======================================${txtrst}"echo -e "${txtgrn} << 스크립트 🧐 >>${txtrst}"echo -e "${txtylw}=======================================${txtrst}"## 저장소 pull## gradle build## 프로세스 pid를 찾는 명령어## 프로세스를 종료하는 명령어## ...
Shell
복사
3. 기능 단위로 함수로 만들기
•
기능 단위로 함수를 만드니까 나중에 오류가 발생했을 때나, 수정해야할 때, 알아보기가 쉬워서 좋았다.
function pull() { echo -e "" echo -e ">> Pull Request 🏃♂️ " git pull origin master
}pull;
Shell
복사
4. 스크립트 실행시 파라미터를 전달해볼수도 있다
#!/bin/bash## ...EXECUTION_PATH=$(pwd)SHELL_SCRIPT_PATH=$(dirname $0)BRANCH=$1PROFILE=$2## 조건 설정if [[ $# -ne 2 ]]then echo -e "${txtylw}=======================================${txtrst}" echo -e "${txtgrn} << 스크립트 🧐 >>${txtrst}" echo -e "" echo -e "${txtgrn} $0 브랜치이름 ${txtred}{ prod | dev }" echo -e "${txtylw}=======================================${txtrst}" exitfi## ...
Shell
복사
•
실행시 파라미터를 전달하도록 하여 범용성 있는 스크립트를 작성해본다.
•
read 명령어를 활용하여 사용자의 Y/N 답변을 받도록 할 수도 있다.
5. github branch 변경이 있는 경우 감지하기
•
git branch 에 변경이 있는 경우, 이를 감지하여 스크립트가 동작되도록 작성해본다.
function check_df() { git fetch
master=$(git rev-parse $BRANCH) remote=$(git rev-parse origin/$BRANCH) if [[ $master == $remote ]]; then echo -e "[$(date)] Nothing to do!!! 😫" exit 1
fi}
Shell
복사
6. crontab을 활용하기
•
매 분마다 동작하도록한 후 log를 확인해보자.
•
crontab과 /etc/crontab의 차이에 대해 학습해보자.