카테고리 없음

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

빌럽스 2023. 12. 28. 23:13

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.gradlejar {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