Skip to content

Continuous Deployment #19

Continuous Deployment

Continuous Deployment #19

Workflow file for this run

name: Continuous Deployment
on:
push:
branches:
- main
workflow_dispatch:
jobs:
build-and-deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
with:
ref: main # 배포는 항상 main 브랜치 기준으로 실행
- name: Set up Java
uses: actions/setup-java@v4
with:
java-version: '24'
distribution: 'oracle'
- name: Replace placeholders with secrets
run: |
sed -i 's/${JWT_SECRET:[^}]*}/${{ secrets.JWT_SECRET }}/g' src/main/resources/application.yml
sed -i 's/${DB_HOST:[^}]*}/${{ secrets.DB_HOST }}/g' src/main/resources/application.yml
sed -i 's/${DB_USERNAME:[^}]*}/${{ secrets.DB_USERNAME }}/g' src/main/resources/application.yml
sed -i 's/${DB_PASSWORD:[^}]*}/${{ secrets.DB_PASSWORD }}/g' src/main/resources/application.yml
sed -i 's/${GEMINI_API_KEY:[^}]*}/${{ secrets.GEMINI_API_KEY }}/g' src/main/resources/application.yml
sed -i 's|${SLACK_WEBHOOK_URL:[^}]*}|${{ secrets.SLACK_WEBHOOK_URL }}|g' src/main/resources/application.yml
- name: Setup Gradle cache
uses: actions/cache@v4
with:
path: |
~/.gradle/caches
~/.gradle/wrapper
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle.kts', '**/gradle-wrapper.properties') }}
restore-keys: |
${{ runner.os }}-gradle-
- name: Grant execute permission for gradlew
run: chmod +x ./gradlew
- name: Build with Gradle
run: ./gradlew build -x test
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Login to Private Container Registry
uses: docker/login-action@v3
with:
registry: ${{ secrets.REGISTRY_URL }}
username: ${{ secrets.REGISTRY_USERNAME }}
password: ${{ secrets.REGISTRY_PASSWORD }}
- name: Build and push Docker image
uses: docker/build-push-action@v6
with:
context: .
push: true
platforms: linux/amd64
tags: ${{ secrets.REGISTRY_URL }}/${{ secrets.IMAGE_NAME }}:${{ github.sha }}
- name: Deploy to Server
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.SERVER_HOST }}
username: ${{ secrets.SERVER_USERNAME }}
password: ${{ secrets.SERVER_PASSWORD }}
key: ${{ secrets.SSH_PRIVATE_KEY }}
script: |
CONTAINER_NAME=gamchi-app
NETWORK_NAME=gamchi-network
docker login -u ${{ secrets.REGISTRY_USERNAME }} -p ${{ secrets.REGISTRY_PASSWORD }} ${{ secrets.REGISTRY_URL }}
docker pull ${{ secrets.REGISTRY_URL }}/${{ secrets.IMAGE_NAME }}:${{ github.sha }}
if [ $(docker ps -a -q --filter "name=$CONTAINER_NAME") ]; then
docker stop $CONTAINER_NAME
docker rm $CONTAINER_NAME
fi
docker run -d \
--name $CONTAINER_NAME \
--network $NETWORK_NAME \
-p 8080:8080 \
${{ secrets.REGISTRY_URL }}/${{ secrets.IMAGE_NAME }}:${{ github.sha }}
docker image prune -a -f