야메 CI/CD 적용 완료!
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>
프로젝트 /.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 키는 다른 사용자가 확인할 수 없도록 되어 있어 보안상 좋습니다.
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 &