Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
77 changes: 29 additions & 48 deletions .github/workflows/deploy.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
name: Deploy to GCP
name: Deploy to NCP

on:
push:
Expand All @@ -9,75 +9,58 @@ jobs:
runs-on: ubuntu-latest

steps:
# ์ฝ”๋“œ ์ฒดํฌ์•„์›ƒ
- name: Checkout
uses: actions/checkout@v4

# 1. JDK ์„ค์น˜ ๋ฐ ๋นŒ๋“œ
# JDK 21 ์„ค์น˜
- name: Set up JDK 21
uses: actions/setup-java@v4
with:
java-version: '21'
distribution: 'temurin'
cache: gradle

# Gradle wrapper ์‹คํ–‰ ๊ถŒํ•œ ๋ถ€์—ฌ
- name: Grant execute permission for gradlew
run: chmod +x gradlew

# Gradle๋กœ ํ”„๋กœ์ ํŠธ ๋นŒ๋“œ (ํ…Œ์ŠคํŠธ ์ œ์™ธ)
- name: Build with Gradle (skip tests)
run: ./gradlew clean build -x test

# 2. GCP ์ธ์ฆ ๋ฐ Docker ์„ค์ •
- name: Google Auth
uses: 'google-github-actions/auth@v2'
with:
credentials_json: '${{ secrets.GCP_SA_KEY }}'

- name: 'Set up Cloud SDK'
uses: 'google-github-actions/setup-gcloud@v2'

- name: 'Docker Auth'
run: gcloud auth configure-docker ${{ secrets.GCP_REGION }}-docker.pkg.dev
# NCR(Naver Container Registry) ๋กœ๊ทธ์ธ
- name: Login to NCR
run: |
echo ${{ secrets.NCP_SECRET_KEY }} | docker login ${{ secrets.NCR_REGISTRY }} \
-u ${{ secrets.NCP_ACCESS_KEY }} \
--password-stdin

# 3. Docker ์ด๋ฏธ์ง€ ๋นŒ๋“œ ๋ฐ Artifact Registry ํ‘ธ์‹œ
# Docker ์ด๋ฏธ์ง€ ๋นŒ๋“œ ๋ฐ NCR์— ํ‘ธ์‹œ
- name: Build and Push Docker Image
run: |
REGISTRY="${{ secrets.GCP_REGION }}-docker.pkg.dev/${{ secrets.GCP_PROJECT_ID }}/${{ secrets.GCP_REPOSITORY }}"
IMAGE_NAME="link-it-backend"
SHA=${{ github.sha }}

docker build -t $REGISTRY/$IMAGE_NAME:$SHA -t $REGISTRY/$IMAGE_NAME:latest .
docker push $REGISTRY/$IMAGE_NAME:$SHA
docker push $REGISTRY/$IMAGE_NAME:latest
IMAGE_SHA_TAG=${{ secrets.NCR_REGISTRY }}/link-it-backend:${SHA}
IMAGE_LATEST_TAG=${{ secrets.NCR_REGISTRY }}/link-it-backend:latest

# 4. GCE ์„œ๋ฒ„๋กœ docker-compose.prod.yml ํŒŒ์ผ ์ „์†ก
- name: Copy docker-compose to GCE
uses: appleboy/scp-action@v0.1.7
with:
host: ${{ secrets.GCP_VM_IP }}
username: ${{ secrets.GCP_SSH_USER }}
key: ${{ secrets.GCP_SSH_KEY }}
source: "docker-compose.prod.yml"
target: "/opt/link-it"
overwrite: true
docker build -t $IMAGE_SHA_TAG .
docker push $IMAGE_SHA_TAG

docker tag $IMAGE_SHA_TAG $IMAGE_LATEST_TAG
docker push $IMAGE_LATEST_TAG

# 5. GCE ์„œ๋ฒ„์—์„œ ๋ฐฐํฌ ์‹คํ–‰
- name: Deploy on GCP Compute Engine
# ์„œ๋ฒ„์—์„œ Docker ์ปจํ…Œ์ด๋„ˆ ๋ฐฐํฌ
- name: Deploy on NCP
uses: appleboy/ssh-action@v1.2.0
with:
host: ${{ secrets.GCP_VM_IP }}
username: ${{ secrets.GCP_SSH_USER }}
key: ${{ secrets.GCP_SSH_KEY }}
host: ${{ secrets.NCP_HOST }}
username: ${{ secrets.NCP_SSH_USER }}
key: ${{ secrets.NCP_SSH_KEY }}
command_timeout: 30m
script: |
# ๋””๋ ‰ํ† ๋ฆฌ ์ƒ์„ฑ ๋ฐ ๊ถŒํ•œ ์„ค์ •
sudo mkdir -p /opt/link-it
sudo chown -R ${{ secrets.GCP_SSH_USER }}:${{ secrets.GCP_SSH_USER }} /opt/link-it
cd /opt/link-it

