티스토리 뷰
목표
gitlab의 CI/CD기능을 이용해서 master branch에 push하게 되면 AWS EC2에 spring boot jar를 빌드 및 배포 까지 완료하는것입니다.
시작하기
gitlab ci/cd 코드 작성
최대한 민감한 정보는 환경변수로 설정하려고 노력하였습니다.
CI/CD 단계는 build -> test -> deploy 순으로 진행됩니다. linux 서버의 /home/ec2-user/app/build/ 경로에 배포합니다.
image: java:8-jdk
stages:
- build
- test
- deploy
cache:
paths:
- .gradle/wrapper
- .gradle/caches
build:
stage: build
script: ./gradlew clean build
artifacts:
paths:
- build/libs/*.jar
expire_in: 1 week
only:
- master
test:
stage: test
script: ./gradlew test
deploy-to-ec2:
stage: deploy
before_script:
- 'command -v ssh-agent >/dev/null || ( apt-get update -y && apt-get install openssh-client -y )'
- eval $(ssh-agent -s)
- echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add -
- mkdir -p ~/.ssh
- chmod 700 ~/.ssh
- echo "$SSH_KNOWN_HOSTS" >> ~/.ssh/known_hosts
- chmod 644 ~/.ssh/known_hosts
script:
- ssh -o StrictHostKeyChecking=no ec2-user@"$DEPLOY_SERVER" 'rm -f ~/app/build/*.jar'
- ssh -o StrictHostKeyChecking=no ec2-user@"$DEPLOY_SERVER" 'mkdir -p ~/app/build'
- scp build/libs/*.jar ec2-user@"$DEPLOY_SERVER":~/app/build/demo.jar
- ssh -o StrictHostKeyChecking=no ec2-user@"$DEPLOY_SERVER" '~/deploy.sh'
only:
- master
gitlab dvariables 등록
settings - CI/CD - variables
DEPLOY_SERVER: EC2 IP
SSH_PRIVATE_KEY: PEM 값
sh 파일 생성
shell script 파일에는 현재 실행중인 java 어플리케이션이 있다면 중지시키고 (없다면 생략) 새로 업로드 된 애플리케이션을 실행하도록 하는 코드가 포함되어 있습니다. 원격으로 해당 코드를 작성하면 불편하니 미리 대상 서버에 작성해 두었습니다.
REPOSITORY=/home/ec2-user/app/build
cd $REPOSITORY/
echo "> 현재 구동중인 애플리케이션 pid 확인"
CURRENT_PID=$(pgrep -f demo)
echo "$CURRENT_PID"
if [ -z $CURRENT_PID ]; then
echo "> 현재 구동중인 애플리케이션이 없으므로 종료하지 않습니다."
else
echo "> kill -15 $CURRENT_PID"
kill -15 $CURRENT_PID
sleep 5
fi
echo "> 새 어플리케이션 배포"
JAR_NAME=$(ls $REPOSITORY/ |grep 'demo' | tail -n 1)
echo "> JAR Name: $JAR_NAME"
nohup java -jar $REPOSITORY/$JAR_NAME &>/dev/null &
마지막 &>dev/null & 은 gitlab console에서 log때문에 멈춰버리는 현상 방지
gitlab에서 실행할 수 있도록 권한 변경
> sudo chmod 755 deploy.sh
master branch에 스프링 부트 소스 push
(이때 gradlew 의 권한이 permission denied 가 뜰 수 있음 이 경우 gradlew 의 권한을 허용해줘야함)
windows 기준
git update-index --chmod=+x gradlew
'IT Info' 카테고리의 다른 글
WEB과 WAS를 분리하는 이유 (0) | 2021.02.26 |
---|
댓글