리눅스 스크립트 배포

merci·2023년 4월 5일
0

AWS

목록 보기
5/6

윈도우에서 리눅스 스크립트로 스프링 부트 실행해보기

복습해보기

name="$(date)"
echo ${name}
# 스크립트 실행 결과 
# Wed, Apr 5, 2023 3:42:09 PM

스크립트로 배포 설정

스크립트 파일 생성후

touch temp_deploy.sh

스크립트 파일에 아래 코드 작성

projects_dir=$(dirname $0)

project_name="mybatis_project"
project_repo="https://github.com/jaybon1/${project_name}.git"

git clone ${project_repo}

cd ${projects_dir}/${project_name}

./gradlew bootJar

cd ./build/libs

java -jar my*.jar

이후 스크립트를 실행하면 프로젝트를 클론 -> 빌드를 통해 로컬에서 배포가 된다.

./temp_deploy.sh 

로컬주소로 접속이 된다.


EC2에서 리눅스 스크립트로 스프링 부트 실행해보기

먼저 EC2 인스턴스 시작하고 mobaXterm에 비밀키를 넣어서 세션을 만들고 타임설정을 서울 + java를 설치한다.
스크립트 파일을 mobaXterm 폴더에 복사

이후 실행해본다.

./temp_deploy.sh

권한이 안되면 권한을 설정하고 다시 실행한다.

chmod 777 temp_deploy.sh

아래의 권한 오류가 발생한다면 스크립트에 권한을 추가해서 다시 만든다.

./temp_deploy.sh: line 18: ./gradlew: Permission denied

스크립트에 권한 설정 코드 추가

# 스크립트에 clone 뒤 권한코드 추가
chmod -R 777 ${projects_dir}/${project_name}

스크립트가 clone한 프로젝트 폴더를 제거한다.

rm -r mybatis_project

스크립트를 다시 mobaXterm에 복사후 권한설정을 한다.

chmod 777 temp_deploy.sh
# 이후 스크립트 실행
./temp_deploy.sh
# 프로세스 아이디 확인
ps -ef | grep my.*\.jar



퍼블릭 주소로 접속이 된다.


자동 재배포 설정

프로젝트가 꺼졌을 경우 재배포 해야한다.
프로젝트 버전이 달라질경우 재배포 해야한다.

스크립트를 수정한다.

프로젝트 폴더가 없을때만 clone을 한다.

# 폴더가 없으면 git clone
if [[ ! -d ${projects_dir}/${project_name} ]];
then
    echo "${project_name}을 클론합니다."
    git clone ${project_repo}
    chmod -R 777 ${projects_dir}/${project_name} # 클론하면 권한설정
fi

프로젝트 버전 파일이 없으면 생성한다.

if [[ ! -e version.txt ]];
then
    echo "version.txt 파일을 생성합니다."
    touch version.txt
    chmod 777 version.txt
fi

crontab으로 자동 배포 설정

crontab는 리눅스의 반복시스템으로 주기적으로 설정한 실행

crontab -e
*     *     *     *     *  command to be executed
-     -     -     -     -
|     |     |     |     |
|     |     |     |     +----- day of the week (0 - 6) (Sunday=0)
|     |     |     +------- month (1 - 12)
|     |     +--------- day of the month (1 - 31)
|     +----------- hour (0 - 23)
+------------- min (0 - 59)

2번 선택하면 vim 에디더가 열린다.

root@ip-172-31-33-193:/home/ubuntu/projects# crontab -e
no crontab for root - using an empty one

Select an editor.  To change later, run 'select-editor'.
  1. /bin/nano        <---- easiest
  2. /usr/bin/vim.basic
  3. /usr/bin/vim.tiny
  4. /bin/ed

Choose 1-4 [1]:

i눌러서 insert 모드로 변경


프로젝트 폴더 확인하고

다음과 같이 입력하면 1분마다 작업을 하게 된다.

* * * * * /home/ubuntu/projects/temp_deploy.sh

escctrl+c를 눌러 빠져나가고 :wq로 vim에디터를 나간다.

예를 들어, 매일 오전 3시 30분에 스크립트를 실행하려면 다음과 같이 작성

30 3 * * * /path/to/script.sh

5분마다 수행하려면 다음과 같이 작성

*/5 * * * /path/to/script.sh

매 시간 30분마다

30 * * * * /path/to/script.sh

매일 1시에 1분마다

* 1 * * * /path/to/script.sh
# 프로세스 아이디 확인
ps -ef | grep my.*\.jar

3.35.10.138

#!/bin/bash 
# bash 사용하도록 설정

echo "기존 crontab을 삭제합니다."
touch crontab_delete
crontab crontab_delete
rm crontab_delete

echo $(date)

projects_dir="/home/ubuntu/projects"

project_name="Village-Back-Project"
project_repo="https://github.com/clean17/${project_name}.git"

