본문 바로가기
AWS, Infra/Jenkins

[Jenkins] war 파일 빌드 배포 설정

by RoJae 2022. 4. 8.

들어가면서..

Git의 소스가 수정되어 배포해야 하는 경우가 있다.
이때 배포 자동화 를 위해서 젠킨스 를 사용한다.

프로세스

  1. 젠킨스 workspace에서 clean을 하고, git에 있는 소스를 package를 하여 배포할 war파일을 얻는다.
  2. 이 war 파일을 sshpass를 통해서, was로 전달하는 방식이다.
  3. 이때, 톰켓을 restart 시켜준다.
    참고) 무중단 배포 를 위해서는 하드웨어적으로 가능하며, AWS EC2를 2개 를 두어 이중화 를 해주면 가능하다.
    프로젝트 경우에 따라서, 파이프 라인 설정이 필요할 수도 있다.

필요한 String Parameter

  • WAS_IP
  • WAS_ID
  • WAS_PWD
  • SSH_PORT

1. Maven clean

clean

2. 젠킨스 디렉토리 클린처리

SERVICE_WEBAPP_TARGET='/var/lib/jenkins/workspace/example-api/target'

# 0. Clear Jenkins webapp target

echo ">>> Clear Jenkins webapp target -- START"

# if Refresh Directory, do refresh
[[ -d ${SERVICE_WEBAPP_TARGET} ]] && echo "Directory exist"; rm -rf ${SERVICE_WEBAPP_TARGET}; echo ">>> Done. Refresh ${SERVICE_WEBAPP_TARGET}" || echo ">>> not exist ${SERVICE_WEBAPP_TARGET}"

echo ">>> Clear Jenkins webapp target -- DONE"

3. Maven Package

package

4. 현재 war파일 백업

# 1. Backup WAS's war
DATE=$(date '+%Y%m%d')
WAR_FILE=/home/was/app/webapps/ROOT.war
NEW_WAR_FILE=/home/was/app/backup/ROOT'_'$DATE.war


echo ">>> Backup WAS's war -- START"

sshpass -p $WAS_PWD ssh $WAS_ID@$WAS_IP -p$SSH_PORT -oStrictHostKeyChecking=no cp $WAR_FILE $NEW_WAR_FILE

echo ">>> Backup WAS's war -- DONE"

5. 젠킨스에서 빌드한 파일을 WAS 서버에 전송

# 2. Jenkins API ROOT.war send to Was Server
SERVICE_WEBAPP_TARGET=/var/lib/jenkins/workspace/example-api/target

echo ">>> Jenkins API ROOT.war send to Was Server -- START"

mv $WORKSPACE/target/*.war $WORKSPACE/target/ROOT.war
sshpass -p $WAS_PWD scp -o StrictHostKeyChecking=no -P $SSH_PORT $SERVICE_WEBAPP_TARGET/*.war $WAS_ID@$WAS_IP:/home/example-api/app/webapps/

echo ">>> Jenkins API ROOT.war send to Was Server -- DONE"

6. Tomcat 재시작

  • 메모리가 해제되었다가, 재시작하기 위해서 10초의 간격을 줌. (restart.sh)
# 3. WAS Tomcat Restart
TOMCAT_HOME=/home/was/tomcat-8080
TOMCAT_RESTART=$TOMCAT_HOME/bin/restart.sh

echo ">>> Was Tomcat Restart -- START"

sshpass -p $WAS_PWD ssh $WAS_ID@$WAS_IP -p$SSH_PORT -oStrictHostKeyChecking=no sh ${TOMCAT_RESTART}

echo ">>> Was Tomcat Restart -- DONE"

참고

  • restart.sh
tomcat_home=/home/was/tomcat-8080
tomcat_shutdown=/home/was/tomcat-8080/bin/shutdown.sh
tomcat_start=/home/was/tomcat-8080/bin/startup.sh

export LANG=ko_KR.UTF-8

echo "Line:${LINENO} > Shutdown tomcat now...."
bash ${tomcat_shutdown}
echo "Line:${LINENO} > tomcat is now terminated..."

sleep 3

if [ -z "`ps -eaf | grep java | grep /WAS/apache-tomcat-9.0.19/bin`" ]; then
        echo "Line:${LINENO} > Tomcat was terminated successfully."
else
        ps -eaf | grep java | grep ${tomcat_home}/bin | awk '{print $2}' | while read PID
                do
                        echo "Line:${LINENO} > Killing $PID... "
                        kill -9 $PID
                        echo "Line:${LINENO} > Tomcat is being shutdowned"
                done
fi

echo "Line:${LINENO} > tomcat restart now"
bash ${tomcat_start}

if [ -z "`ps -eaf | grep java | grep ${tomcat_home}/bin`" ]; then
        echo "Line:${LINENO} > Error!!! Cannot start tomcat server."
else
        echo "Line:${LINENO} > Tomcat restart succcessfully. "
fi

echo "Line:${LINENO} > Job finished"

댓글