Skip to content

๐Ÿ‘ท [CICD] ๋ฐฐํฌ ํ…Œ์ŠคํŠธ #91

๐Ÿ‘ท [CICD] ๋ฐฐํฌ ํ…Œ์ŠคํŠธ

๐Ÿ‘ท [CICD] ๋ฐฐํฌ ํ…Œ์ŠคํŠธ #91

Workflow file for this run

name: Gamegoo v2 API CI/CD Pipeline
on:
pull_request:
types: [ closed ]
branches:
- develop
push:
branches:
- feat/178
workflow_dispatch: # ์ˆ˜๋™ ์‹คํ–‰ ๊ฐ€๋Šฅ
jobs:
build-and-deploy: # Job ์ด๋ฆ„
runs-on: ubuntu-latest # ์‹คํ–‰ ํ™˜๊ฒฝ - ๊ฐ€์žฅ ์ตœ์‹  ๋ฒ„์ „ Ubuntu ํ™˜๊ฒฝ
env: # ์ „์ฒด job์—์„œ ์‚ฌ์šฉํ•  ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์„ค์ •
JWT_SECRET: ${{ secrets.JWT_SECRET }}
RDS_PRIVATE_IP: ${{ secrets.RDS_PRIVATE_IP }}
RDS_PORT: ${{ secrets.RDS_PORT }}
DB_SCHEMA_NAME: ${{ secrets.DB_SCHEMA_NAME }}
DB_USERNAME: ${{ secrets.DB_USERNAME }}
DB_PASSWORD: ${{ secrets.DB_PASSWORD }}
GMAIL_PWD: ${{ secrets.GMAIL_PWD }}
RIOT_API: ${{ secrets.RIOT_API }}
DISCORD_WEBHOOK_URL: ${{ secrets.DISCORD_WEBHOOK_URL }}
SOCKET_SERVER_URL: ${{ secrets.SOCKET_SERVER_URL }}
steps:
# 1. GitHub Repository ํŒŒ์ผ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ
- name: Github Repository ํŒŒ์ผ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ
uses: actions/checkout@v4
# 2. ๊ถŒํ•œ ์„ค์ •
- name: gradlew ๊ถŒํ•œ ์„ค์ •
run: chmod +x ./gradlew
shell: bash
# 3. JDK 17 ์„ค์น˜
- name: JDK 17 ์„ค์น˜
uses: actions/setup-java@v4
with:
java-version: '17'
distribution: 'temurin'
# 4. Docker ํ™•์žฅ ๊ธฐ๋Šฅ ์ถ”๊ฐ€
- name: Docker ํ™•์žฅ ๊ธฐ๋Šฅ ์ถ”๊ฐ€
uses: docker/setup-buildx-action@v3
# 5. Docker Hub ๋กœ๊ทธ์ธ
- name: Docker Hub ๋กœ๊ทธ์ธ
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
# 6. Docker ์ด๋ฏธ์ง€ ์ƒ์„ฑ ๋ฐ Push
- name: Docker ์ด๋ฏธ์ง€ ์ƒ์„ฑ ๋ฐ push
uses: docker/build-push-action@v6
with:
context: . # Dockerfile ์œ„์น˜
file: ./Dockerfile # Dockerfile ๊ฒฝ๋กœ
push: true
tags: ${{ secrets.DOCKERHUB_USERNAME }}/gamegoo-api-v2:${{ github.sha }} # ์ด๋ฏธ์ง€ ํƒœ๊ทธ
platforms: linux/amd64
build-args: | # Dockerfile์—์„œ ์‚ฌ์šฉํ•  ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์ „๋‹ฌ
JWT_SECRET= ${{ secrets.JWT_SECRET }}
RDS_PRIVATE_IP= ${{ secrets.RDS_PRIVATE_IP }}
RDS_PORT= ${{ secrets.RDS_PORT }}
DB_SCHEMA_NAME= ${{ secrets.DB_SCHEMA_NAME }}
DB_USERNAME= ${{ secrets.DB_USERNAME }}
DB_PASSWORD= ${{ secrets.DB_PASSWORD }}
GMAIL_PWD= ${{ secrets.GMAIL_PWD }}
RIOT_API= ${{ secrets.RIOT_API }}
SOCKET_SERVER_URL= ${{ secrets.SOCKET_SERVER_URL }}
## CD (Continuous Deployment) ํŒŒํŠธ
# 7. EC2์— SSH๋กœ ์ ‘์†ํ•˜์—ฌ Docker ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰
- name: EC2์— ๋ฐฐํฌ
uses: appleboy/ssh-action@v1.1.0
with:
host: ${{ secrets.EC2_HOST }} # EC2 ํผ๋ธ”๋ฆญ IP
username: ubuntu # EC2 ์‚ฌ์šฉ์ž (๊ธฐ๋ณธ์€ ubuntu)
key: ${{ secrets.EC2_SSH_KEY }} # EC2 SSH Private Key
script_stop: true # SSH ๋ช…๋ น์–ด ์‹คํ–‰ ์ค‘ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์›Œํฌํ”Œ๋กœ ์ค‘๋‹จ
script: |
sudo fuser -k -n tcp 8080 || true
docker rm -f gamegoo-api-v2
docker pull ${{ secrets.DOCKERHUB_USERNAME }}/gamegoo-api-v2:${{ github.sha }}
docker run -d \
-p 8080:8080 \
--name gamegoo-api-v2 \
-v ${{ secrets.EC2_LOG_PATH }}:/app/logs \
-e SPRING_PROFILES_ACTIVE=dev \
-e JWT_SECRET=${{ secrets.JWT_SECRET }} \
-e RDS_PRIVATE_IP=${{ secrets.RDS_PRIVATE_IP }} \
-e RDS_PORT=${{ secrets.RDS_PORT }} \
-e DB_SCHEMA_NAME=${{ secrets.DB_SCHEMA_NAME }} \
-e DB_USERNAME=${{ secrets.DB_USERNAME }} \
-e DB_PASSWORD=${{ secrets.DB_PASSWORD }} \
-e GMAIL_PWD=${{ secrets.GMAIL_PWD }} \
-e RIOT_API=${{ secrets.RIOT_API }} \
-e SOCKET_SERVER_URL=${{ secrets.SOCKET_SERVER_URL }} \
${{ secrets.DOCKERHUB_USERNAME }}/gamegoo-api-v2:${{ github.sha }}
# 8. ๊ธฐ์กด Docker ์ด๋ฏธ์ง€ ์‚ญ์ œ
- name: ๊ธฐ์กด Docker ์ด๋ฏธ์ง€ ์‚ญ์ œ
run: sudo docker system prune -f
# ์‹คํŒจ ์‹œ ๋””์Šค์ฝ”๋“œ์— ์•Œ๋ฆผ ๋ณด๋‚ด๊ธฐ
- name: ๋ฐฐํฌ ์‹คํŒจ ์‹œ ๋””์Šค์ฝ”๋“œ ์•Œ๋ฆผ ์ „์†ก
if: failure() # ์ด์ „ ์Šคํ…์ด ์‹คํŒจํ•œ ๊ฒฝ์šฐ์—๋งŒ ์‹คํ–‰
run: |
PR_NUMBER="${{ github.event.pull_request.number }}"
PR_TITLE="${{ github.event.pull_request.title }}"
PR_AUTHOR="${{ github.event.pull_request.user.login }}"
PR_URL="${{ github.event.pull_request.html_url }}"
curl -X POST -H "Content-Type: application/json" \
-d "{\"content\": \"๐Ÿšจ **Gamegoo v2 API ๋ฐฐํฌ ์‹คํŒจ** ๐Ÿšจ\nPR ๋ฒˆํ˜ธ: ${PR_NUMBER}\nPR ์ œ๋ชฉ: ${PR_TITLE}\nPR ์ž‘์„ฑ์ž: ${PR_AUTHOR}\n[PR ๋ณด๊ธฐ](${PR_URL})\"}" \
$DISCORD_WEBHOOK_URL