본문 바로가기
개발툴

jenkins 빌드에서 github action 빌드 배포로 이전

by 탁구치는 개발자 2024. 8. 20.

요즘 핫하다는 github action 을 사용해 보았습니다.

현재는 NAS에서 구동되고 있는 jenkins 에서 프로젝트 빌드를 한 후 배포를 하고 있습니다. https://lng1982.tistory.com/413

현재 구조
code push -> github -> jenkins -> build -> jar 생성 -> shell script 실행 -> 서버 기동

github action 적용 후 변경되는 구조
code push -> github -> github action 실행 -> build -> jar 생성 -> ssh를 통한 NAS 서버 연결 -> jar 배포, shell script 배포 -> shell script 실행 -> 서버 기동

github action 적용은 어렵지 않았습니다.
프로젝트 하위에 .github > workflows > maven.yml 파일을 생성하였고, 해당 파일 안에 다음과 같이 설정을 추가하였습니다.

name: Java CI with Maven

on:
  push:
    branches: [ "master" ]

jobs:
  build:

    runs-on: ubuntu-latest

    steps:
      - name: checkout repository
        uses: actions/checkout@v4

      - name: set up JDK 17
        uses: actions/setup-java@v4
        with:
          java-version: '17'
          distribution: 'temurin'
          cache: maven

      - name: build maven
        run: mvn -B clean package --file pom.xml

      - name: Extract last commit message
        id: extract_commit
        run: echo "LAST_COMMIT_MESSAGE=$(git log -1 --pretty=%B)" >> $GITHUB_ENV

      - name: upload jar
        uses: appleboy/scp-action@master
        with:
          host: ${{ secrets.REMOTE_HOST }}
          username: ${{ secrets.REMOTE_USER }}
          password: ${{ secrets.REMOTE_PASSWORD }}
          port: ${{ secrets.REMOTE_PORT }}
          source: "target/*.jar"
          strip_components: 1
          target: ${{ secrets.REMOTE_HOME }}/app

      - name: upload script
        uses: appleboy/scp-action@master
        with:
          host: ${{ secrets.REMOTE_HOST }}
          username: ${{ secrets.REMOTE_USER }}
          password: ${{ secrets.REMOTE_PASSWORD }}
          port: ${{ secrets.REMOTE_PORT }}
          source: "script/*"
          strip_components: 1
          target: ${{ secrets.REMOTE_HOME }}/app/script

      - name: execute remote script
        uses: appleboy/ssh-action@master
        with:
          host: ${{ secrets.REMOTE_HOST }}
          username: ${{ secrets.REMOTE_USER }}
          password: ${{ secrets.REMOTE_PASSWORD }}
          port: ${{ secrets.REMOTE_PORT }}
          script_stop: true
          script: |
            cd ${{ secrets.REMOTE_HOME }}/app/script
            chmod +x *.sh
            sh send_telegram.sh "${{ env.LAST_COMMIT_MESSAGE }}"            
            sh start_server.sh "${{ github.run_number }}"


위의 워크플로우를 요약하면 다음과 같습니다.

  • 소스 체크아웃
  • java 프로젝트 빌드
  • 생성된 jar 파일과 shell script를 원격 서버에 전송
  • 서버에서 shell script 실행
  • 서버 구동

 

${{ secrets.REMOTE_HOST }} 와 같이 민감한 정보는 github 사이트에서 해당 프로젝트 이동 후 Settings에 들어가시면 됩니다. 왼쪽 메뉴에 Secrets and variables > Actions 를 클릭하면 다음과 같이 Repository secrets 정보를 등록 관리 하실 수 있습니다.

 

프로젝트 빌드를 github action 으로 이전하게 됨으로써 NAS에서 jenkins를 더이상 운용하지 않아도 되었기에 메모리를 절약 할 수 있었습니다.