๐ท [CICD] ๋ฐฐํฌ ํ ์คํธ #91
Workflow file for this run
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |