야메 CI/CD 적용 완료!

🧑🏻‍💻 Scenario


gradle 빌드 실행(현재 테스트 과정 pass) → 아티펙트 업로드 [CI]

아티펙트 다운로드 → scp를 통해 AWS 서버로 빌드 파일 전송 → ssh를 통해 AWS 서버의 shell script 실행(script.sh 참고) [CD]

<aside> 💡 해당 과정이 정상적으로 수행 되었을 경우, AWS 서버의 ~/cicd 에 *.jar, output.log 파일이 생성됩니다. output.log 파일을 통해 서버 로그를 확인할 수 있습니다. shell script로 scp를 통해 내려받은 .jar 파일을 실행합니다. 만약 기존 서버가 실행 중이라면 종료한 후에 실행됩니다. 이 과정에서 잠시 서버가 중단됩니다. (무중단 아님)

</aside>

🖇️ Workflow file


프로젝트 /.github/workflows/Deploy.yml

name: Java CI/CD with Gradle

on:
  push:
    branches: [ "main" ]

permissions:
  contents: read

concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: true

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
        with:
          token: ${{ secrets.GH_ACCESS_TOKEN }}
          submodules: 'recursive'

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

      - name: Grant execute permission for gradlew
        run: chmod +x gradlew

      - name: Build with Gradle
        run: ./gradlew clean build --exclude-task test

      - name: Upload artifact
        uses: actions/upload-artifact@v2
        with:
          name: boonbae
          path: build/libs/*.jar

  deploy:
    needs: build
    runs-on: ubuntu-latest
    steps:
      - name: Download artifact
        uses: actions/download-artifact@v2
        with:
          name: boonbae

      - name: SCP transfer
        uses: appleboy/[email protected]
        with:
          host: ${{ secrets.SERVER_IP }}
          username: ${{ secrets.SSH_USER }}
          port: 22
          key: ${{ secrets.SSH_PRIVATE_KEY }}
          source: "*.jar"
          target: "~/cicd"

      - name: Execute remote commands
        uses: appleboy/[email protected]
        with:
          host: ${{ secrets.SERVER_IP }}
          username: ${{ secrets.SSH_USER }}
          key: ${{ secrets.SSH_PRIVATE_KEY }}
          port: 22
          script: ~/cicd/script.sh
      #          script: |
      #            sudo fuser -k 8080/tcp
      #            sudo nohup java -jar ~/cicd/*.jar &

      - uses: sarisia/actions-status-discord@v1
        if: always()
        with:
          webhook: ${{ secrets.DISCORD_WEBHOOK }}
          status: ${{ job.status }}
          description: "배포 진행 상황 보고"
          url: "<https://github.com/Team-Algebra/boonbae-backend/actions>"
          color: 0x72db58
          username: 배포 안내

Settings > Security > Actions 에 리포지터리 시크릿키가 등록되어 있고, workflow 파일에서 secrets.~ 를 통해 사용할 수 있습니다. 등록된 secrets 키는 다른 사용자가 확인할 수 없도록 되어 있어 보안상 좋습니다.

📝 script.sh


AWS서버 ~/cicd/script.sh

#!/bin/bash

# Kill the process using port 8080
sudo fuser -k 80/tcp

# Start the Java application in the background
sudo nohup java -jar -Duser.timezone=Asia/Seoul  ~/cicd/*.jar > ~/cicd/output.log 2>&1 &
sudo nohup java -jar -Duser.timezone=Asia/Seoul nanum-0.0.1-SNAPSHOT.jar > ./output.log 2>&1 &