GCP Docker 배포
GCP Artifact Registry에 이미지를 빌드/푸시하고 GKE에 배포하는 파이프라인
GCP 환경에서 Docker 이미지를 빌드하고 GKE 클러스터에 배포하는 파이프라인입니다.
사전 준비
다음 secrets와 vars를 미리 등록해야 합니다:
| 종류 | Key | Description |
|---|---|---|
| Secret | GCP_SA_KEY | GCP 서비스 계정 키 JSON |
| Var | GCP_PROJECT_ID | GCP 프로젝트 ID |
| Var | GKE_CLUSTER | GKE 클러스터 이름 |
| Var | GKE_REGION | GKE 클러스터 리전 |
전체 코드
name: gcp-deploy
# main 브랜치 push + src/ 변경 시에만 실행
triggers:
push:
branches: [main]
paths: [src/**, Dockerfile, package.json]
# 전역 환경 변수 — 모든 Job에서 사용
env:
PROJECT_ID: "${{ vars.GCP_PROJECT_ID }}"
REGISTRY: "asia-northeast3-docker.pkg.dev"
IMAGE_NAME: "my-app"
jobs:
# ─────────────────────────────────────────
# 1. 소스코드 체크아웃
# ─────────────────────────────────────────
checkout:
phase: source
steps:
- name: checkout
uses: "collabops/checkout@v2"
with:
repo-url: "https://<collabops-host>/<workspace>/<repository>.git"
# ─────────────────────────────────────────
# 2. GCP 인증 + Docker Registry 인증
# ─────────────────────────────────────────
auth:
phase: source
needs: [checkout]
steps:
# GCP 서비스 계정 인증
- name: gcloud-auth
uses: "collabops/gcloud-auth@v1"
with:
project-id: ${{ vars.GCP_PROJECT_ID }}
credentials: ${{ secrets.GCP_SA_KEY }}
# Artifact Registry Docker 인증
- name: docker-auth
uses: "collabops/gcloud-docker-auth@v1"
with:
registry: asia-northeast3-docker.pkg.dev
# ─────────────────────────────────────────
# 3. Docker 이미지 빌드 및 푸시
# ─────────────────────────────────────────
build:
phase: build
needs: [checkout, auth] # 체크아웃 + 인증 모두 필요
steps:
# 버전 정보 추출 (같은 Job 내에서 step output 참조)
- name: extract-version
id: version
image: node:18
run: |
cd /workspace/source
# package.json에서 버전 추출
APP_VERSION=$(node -p "require('./package.json').version")
echo "app_version=${APP_VERSION}" >> $COLLABOPS_OUTPUT
# 짧은 SHA 생성 (이미지 태그용)
SHORT_SHA=$(echo "${{ collabops.sha }}" | cut -c1-7)
echo "short_sha=${SHORT_SHA}" >> $COLLABOPS_OUTPUT
echo "Version: ${APP_VERSION}, SHA: ${SHORT_SHA}"
- name: build-push
uses: "collabops/docker-build-push@v1"
with:
# 멀티 태그: latest + 버전 + SHA
tags: |
${{ env.REGISTRY }}/${{ env.PROJECT_ID }}/docker/${{ env.IMAGE_NAME }}:latest
${{ env.REGISTRY }}/${{ env.PROJECT_ID }}/docker/${{ env.IMAGE_NAME }}:${{ steps.version.outputs.app_version }}
${{ env.REGISTRY }}/${{ env.PROJECT_ID }}/docker/${{ env.IMAGE_NAME }}:${{ steps.version.outputs.short_sha }}
build-args: |
NODE_ENV=production
# ─────────────────────────────────────────
# 4. GKE 배포
# ─────────────────────────────────────────
deploy:
phase: deploy
needs: [build]
# main 브랜치 push일 때만 배포 (CR은 빌드만)
if: "collabops.ref == 'refs/heads/main' && collabops.event_name == 'push'"
steps:
# GKE 클러스터 인증
- name: gke-setup
uses: "collabops/gcloud-setup@v1"
with:
project-id: ${{ vars.GCP_PROJECT_ID }}
cluster-name: ${{ vars.GKE_CLUSTER }}
cluster-location: ${{ vars.GKE_REGION }}
# kubectl로 이미지 업데이트
- name: rollout
image: google/cloud-sdk:527.0.0-slim
run: |
SHORT_SHA=$(echo "${{ collabops.sha }}" | cut -c1-7)
IMAGE="${{ env.REGISTRY }}/${{ env.PROJECT_ID }}/docker/${{ env.IMAGE_NAME }}:${SHORT_SHA}"
kubectl set image deployment/${{ env.IMAGE_NAME }} \
app=${IMAGE} \
-n production
kubectl rollout status deployment/${{ env.IMAGE_NAME }} \
-n production \
--timeout=300s
# ─────────────────────────────────────────
# 5. 배포 완료 알림
# ─────────────────────────────────────────
notify:
needs: [deploy]
if: "always()" # 배포 성공/실패 관계없이 알림
steps:
- name: slack-notify
uses: "collabops/slack-notify@v1"
with:
webhook-url: ${{ secrets.SLACK_WEBHOOK }}
message: "GKE 배포 완료: ${{ env.IMAGE_NAME }} (${{ collabops.sha }})"
title: "Deploy to GKE"
color: good실행 흐름
checkout
└── auth (GCP 인증)
└── build (버전 추출 → Docker 빌드 & 푸시)
└── deploy (GKE 배포, main push만)
└── notify (Slack 알림, 항상)