코딩기록

5. EC2 우분투 최초 배포 or 지속적 배포 자동 프로세스 스크립트 최종 구축 본문

인프라/리눅스, AWS

5. EC2 우분투 최초 배포 or 지속적 배포 자동 프로세스 스크립트 최종 구축

빌럽스 2024. 1. 27. 14:46

재배포 절차는 다음의 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