Files
vexplor/.gitea/workflows/deploy.yml
2025-12-28 18:24:50 +09:00

213 lines
7.3 KiB
YAML

# Gitea Actions Workflow - vexplor 이미지 빌드 & Harbor Push
#
# 동작 방식:
# 1. main 브랜치에 push 시 자동 실행
# 2. Docker 이미지 빌드 (Backend, Frontend)
# 3. Harbor 레지스트리에 Push
# 4. 공장 서버의 Watchtower가 새 이미지 감지 후 자동 업데이트
#
# 필수 Secrets (Repository Settings > Secrets):
# - HARBOR_USERNAME: Harbor 사용자명
# - HARBOR_PASSWORD: Harbor 비밀번호
name: Build and Push Images
on:
push:
branches:
- main
- master
paths:
- "backend-node/**"
- "frontend/**"
- "docker/**"
- ".gitea/workflows/deploy.yml"
paths-ignore:
- "**.md"
- "deploy/**"
- "k8s/**"
workflow_dispatch: # 수동 실행도 가능
env:
GITEA_DOMAIN: g.wace.me
HARBOR_REGISTRY: localhost:5001
HARBOR_REGISTRY_EXTERNAL: harbor.wace.me
HARBOR_PROJECT: speefox_vexplor
# Frontend 빌드 환경 변수
NEXT_PUBLIC_API_URL: "https://api.vexplor.com/api"
NEXT_PUBLIC_ENV: "production"
# Frontend 설정
FRONTEND_IMAGE_NAME: vexplor-frontend
FRONTEND_BUILD_CONTEXT: frontend
FRONTEND_DOCKERFILE_PATH: docker/deploy/frontend.Dockerfile
# Backend 설정
BACKEND_IMAGE_NAME: vexplor-backend
BACKEND_BUILD_CONTEXT: backend-node
BACKEND_DOCKERFILE_PATH: docker/deploy/backend.Dockerfile
jobs:
build-and-push:
runs-on: ubuntu-24.04
steps:
# 작업 디렉토리 정리
- name: Clean workspace
run: |
echo "작업 디렉토리 정리..."
cd /workspace
rm -rf source
mkdir -p source
echo "정리 완료"
# 필수 도구 설치
- name: Install required tools
run: |
echo "필수 도구 설치 중..."
apt-get update -qq
apt-get install -y git curl ca-certificates gnupg
# Docker 클라이언트 설치
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
chmod a+r /etc/apt/keyrings/docker.asc
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null
apt-get update -qq
apt-get install -y docker-ce-cli
echo "설치 완료:"
git --version
docker --version
export DOCKER_HOST=unix:///var/run/docker.sock
docker version || echo "소켓 연결 대기 중..."
# 저장소 체크아웃
- name: Checkout code
run: |
echo "저장소 체크아웃..."
cd /workspace/source
git clone --depth 1 --branch ${GITHUB_REF_NAME} \
https://oauth2:${{ github.token }}@${GITEA_DOMAIN}/${GITHUB_REPOSITORY}.git .
echo "체크아웃 완료"
git log -1 --oneline
# 빌드 환경 설정
- name: Set up build environment
run: |
IMAGE_TAG="v$(date +%Y%m%d-%H%M%S)-${GITHUB_SHA::7}"
echo "IMAGE_TAG=${IMAGE_TAG}" >> $GITHUB_ENV
# Frontend 이미지
echo "FRONTEND_FULL_IMAGE=${HARBOR_REGISTRY}/${HARBOR_PROJECT}/${FRONTEND_IMAGE_NAME}" >> $GITHUB_ENV
# Backend 이미지
echo "BACKEND_FULL_IMAGE=${HARBOR_REGISTRY}/${HARBOR_PROJECT}/${BACKEND_IMAGE_NAME}" >> $GITHUB_ENV
echo "=========================================="
echo "빌드 태그: ${IMAGE_TAG}"
echo "=========================================="
# Harbor 로그인
- name: Login to Harbor
env:
HARBOR_USER: ${{ secrets.HARBOR_USERNAME }}
HARBOR_PASS: ${{ secrets.HARBOR_PASSWORD }}
run: |
echo "Harbor 로그인..."
export DOCKER_HOST=unix:///var/run/docker.sock
echo "${HARBOR_PASS}" | docker login ${HARBOR_REGISTRY} \
--username ${HARBOR_USER} \
--password-stdin
echo "Harbor 로그인 완료"
# Backend 빌드 및 푸시
- name: Build and Push Backend image
run: |
echo "=========================================="
echo "Backend 이미지 빌드 시작..."
echo "=========================================="
export DOCKER_HOST=unix:///var/run/docker.sock
cd /workspace/source
docker build \
-t ${BACKEND_FULL_IMAGE}:${IMAGE_TAG} \
-t ${BACKEND_FULL_IMAGE}:latest \
-f ${BACKEND_DOCKERFILE_PATH} \
${BACKEND_BUILD_CONTEXT}
echo "Backend 이미지 푸시..."
docker push ${BACKEND_FULL_IMAGE}:${IMAGE_TAG}
docker push ${BACKEND_FULL_IMAGE}:latest
echo "=========================================="
echo "Backend 푸시 완료!"
echo " - ${BACKEND_FULL_IMAGE}:${IMAGE_TAG}"
echo " - ${BACKEND_FULL_IMAGE}:latest"
echo "=========================================="
# Frontend 빌드 및 푸시
- name: Build and Push Frontend image
run: |
echo "=========================================="
echo "Frontend 이미지 빌드 시작..."
echo "=========================================="
export DOCKER_HOST=unix:///var/run/docker.sock
cd /workspace/source
echo "빌드 환경 변수:"
echo " NEXT_PUBLIC_API_URL=${NEXT_PUBLIC_API_URL}"
echo " NEXT_PUBLIC_ENV=${NEXT_PUBLIC_ENV}"
docker build \
-t ${FRONTEND_FULL_IMAGE}:${IMAGE_TAG} \
-t ${FRONTEND_FULL_IMAGE}:latest \
-f ${FRONTEND_DOCKERFILE_PATH} \
--build-arg NEXT_PUBLIC_API_URL="${NEXT_PUBLIC_API_URL}" \
${FRONTEND_BUILD_CONTEXT}
echo "Frontend 이미지 푸시..."
docker push ${FRONTEND_FULL_IMAGE}:${IMAGE_TAG}
docker push ${FRONTEND_FULL_IMAGE}:latest
echo "=========================================="
echo "Frontend 푸시 완료!"
echo " - ${FRONTEND_FULL_IMAGE}:${IMAGE_TAG}"
echo " - ${FRONTEND_FULL_IMAGE}:latest"
echo "=========================================="
# 빌드 완료 요약
- name: Build summary
if: success()
run: |
echo ""
echo "=========================================="
echo " 이미지 빌드 & Push 완료!"
echo "=========================================="
echo ""
echo "빌드 버전: ${IMAGE_TAG}"
echo ""
echo "푸시된 이미지:"
echo " - Backend: ${HARBOR_REGISTRY_EXTERNAL}/${HARBOR_PROJECT}/${BACKEND_IMAGE_NAME}:latest"
echo " - Frontend: ${HARBOR_REGISTRY_EXTERNAL}/${HARBOR_PROJECT}/${FRONTEND_IMAGE_NAME}:latest"
echo ""
echo "다음 단계:"
echo " - 공장 서버의 Watchtower가 자동으로 새 이미지를 감지합니다"
echo " - 또는 수동 업데이트: docker compose pull && docker compose up -d"
echo ""
echo "=========================================="
# Harbor 로그아웃
- name: Logout from Harbor
if: always()
run: |
export DOCKER_HOST=unix:///var/run/docker.sock
docker logout ${HARBOR_REGISTRY} || true