반응형
작업 개요
스프링부트 프로젝트를 war빌드한 파일을 서버에 올려 실행하기 까지의 작업이 번거로워 만들게 되었다
* 아직은 jenkins 나 gitlab을 구성할 수 없는 상황임
목표
리눅스 커멘드로 사용자로부터 파일명을 입력받아 실행하면 파일이 원하는 경로에 백업 및 복사되고 자동 재시작한다
(원하는 경우 재시작이 잘 되고있는 지 tail -f 로그도 출력한다)
실행 예제
절대경로, 상대경로가 가능하며 끝에 tail을 붙일경우 로그출력
(알리아스(~/.bashrc) 등록 정보 : alias patch='alias | /home/patch.sh')
1. patch myproject-0.0.1-SNAPSHOT-plain.war tail
2. patch myproject-0.0.1-SNAPSHOT-plain.war
3. patch /home/users/zzint/myproject-0.0.1-SNAPSHOT-plain.war tail
4. patch /home/users/zzint/myproject-0.0.1-SNAPSHOT-plain.war
소스 전문
(개인 환경이 포함된 소스는 한글로 치환하였습니다)
#!/bin/bash
PWD=`pwd`
WEB_DIR=war파일이 들어갈 경로
BACKUP_DIR=$WEB_DIR/backup
# 첫번째로 입력받을 변수
FILE_TO_APPLY=$1
# 두번째로 입력받을 변수
IS_TAIL=$2
# 현재시간을 20220527190517 형식으로 변수에 담음(백업에 사용)
NOW_TIME=`date +%Y%m%d%H%M%S`
# 파일 경로를 /(슬래쉬) 대신 공백으로 치환한다
FILE_NAME_SPLIT=`echo "$FILE_TO_APPLY" | tr "\/" " "`
# 파일 경로를 배열 변수에 넣는다
FILE_NAME_LIST=(`echo "$FILE_TO_APPLY" | tr "\/" "\n"`)
# 배열의 사이즈를 구한다
FILE_NAME_SIZE=${#FILE_NAME_LIST[@]}
# 공백을 기준으로 맨 끝(사이즈의 크기) 순서에 있는 덩어리를 가져온다(확장자를 포함한 파일명이 됨)
FILE_NAME=`echo "$FILE_NAME_SPLIT" | awk '{print $'"$FILE_NAME_SIZE"'}'`
# 파일 경로를 입력하지 않으면 튕겨냄
if [ -z "$FILE_TO_APPLY" ]; then
echo "FILE_TO_APPLY is empty"
exit 0
fi
# 입력한 정보가 절대경로로 입력한 것인지, 상대경로로 입력한 것인지 판단하기 위함
if [[ "$FILE_TO_APPLY" == *\/* ]]; then
echo "target file : $FILE_TO_APPLY"
else
FILE_TO_APPLY=$PWD/$FILE_TO_APPLY
echo "target file : $FILE_TO_APPLY"
fi
# stop
sudo systemctl stop 정지할프로세스
# backup
rm -rf $BACKUP_DIR/WEB-INF $BACKUP_DIR/META-INF
mv $WEB_DIR/WEB-INF $WEB_DIR/META-INF $BACKUP_DIR/
tar -zcvf $BACKUP_DIR/backup_${NOW_TIME}.tar.gz $BACKUP_DIR/WEB-INF $BACKUP_DIR/META-INF
# move file to apply
rm -rf $WEB_DIR/*.war
cp -rp $FILE_TO_APPLY $WEB_DIR/
cd $WEB_DIR
jar xvf $WEB_DIR/$FILE_NAME
chown -R 권한:권한 $WEB_DIR/WEB-INF $WEB_DIR/META-INF
rm -rf $WEB_DIR/$FILE_NAME
# start
sudo systemctl start 시작할 프로세스
# 두번째 입력받는 변수에 tail을 넣으면 로그를 출력한다
if [ "$IS_TAIL" == "tail" ]; then
tail -f $WEB_DIR/logs/원하는 로그파일.log
fi
반응형