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
123 changes: 123 additions & 0 deletions .github/workflows/develop-build-deploy-gce-manual.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,123 @@
name: develop push Build and Deploy (GCE)

on:
workflow_dispatch:
inputs:
ref:
description: "배포할 브랜치 (수동 테스트 전용)"
required: true
default: "chore/#169"

env:
DOCKERHUB_USERNAME: fittheman
DOCKERHUB_IMAGE_NAME: fittheman-server

jobs:
build-deploy:
runs-on: ubuntu-latest
environment: DEV

steps:
# 체크아웃
- name: Checkout
uses: actions/checkout@v4
with:
ref: ${{ inputs.ref }}

# JDK 17 세팅
- name: Set up JDK 17
uses: actions/setup-java@v4
with:
java-version: '17'
distribution: 'temurin'

# 테스트 환경에서 필요한 컨테이너 실행 (redis, postgres)
- name: Run Containers
run: docker compose -f ./docker-compose-test.yml up -d

# 테스트 환경에서 필요한 스키마, 데이터 등록
- name: Apply Schema and Data
env:
TEST_POSTGRES_CONTAINER_NAME: "${{ github.event.repository.name }}-postgres-1"
TEST_POSTGRES_USER: test
TEST_POSTGRES_DB: ftm_test_db
run: |
echo "⏳ Waiting for postgres to be ready..."
until docker exec -i $TEST_POSTGRES_CONTAINER_NAME pg_isready -U $TEST_POSTGRES_USER -d $TEST_POSTGRES_DB; do
echo "postgres is not ready yet. Retrying in 3 seconds..."
sleep 3
done
echo "✅ postgres is ready!"

echo "${{ secrets.SCHEMA_SQL }}" | docker exec -i $TEST_POSTGRES_CONTAINER_NAME psql -U $TEST_POSTGRES_USER -d $TEST_POSTGRES_DB
echo "${{ secrets.DATA_SQL }}" | docker exec -i $TEST_POSTGRES_CONTAINER_NAME psql -U $TEST_POSTGRES_USER -d $TEST_POSTGRES_DB

# Gradlew 실행 권한 허용
- name: Grant Execute Permission for Gradlew
run: chmod +x ./gradlew

# .env 파일 생성
- name: Load secrets into .env file
run: |
echo "${{ secrets.ENV }}" >> .env

# Swagger API 문서화 task 실행
- name: Apply Swagger API Document Task
run: ./gradlew copyOasToSwagger

# Rest Docs API 문서화 task 실행
- name: Apply Rest Docs API Document Task
run: ./gradlew copyDocument

# Gradle 빌드
- name: Build with Gradle
id: gradle
uses: gradle/gradle-build-action@v2
with:
arguments: |
bootJar
--scan
cache-read-only: ${{ github.ref != 'refs/heads/main' && github.ref != 'refs/heads/develop' }}

# Dockerhub 로그인
- name: Login to Dockerhub
uses: docker/login-action@v3
with:
username: ${{ env.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_ACCESS_TOKEN }}

# Docker 메타데이터
- name: Extract Docker metadata
id: metadata
uses: docker/metadata-action@v5.5.0
env:
DOCKERHUB_IMAGE_FULL_NAME: ${{ env.DOCKERHUB_USERNAME }}/${{ env.DOCKERHUB_IMAGE_NAME }}
with:
images: ${{ env.DOCKERHUB_IMAGE_FULL_NAME }}
tags: |
type=sha,prefix=

# Docker 이미지 빌드, 도커허브 푸시
- name: Build and Push Docker image
uses: docker/build-push-action@v3
with:
context: .
push: true
tags: ${{ steps.metadata.outputs.tags }} # 추출된 도커 메타데이터 tags -> "${DOCKERHUB_USERNAME}/${DOCKERHUB_IMAGE_NAME}:{TAG}

# GCE 배포
- name: Deploy to GCE Server
uses: appleboy/ssh-action@v1.0.3
env:
IMAGE_FULL_PATH: ${{ steps.metadata.outputs.tags }}
DOCKERHUB_IMAGE_NAME: ${{ env.DOCKERHUB_IMAGE_NAME }}
with:
host: ${{ secrets.GCE_HOST }}
username: ${{ secrets.GCE_USER }}
key: ${{ secrets.GCE_SSH_PRIVATE_KEY }}
envs: IMAGE_FULL_PATH, DOCKERHUB_IMAGE_NAME # docker-compose.yml 에서 사용할 환경 변수
debug: true
script: |
echo "${{ secrets.DOCKERHUB_ACCESS_TOKEN }}" | docker login -u "${{ secrets.DOCKERHUB_USERNAME }}" --password-stdin
docker compose up -d
docker image prune -a -f
Loading
Loading