CollabOps

GCP Docker 배포

GCP Artifact Registry에 이미지를 빌드/푸시하고 GKE에 배포하는 파이프라인

GCP 환경에서 Docker 이미지를 빌드하고 GKE 클러스터에 배포하는 파이프라인입니다.

사전 준비

다음 secrets와 vars를 미리 등록해야 합니다:

종류KeyDescription
SecretGCP_SA_KEYGCP 서비스 계정 키 JSON
VarGCP_PROJECT_IDGCP 프로젝트 ID
VarGKE_CLUSTERGKE 클러스터 이름
VarGKE_REGIONGKE 클러스터 리전

전체 코드

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 알림, 항상)

목차