5. EC2 우분투 최초 배포 or 자동 배포 프로세스 스크립트 최종 구축
EC2 우분투 자동 배포를 위한 스크립트(deploy.sh) 를 작성하였다. 아래 9가지 단계로 진행된다.
1. 환경변수 등록
2. 실행 중인 크론 종료
3. 현재 구동중인 서버 체크(구동 중이면 종료 / 구동되지 않고 있으면 최초 배포 준비(jdk 설치, timezone 설치))
4. 기존 프로젝트 폴더 삭제
5. git clone
6. 실행파일 권한 부여
7. 빌드
8. 실행
9. 지속적 배포 크론 재실행
환경변수
export LOVE="i love you" 환경변수 저장
echo $LOVE
= i love you
./.bashrc 에 적용하면 환경변수 영구히 사용 가능
1 aws 재부팅하면 적용되고 또는
2 source ./.bashrc 로 강제적용 할수도 있음
환경변수 적용범위
.bashrc 에 적용하면 어디서나 사용가능
터미널 만들고 source 적용 - 터미널이 꺼지기 직전까지 사용 가능
쉘 스크립트 파일로 변수를 만들고 다른 파일에서 실행하기 위해서는
- bashrc로 등록되어 있던지,
- source로 터미널에서 적용되어 있던지,
- deploy.sh 파일이 실행되는 동안에면 사용하려면 해당 파일에 source 코드를 작성
스프링 프로젝트 파일
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 // 재배포 할때는 기존 크론 (서버 1분마다 종료 확인해서 재시작 하는 것) 없애야 함, 재배포 과정 중 빌드중 파일에서 재시작 하면 이상해 지기 때문
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