목차

GitHub Actions 으로 간단한 CD 구성하기

🗓️

후속편 안내

본 글이 인기가 좋아 후속편을 작성했다. 아래 간단히 배포하는 것 보다 좀 더 세분화 된 내용을 담았다.
글 보러가기


GitHub Actions CI/CD

  • 기본적으로 github action에서 호스트로 push하는 방식이다.

GitHub Actions workflow

name: remote ssh command for deploy
on:
  push:
    # main 브랜치에서만 작동합니다.
    branches: [main]
    paths-ignore:
      - 'README.md'
      - 'docs/**'

jobs:
  build:
    name: Build
    runs-on: ubuntu-latest
    steps:
      - name: executing remote ssh commands using key
        uses: appleboy/ssh-action@master
        with:
          host: ${{ secrets.HOST }}
          username: ${{ secrets.USERNAME }}
          key: ${{ secrets.KEY }}
          port: ${{ secrets.PORT }}
          script: |
            cd git/swlabs-helper
            sh deploy.sh
  • ${{ secrets.HOST }}를 비롯한 나머지 4개의 환경변수는 Setting – secrets 에서 등록한다.
  • 주요내용은 main 브랜치에서 push가 일어나면 github의 ubuntu 인스턴스에서 ssh를 통해 원격지의 deploy.sh를 실행시킨다는 내용이다.

deploy.sh 내용 (20210920 업데이트)

#!/bin/bash

source ~/.bash_profile

cd ..

APP_NAME=webboard
REPOSITORY=`pwd`
RELEASE=release

# 저장소로부터 소스를 업데이트 받습니다.
git pull

# gradle 빌드와 jar 파일 패키징 작업을 합니다. (작업 완료시 .jar파일 생성)
sh gradlew build

# .jar 파일 타겟팅
JAR_NAME=$(ls $REPOSITORY/build/libs | grep jar | head -n 1)
JAR_PATH=$REPOSITORY/build/libs/$JAR_NAME

# 현재 실행중인 서버가 있으면 잡아서 종료 시킵니다.
CURRENT_PID=$(pgrep -f $APP_NAME)
if [ -z $CURRENT_PID ]
then
  echo ">>>> java process not found."
else
  echo ">>>> PID: $CURRENT_PID kill."
  kill -15 $CURRENT_PID
  sleep 15
fi

# .jar 파일 java 실행합니다.
echo ">>>> $JAR_PATH java execute."
nohup java -jar $JAR_PATH --spring.config.location=classpath:/application.properties --spring.profiles.active=$RELEASE > /dev/null 2> /dev/null < /dev/null &
sleep 5
CURRENT_PID=$(pgrep -f $APP_NAME)
echo ">>>> New PID: $CURRENT_PID"
  • 이 스크립트가 하는 내용은 다음과 같다
  1. 저장소에서 코드 가져오기
  2. Maven 빌드하기 (package로 jar파일 만들기)
  3. 재시작을 위한 자바 프로세스 종료
  4. java -jar 실행으로 스프링부트 기동

GitHubs Atcions test

  • https://github.com/platanus-kr/actiontest
  • 잘된다.