# .env ํŒŒ์ผ ์ƒ์„ฑ
cat > .env << 'EOF'
GCP_REGION=${{ secrets.GCP_REGION }}
GCP_PROJECT_ID=${{ secrets.GCP_PROJECT_ID }}
GCP_REPOSITORY=${{ secrets.GCP_REPOSITORY }}
DB_HOST=${{ secrets.DB_HOST }}
DB_PORT=${{ secrets.DB_PORT }}
DB_NAME=${{ secrets.DB_NAME }}
Expand Down Expand Up @@ -108,13 +91,11 @@ jobs:
NCP_BUCKET_NAME=${{ secrets.NCP_BUCKET_NAME }}
EOF

# ์„œ๋ฒ„ ๋‚ด๋ถ€ Docker Registry ๋กœ๊ทธ์ธ
echo '${{ secrets.GCP_SA_KEY }}' | docker login -u _json_key --password-stdin https://${{ secrets.GCP_REGION }}-docker.pkg.dev
echo ${{ secrets.NCP_SECRET_KEY }} | docker login ${{ secrets.NCR_REGISTRY }} \
-u ${{ secrets.NCP_ACCESS_KEY }} \
--password-stdin

# ์ปจํ…Œ์ด๋„ˆ ๊ฐฑ์‹  ๋ฐ ์‹คํ–‰
docker compose -f docker-compose.prod.yml down || true
docker pull ${{ secrets.GCP_REGION }}-docker.pkg.dev/${{ secrets.GCP_PROJECT_ID }}/${{ secrets.GCP_REPOSITORY }}/link-it-backend:latest
docker pull ${{ secrets.NCR_REGISTRY }}/link-it-backend:latest
docker compose -f docker-compose.prod.yml up -d

# ๋ฏธ์‚ฌ์šฉ ์ด๋ฏธ์ง€ ์ •๋ฆฌ
docker image prune -f
4 changes: 1 addition & 3 deletions docker-compose.prod.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,6 @@ services:
image: mysql:8.0
container_name: link-it-mysql
restart: always
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
MYSQL_DATABASE: ${DB_NAME}
Expand Down Expand Up @@ -47,7 +45,7 @@ services:
max-file: "3"

app:
image: ${GCP_REGION}-docker.pkg.dev/${GCP_PROJECT_ID}/${GCP_REPOSITORY}/link-it-backend:latest
image: link-it-registry.kr.ncr.ntruss.com/link-it-backend:latest
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

์šด์˜ ํ™˜๊ฒฝ(production)์—์„œ๋Š” ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€์— latest ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์ง€์–‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. latest ํƒœ๊ทธ๋Š” ๋ฐฐํฌ ์‹œ์ ์— ์–ด๋–ค ๋ฒ„์ „์˜ ์ด๋ฏธ์ง€๊ฐ€ ์‚ฌ์šฉ๋˜๋Š”์ง€ ๋ถˆ๋ถ„๋ช…ํ•˜๊ฒŒ ๋งŒ๋“ค๋ฉฐ, ์ด๋ฏธ์ง€ ์—…๋ฐ์ดํŠธ ์‹œ ์˜๋„์น˜ ์•Š์€ ๋ณ€๊ฒฝ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์–ด ๋กค๋ฐฑ๊ณผ ๋””๋ฒ„๊น…์„ ์–ด๋ ต๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ํŠน์ • ๋ฒ„์ „ ํƒœ๊ทธ(์˜ˆ: ์ปค๋ฐ‹ ํ•ด์‹œ ๋˜๋Š” ์‹œ๋งจํ‹ฑ ๋ฒ„์ €๋‹)๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.\n\n๋˜ํ•œ, ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ์ฃผ์†Œ๊ฐ€ ํ•˜๋“œ์ฝ”๋”ฉ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ๊ทœ์น™์— ๋”ฐ๋ผ ํ™˜๊ฒฝ๋ณ„ ์„ค์ •์€ YAML ํŒŒ์ผ ๋‚ด์—์„œ ๊ธฐ๋ณธ๊ฐ’์„ ํฌํ•จํ•œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

References
  1. For environment-specific configurations in YAML files, use environment variables with default values instead of hardcoding or commenting out values.

container_name: link-it-backend
restart: always
ports:
Expand Down
Loading