# 폴더가 없으면 git clone
if [[ ! -d ${projects_dir}/${project_name}/ ]]; then
    echo "${project_name}을 클론합니다."
    git clone ${project_repo} ${projects_dir}/${project_name}/
fi

echo "프로젝트 폴더로 이동합니다."
cd ${projects_dir}/${project_name}/

if [[ ! -f version.txt ]]; then
    echo "version.txt 파일을 생성합니다."
    touch version.txt
fi

git -c core.fileMode=false pull origin master
chmod 777 ./gradlew

# 버전이 같으면?
prev_version=$(cat version.txt)
now_version=$(git rev-parse master)

if [[ $prev_version == $now_version ]]; then
    echo "이전 버전과 현재 버전이 동일합니다."
    is_version_equals=true
else
    echo "이전 버전과 현재 버전이 다릅니다."
    is_version_equals=false
fi

# 프로세스가 켜져 있으면?
if pgrep -f ${project_name}.*\.jar >/dev/null; then
    echo "프로세스가 켜져 있습니다."
    is_process_on=true
else
    echo "프로세스가 꺼져 있습니다."
    is_process_on=false
fi

if [[ $is_version_equals == true && $is_process_on == true ]]; then
    echo "최신 버전 배포 상태입니다. 스크립트를 종료합니다."
else
    if [[ $is_process_on == true ]]; then
        echo "이전 프로세스를 중지합니다."
        pid=$(pgrep -f ${project_name}.*\.jar)
        kill -9 $pid
    fi

    echo "프로젝트를 빌드합니다."
    ./gradlew clean bootJar

    echo "./build/libs로 이동합니다."
    cd ./build/libs

    echo "프로젝트를 배포합니다."
    nohup java -jar *SNAPSHOT.jar 1>log.out 2>err.out &

    echo "프로젝트 폴더로 돌아옵니다."
    cd ..
    cd ..

    echo "현재 버전을 version.txt에 입력합니다."
    echo ${now_version} >version.txt
fi

if [[ "${1}_true" == "cron_true" ]]; then
    echo "cron을 재설정 합니다."
    touch crontab_new
    echo -e "* * * * * sudo ${projects_dir}/temp_deploy.sh cron" >>crontab_new
    # 크론탭 자체를 ?
    crontab crontab_new
    rm crontab_new
else
    echo "cron을 재설정하지 않습니다."
fi

수정된 코드로 배포 설정 확인

root@ip-172-31-36-241:/home/ubuntu/projects# ./temp_deploy.sh cron
기존 crontab을 삭제합니다.
Wed Apr 12 12:31:35 KST 2023
프로젝트 폴더로 이동합니다.
From https://github.com/jaybon1/mybatis_project
 * branch            master     -> FETCH_HEAD
Already up to date.
이전 버전과 현재 버전이 동일합니다.
프로세스가 켜져 있습니다.
최신 버전 배포 상태입니다. 스크립트를 종료합니다.
cron을 재설정 합니다.

프로세스를 죽인 후 재배포 확인

kill -9 [PID]
ps -ef | grep .*\T.jar

# 아래처럼 1분뒤 다시 실행이 된다.
root@ip-172-31-36-241:/home/ubuntu/projects# ps -ef | grep .*\T.jar
root        4919    4583  0 12:33 pts/1    00:00:00 grep --color=auto .*T.jar
root@ip-172-31-36-241:/home/ubuntu/projects# ps -ef | grep .*\T.jar
root        5004       1 35 12:34 ?        00:00:08 java -jar mybatis_project-0.0.1-SNAPSHOT.jar
root        5038    4583  0 12:34 pts/1    00:00:00 grep --color=auto .*T.jar

버전 삭제 후 재배포 확인

rm version.txt
ps -ef | grep .*\T.jar

# 1분뒤 새로운 프로세스가 실행된다.
root@ip-172-31-36-241:/home/ubuntu/projects/mybatis_project# ps -ef | grep .*\T.jar
root        5004       1  9 12:34 ?        00:00:08 java -jar mybatis_project-0.0.1-SNAPSHOT.jar
root        5067    4583  0 12:35 pts/1    00:00:00 grep --color=auto .*T.jar
root@ip-172-31-36-241:/home/ubuntu/projects/mybatis_project# ^C
root@ip-172-31-36-241:/home/ubuntu/projects/mybatis_project# ps -ef | grep .*\T.jar
root        5142       1 24 12:36 ?        00:00:08 java -jar mybatis_project-0.0.1-SNAPSHOT.jar
root        5178    4583  0 12:36 pts/1    00:00:00 grep --color=auto .*T.jar

또 다른 재배포 방법으로는 AWS의 엘라스틱 빈스톡과 깃헙의 액션을 이용하면 로드밸런싱이 가능하다.

profile
작은것부터

0개의 댓글