[GitHub] Actions로 서버에 자동배포하기

과정

시작하기에 앞서 과정부터 설명해드리겠습니다.
master branch에 push 가 되면 GitHub Actions 에서
소스를 build 를 하고 추출된 jar 를 서버에 이동시킨 뒤 서버에서 기동되도록 합니다.

master push > github actions > 개인서버

SSH Key 생성

Jar 파일 전송과 서버에서의 script 실행을 위해서 SSH를 사용합니다.
그래서 SSH Key 를 생성해줍니다.
해당 키는 Actions에서 사용할 SSH 플러그인(?) 에서 요구하는 사항이라
PEM 형태의 키로 생성합니다.

ssh-keygen -m PEM -t rsa -b 4096

해당 명령어를 실행하면 몇가지 질문이 나오는데 그냥 엔터 엔터 해줍니다.
생성이 끝나고나면 ~/.ssh 경로에 id_rsaid_rsa.pub 파일이 생성됩니다.

vi id_rsa

vi 명령어로 파일을 열어봅니다.

아주 길게 암호화된 키가 있습니다.
그럼 이제 이파일의 전체 내용을 복사합니다.
—–BEGIN 부터 —END 도 다 포함해줍니다.

Secret Data

이제 Actions 파일을 만들어 보기전에 Secret Data 를 만들겁니다.
이게 뭐냐면 GitHub에서 특정 변수 값을 암호화 해서 사용할수있게 만드는 겁니다.
그냥 작성해도 되지만 Secret 을 사용하게되면 GitHub 계정을 해킹당하더라도
서버의 중요 정보는 털리지 않기 때문에 꼭 사용하길 권장합니다.
안그러면 GitHub을 해킹당하는 순간 서버도 해킹을 당하는거나 마찬가지겠죠?

해당 Repository 사이트로 이동하여 Settings 에 들어갑니다.
들어가면 Secrets and variables > actions 로 이동합니다.

여기서 Secret data 를 생성할 수 있습니다.
New repository secret 을 클릭하여 생성해봅니다.

SERVER_HOST 는 서버 아이피 (포트제외) ex) 123.123.123.123
SERVER_KEY 에는 아까 복사한 SSH Key
SERVER_USERNAME 은 서버 로그인 아이디 입니다.

Action 파일 생성

자 이제 준비는 끝났습니다.
Actions 파일을 만들어보겠습니다.
Actions 를 클릭해보면 set up a workflow yourself 를 클릭하여
새롭게 만들어보겠습니다.

이제 action 파일을 작성해보자
env 에는 변수를 선언할수있다.
jar 파일을 서버에 둘 경로와 jar 파일명을 선언하였다.

name: Deploy to Server

on:
  push:
    branches:
      - master
env:
  FILE_PATH: /var/www/batch/
  FILE_NAME: batch.jar
  
jobs:
  deploy:
    runs-on: ubuntu-latest
    
    steps:
      - name: Checkout Repository
        uses: actions/checkout@v2

      - name: Set up JDK
        uses: actions/setup-java@v2
        with:
          distribution: 'adopt'
          java-version: '17'

      - name: Gradle Permission
        run: chmod +x gradlew
        
      - name: Build and Package
        uses: gradle/gradle-build-action@v3.0.0-beta.1
        with:
          arguments: build
          
      - name: Deploy
        uses: easingthemes/ssh-deploy@v5.0.0
        with:
          REMOTE_HOST: ${{ secrets.SERVER_HOST }}
          REMOTE_USER: ${{ secrets.SERVER_USERNAME }}
          SSH_PRIVATE_KEY: ${{ secrets.SERVER_KEY }}
          REMOTE_PORT: 22
          SOURCE: 'build/libs/${{env.FILE_NAME}}'
          TARGET: '${{env.FILE_PATH}}'
          SCRIPT_AFTER: |
            pid=$(ps aux | grep "${{env.FILE_NAME}}" | grep -v grep | awk '{print $2}')
            echo "pid : $pid"
            echo "jar : ${{env.FILE_PATH}}${{env.FILE_NAME}}"
            if [ -n "$pid" ]; then
              kill -9 $pid  
            fi
            nohup java -jar ${{env.FILE_PATH}}${{env.FILE_NAME}} 2>&1 &

과정을 설명하자면 ubuntu 환경에서 repository를 checkout 한다.
그 후 jdk 를 setup 하고 gradle 로 빌드 한다.
이후 빌드되서 나온 jar 파일을 서버로 전송한다.
그리고 기존 실행되어있는 batch.jar 가 있다면 kill 해준다.
마지막으로 jar 파일을 실행해준다.

env 에 jar 경로와 파일명을 미리 선언해주어서 사용하였다.
그리고 앞서 등록했던 secret 변수로 ssh 를 사용하였다.
gradle build가 완료되면 기본 경로는 build/libs 에 jar 가 생성된다.

참고로 jar 의 이름은 build.gradle 에서 수정할 수 있다.
나는 jar 파일이 batch.jar 로 추출되도록 하였다.
원하는 이름으로 jar 가 생성되도록 수정해주자.

// build.gradle
bootJar{
    archiveFileName = 'batch.jar'
}

Actions 확인

자 이제 master brach 에 push 를 했을때 actions가 잘 실행되는지 확인해보자.
master brach 에 push 를 해주고 actions 메뉴에 와보면 우리가 만든게 실행이 되고있는걸 확인할 수 있다.

클릭을 해서 보면 더 자세하게 볼 수 있다.
이제 dev brach에서 개발 후 master 에 push 해준다면
자동으로 배포까지 되도록 설정이 완료되었다.

actions 는 개인이 쓰기에 무료에 좋다.
외부값을 받아서도 쓸수도있고 기능이 꽤나 많은듯하다.

Leave a Comment