복습해보기
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 인스턴스 시작하고 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
퍼블릭 주소로 접속이 된다.
프로젝트가 꺼졌을 경우 재배포 해야한다.
프로젝트 버전이 달라질경우 재배포 해야한다.
스크립트를 수정한다.
# 폴더가 없으면 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 -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
esc
나 ctrl+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의 엘라스틱 빈스톡과 깃헙의 액션을 이용하면 로드밸런싱이 가능하다.