티스토리 뷰

목표

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
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함