aws 배포 2단계: 스크립트 작성으로 배포 자동화

wisdom·2022년 9월 5일
0

백엔드 개발자라면?

목록 보기
26/42
  • 목표
    - 스크립트 작성으로 배포,재배포 자동화하기

IP

  • 공인 IP
  • 사설 IP

DHCP 할당

  • 유동 IP
    - 서버 운영 불가능!
  • 남는 IP를 부여해준다. 다른 IP로 변경해서 부여해준다.

환경변수

pwd -> /home/ubuntu
vi ./.bashrc

export OH="aaaaa"

source ./.bashrc (강제 적용) 또는 서버를 재부팅하면 oh 라는 환경변수가 등록되어서 사용할 수 있음
  • var.sh
#!/bin/bash

GITHUB_ID="wisdom08"
PROJECT_NAME="aws-v2"
PROJECT_VERSION="0.0.1"
PROJECT_PID=""
JAR_PATH=""

export GITHUB_ID
export PROJECT_NAME
export PROJECT_VERSION
export PROJECT_PID
export JAR_PATH


source ./var.sh
echo $GITHUB_ID

환경 변수 적용 범위

  • .bashrc 어디에서나 사용 가능
  • 터미널 만들고 source 적용
    - 터미널이 꺼지기 직전까지

쉘 스크립트(파일)로 변수를 만들고 다른 파일에서 실행하기 위해서는?

  • .bashrc 등록되어 있던지(광역적으로 설정)
  • 아니면 source로 터미널에서 적용이 되어 있던지(터미널이 꺼지면 못쓴다.)
  • deploy.sh 파일이 실행되는 동안에만 변수를 사용할 수 있으면 된다.
    - 파일에 source 라는 코드를 작성해주면 된다.

환경변수를 특정 파일에만 적용

  • deploy.sh
#!/bin/bash

source ./var.sh

echo $GITHUB_ID

--- 

chmod u+x deploy.sh
./deploy.sh

cron 종료 이휴

  • cron 으로 자바 프로젝트의 PID를 1분마다 감시한다.
    - 작동되고 있으면 cron은 아무 일도 안함
    - 종료 시, 서버를 재시작해주는 로직을 등록해줘야 함

재배포
1. 프로젝트 종료
2. github 다운
3. jar 빌드
4. 실행
----> 재배포를 하면 서버가 종료되는데 크론이 작동하면 꼬이게 된다. 즉 재배포시 크론이 1분마다 감시하는 걸 안 해야한다. (크론 정지)
+++++ 5. cron 등록

  • deploy.sh
#!/bin/bash

# 1. env variable
source ./var.sh
echo "1. env variable setup is complete"

# 2. delete cron
touch crontab_delete
crontab crontab_delete
rm crontab_delete
echo "2. deleting cron is complete"

서버 PID 찾아서 종료시키기

  • aws-v2-0.0.1.jar 이 형태로 실행파일이 만들어진다.
    - build.gradle 파일에서 version을 0.0.1로 변경했고, settings.gradle 파일에서 rootProject.name 이 aws-v2 이기 때문!
    - 그리고 buuild.gradle 파일에서 plain.jar 파일은 생성되지 않게 jar {enabled=false} 코드 추가함
  • 실행 -> aws-v2-0.0.1.jar 이름으로 실행됨

var.sh 파일 생성

"var.sh"

GITHUB_ID="wisdom08"
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

---

source var.sh
echo $JAR_PATH

스크립트 작성

"deploy.sh"


# 1. env variable
source ./var.sh
echo "1. env variable setup is complete"

# 2. delete cron
touch crontab_delete
crontab crontab_delete
rm crontab_delete
echo "2. deleting cron is complete"

# 3. check server
if [ -n "${PROJECT_PID}" ]; then
  # redeploy
  kill -9 $PROJECT_PID
  echo "3. project kill is complete"
else
  #first deploy

  #3-1 apt-update
  sudo apt-get -y update 1>/dev/null
  echo "3-1 apt-get update is complete"

  #3-2 jdk install
  sudo apt-get -y install openjdk-11-jdk 1>/dev/null
  echo "3-2 jdk-install is complete"

  #3-3 timezone
  sudo timedatectl set-timezone Asia/Seoul
  echo "3-3 timezone setting is complete"
fi

#4 delete project folder
rm -rf ${HOME}/${PROJECT_NAME}
echo "4 deleting project folder is complete"

#5 git clone
git clone https://github.com/${GITHUB_ID}/${PROJECT_NAME}.git
sleep 3s
echo "5 git clone is complete"

#6 gradles +x
chmod u+x ${HOME}/${PROJECT_NAME}/gradlew
echo "6 gradlew u+x is completed"

#7 build
cd ${HOME}/${PROJECT_NAME}
./gradlew build
echo "7 gradlew build is 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 cron registration
touch crontab_new
echo "* * * * * ${HOME}/check-and-restart.sh" 1>>crontab_new
#register the others ... you see >> (append)
crontab crontab_new
rm crontab_new
echo "9  cron registration complete"

프로젝트 폴더 삭제

rm -rf /home/ubuntu/aws-v2

프로젝트 액티브 설정

java -jar -Dspring.profiles.active=prod aws-v2-0.0.1.jar

cron 설정

  • check-and-restart.sh
#!/bin/bash

source ./var.sh

if [ -z "$PROJECT_PID" ]; then
        nohup java -jar -Dspring.profiles.active=prod ${JAR_PATH} 1>${HOME}/log.out 2>${HOME}/err.out &
fi

---
chmod u+x check-and-restart.sh

아래 3가지 스크립트만 있으면 언제든지 배포를 할 수 있다!

  • var.sh

  • check-and-restart.sh

  • deploy.sh

테스트없이 jar 빌드하고 싶을 때

./gradlew build -x test

tar 압축

  • -c: tar로 압축을 할 때
  • -v: 압축을 하거나 풀 때 출력을 화면에 보여줄지 말지
  • -f: 파일 이름을 지정할 수 있음
  • -x: tar로 압축을 풀 때
tar -cvf deploy.tar check-and-restart.sh deploy.sh var.sh

파일질라 이용해서 deploy.tar 파일 로컬로 옮기는 것까지 완료!

로컬에서 EC2 로 deploy.tar 파일을 옮겨서 실행해보자.

  • 기존 서버는 제거하고 새로운 서버를 다시 만들었다.
    - 파일질라를 이용해 로컬에 있는 deploy.tar 파일을 aws 서버로 옮긴다.
tar -xvf deploy.tar

만약에 gradle.build 파일에서 version이 바뀌거나, settings.gradle 에서 project name이 변경되는 경우? 
vi var.sh -> 변수 변경

./deploy.sh

netstat -nltp 8080 서버 도는 거 확인

kill -9 PID 8080 서버 죽이기 
------ > cron을 등록해놨기 때문에 1분 내 서버가 자동으로 다시 뜬다. 

그런데 서버가 죽으면 관리자한테 메일 등의 방법으로 알려줘야 하지 않을까? 추후 추가해보자

AWS-V2 배포 끝!

profile
문제를 정의하고, 문제를 해결하는

0개의 댓글