코딩기록
5. EC2 우분투 최초 배포 or 지속적 배포 자동 프로세스 스크립트 최종 구축 본문
재배포 절차는 다음의 9가지 단계로 진행된다. 해당 절차의 코드 내용을 정리하였다.
1. 환경변수 등록 -> 2. 실행 중인 크론 종료 -> 3. 현재 구동중인 서버 체크(구동 중이면 종료 / 구동되지 않고 있으면 최초 배포 준비(jdk 설치, timezone 설치)) -> 4. 기존 프로젝트 폴더 삭제 -> 5. git clone -> 6. 실행파일 권한 부여 -> 7. 빌드 -> 8. 실행 -> 9. 지속적 배포 크론 재실행
cf) 환경변수 설정하는 방법
export LOVE="i love you" 환경변수 저장
echo $LOVE
= i love you
./.bashrc 에 적용하면 환경변수 영구히 사용 가능
1 aws 재부팅하면 적용되고 또는
2 source ./.bashrc 로 강제적용 할수도 있음
deploy.sh
#!/bin/bash
source ./var.sh 환경변수 사용을 위해 환경변수를 등록하는 것
echo $GITHUB_ID
환경변수 적용범위
.bashrc 에 적용하면 어디서나 사용가능
터미널 만들고 source 적용 - 터미널이 꺼지기 직전까지 사용 가능
쉘 스크립트 파일로 변수를 만들고 다른 파일에서 실행하기 위해서는
- bashrc로 등록되어 있던지,
- source로 터미널에서 적용되어 있던지,
- deploy.sh 파일이 실행되는 동안에면 사용하려면 해당 파일에 source 코드를 작성
재배포 할때는 기존 크론 (서버 1분마다 종료 확인해서 재시작 하는 것) 없애야 함
재배포 과정 중 재시작 하면 이상해지기 때문
재배포 완료되면 다시 재시작 크론 등록
서버 PID를 찾아 종료시키는 로직
스프링 프로젝트 파일
setting.gradle 파일: aws-v2
build.gradle: -0.0.1.jar
-> aws-v2-0.0.1.jar 형태로 실행파일이 만들어짐
aws-v2-0.0.1-plain.jar - 라이브러리를 포함하지 않은 프로젝트 빌드 파일
(plain 파일 만들지 않는 설정 : 스프링 프로젝트의 build.gradle에서 jar {enabled = false} 기재)
var.sh : 필요한 환경변수를 세팅한다.
#!/bin/bash : 배시문법을 사용할거라고 알려주는 것
GITHUB_ID="codingspecialist"
PROJECT_NAME="aws-v2"
PROJECT_VERSION="0.0.1"
PROJECT_PID="$(pgrep -f ${PROJECT_NAME}-${PROJECT_VERSION}.jar)"
JAR_PATH="${HOME}/${PROJECT_NAME}/build/libs/${PROJECT_NAME}-${PROJECT_VERSION}.jar"
export GITHUB_ID
export PROJECT_NAME
export PROJECT_VERSION
export PROJECT_PID
export JAR_PATH
deploy.sh : 9단계에 걸쳐 신규배포 또는 지속적 배포를 자동적으로 수행하게 한다.
#!/bin/bash
# 1. env variable 외부변수 등록
source ./var.sh
echo "1. env variable complete"
# 2. clone delete
touch crontab_delete
crontab crontab_delete
rm crontab_delete
echo "2. cron delete complete"
# 3. server checking
if [ -n "${PROJECT_PID}" ]; then #글자가 있으면 true
# re deploy
kill -9 $PROJECT_PID
echo " 3.project kill complete"
else # 글자가 없다면 false = 처음배포하기
# first deploy
#3-1 apt update
sudo apt-get -y update 1>/dev/null #bash에서 배포할 때는 apt-get 붙이기 / -y붙여서 바로 하게하기
echo "3-1 apt update complete"
#bash -> -get -y check!
#3-2 jdk install
sudo apt-get -y install openjdk-11-jdk 1>/dev/null # 표준출력을 쓰레기통에 버리기
echo "3-2 jdk install complete"
#3-3 timezone
sudo timedatectl set-timezone Asia/Seoul
echo "3-3 timezone setting complete"
fi
#4. project folder delete
rm -rf ${HOME}/${ROJECT_NAME}
echo "4. project folder delete complete"
#5. git clone
git clone https://github.com/${GITHUB_ID}/${PROJECT_NAME}.git
sleep 3s #비동기방식일 수 있으므로 다운로드 받는 시간 3초 주기 필요
echo "5. git clone complete"
#6. gradlew +x
sudo chmod u+x /${HOME}/${PROJECT_NAME}/gradlew
echo "6.gradlew chmod complete"
#7. build
cd /${HOME}/${PROJECT_NAME} # 파일 실행은 꼭 파일이 들어있는 폴더로 이동해서 실행해야 함
./gradlew build
echo "7. build complete"
#8. start jar
nohup java -jar -Dspring.profiles.active=prod ${JAR_PATH} 1>${HOME}/log.out 2>${HOME}/err.out &
echo "8. start server complete"
#9. crontab registration
touch crontab_new
echo "* * * * * ${HOME}/check-and-restart.sh" 1>>crontab_new
crontab crontab_new
rm crontab_new
echo "9.cron registration complete"
check-and-restart.sh 크론탭 재시작 스크립트
source ./var.sh
if [ -z ${PROJECT_PID} ]; then
nohup java -jar -Dspring.profiles.active=prod ${JAR_PATH} 1>log.out 2>err.out &
echo "스프링부트 재실행 완료"
fi
특정 프로필로 스프링 프로젝트 실행하는 법
java -jar -Dspring.profiles.active=프로필명 파일명
테스트 없이 빌드하고 싶을 때
./gradlew build -x test
tar 압축 방법
-c 묶을때
-v 압축을 하거나 볼때 출력을 화면에서 보여줄지 말지
-f 파일 이름을 지정할 수 있음
-x tar 압축을 풀때
압축하기
tar -cvf hello.tar a.txt b.txt
풀기
tar -xvf hello.tar
'인프라 > 리눅스, AWS' 카테고리의 다른 글
AWS 프리티어 public IPv4 과금 중지 및 SSH Tunneling으로 RDS 접속하기(MySQL Workbench 사용) (0) | 2024.06.23 |
---|---|
AWS SQS @SqsListener 작동 안함 원인파악 (Spring cloud AWS 3버전 관련) (0) | 2024.04.04 |
9. Github Action을 통한 최종 배포 진행 (3) | 2024.01.02 |
8. GithubAction, 로드밸런서를 통한 최종 배포 환경설정 (1) | 2023.12.31 |
7. CI/CD의 개념 / AWS 로드밸런서 및 IAM의 이해 (0) | 2023.12.31 |