可以,透過 GitHub Actions 搭配 Google Cloud 的 Workload Identity Federation,只要在專案中設定好服務帳號、OIDC Provider 與必要的 Secrets,便能在每次 push 到 main 分支時自動建置 Docker 映像、推送至 Artifact Registry,最後無縫部署到 Cloud Run。以下說明完整的原理、設定步驟、驗證方式、常見錯誤與進階延伸,讓你從手動部署升級到全自動 CI/CD。
原理:GitHub Actions + Workload Identity Federation
GitHub Actions 本質上是一套在 GitHub 內部執行的 CI/CD 平台,透過 YAML 定義 workflow,於特定事件(如 push、pull_request)觸發。若要讓它直接與 Google Cloud 互動,最安全的方式是使用 OIDC(OpenID Connect)認證,亦即「Workload Identity Federation」:GitHub 會以短期 token 向 GCP 請求臨時憑證,避免在 repo 中存放長期金鑰。這樣的機制同時滿足安全(最小權限、短效 token)與便利(不需手動更新金鑰)。
實作步驟
- 01
1️⃣ 在 Google Cloud 專案中建立服務帳號(例如 github-service-account),並授予 roles/run.admin、roles/artifactregistry.writer、roles/iam.workloadIdentityUser 等必要角色。
- 02
2️⃣ 建立 Workload Identity Pool(github-pool)與 OIDC Provider(github-provider),設定 attribute‑mapping 讓 GitHub repo 與 owner 能對應到 GCP IAM。
- 03
3️⃣ 取得 Provider 完整名稱(如 projects/PROJECT_ID/locations/global/workloadIdentityPools/github-pool/providers/github-provider),作為後續 GitHub Secrets 的值。
- 04
4️⃣ 在 GitHub Repository → Settings → Secrets and variables → Actions,新增兩個 secret: - **WIF_PROVIDER**:步驟 3 取得的 Provider 名稱。 - **WIF_SERVICE_ACCOUNT**:服務帳號的 email(例如 github-service-account@PROJECT_ID.iam.gserviceaccount.com)。
- 05
5️⃣ 在 .github/workflows/ci-cd.yml 中撰寫 workflow,主要包含三個 job: - **build**:使用 Docker 建置映像並推送至 Artifact Registry。 - **deploy**:使用 gcloud 命令(透過 OIDC)將映像部署到指定的 Cloud Run 服務。 - **notify**(可選):在部署成功後發送 Slack/Telegram 通知。

範例 workflow(核心片段)
以下為官方建議的最小化範例,請依照自己的專案 ID、服務名稱與區域調整環境變數。
- name: Deploy to Cloud Run
- on:
- push:
- branches: [ main ]
- jobs:
- build:
- runs-on: ubuntu-latest
- steps:
- - uses: actions/checkout@v4
- - name: Set up Cloud SDK
- uses: google-github-actions/setup-gcloud@v2
- with:

驗證與觀測
提交一次 commit 後,可在 GitHub Repository → Actions 頁面看到 workflow 執行紀錄。若所有 steps 均顯示綠勾,代表映像已成功推送至 Artifact Registry,且 Cloud Run 已完成新版本部署。可前往 GCP Console → Cloud Run,檢查服務的最新 revision 與流量分配情況。

常見錯誤與排除
- ❌ **權限不足**:若 workflow 在「Authenticate with Workload Identity」步驟失敗,請確認服務帳號已被授予 roles/iam.workloadIdentityUser,且 Provider 的 member 設定正確(使用 principalSet://iam.googleapis.com/.../attribute.repository_owner/OWNER)。
- ❌ **映像名稱錯誤**:Docker push 前務必檢查 ${{ env.REGISTRY }} 與 ${{ env.IMAGE_NAME }} 是否與 Artifact Registry 中的 repository 完全對應,否則會出現 "repository not found" 錯誤。
- ❌ **區域不符**:Cloud Run 部署時的 --region 必須與 Artifact Registry 所在區域相同,否則會因跨區域限制而失敗。
- ❌ **Secrets 未設定**:GitHub Actions 只能讀取已在 Settings → Secrets 中宣告的變數,若名稱拼寫錯誤或未新增,workflow 會在執行時直接中斷。
進階延伸與最佳實踐
除了基本的建置與部署,還可以結合以下進階功能,讓 CI/CD 更加安全與彈性:
- 🔐 **最小權限原則**:在 workflow 的 `permissions` 區塊僅開啟 `id-token: write` 與 `contents: read`,避免不必要的 repo 寫入權限。
- 🕒 **定時部署**:使用 `schedule` 觸發器(cron)在非高峰時段自動執行藍綠部署或滾動更新。
- 📊 **部署檢查**:在 deploy job 後加入 Cloud Run 的 `gcloud run services describe` 指令,將當前 revision 與流量資訊寫入 GitHub Checks,讓團隊即時看到部署結果。
- 🛡️ **安全掃描**:在 build job 中加入 Trivy 或 Snyk 等容器安全掃描 Action,確保映像不含已知漏洞再推送。
「自動化不只是省時,更是降低人為錯誤的關鍵。」— 依據 S8 的安全最佳實踐建議
參考資料10
- 提高開發效率!用 GitHub Action 自動部署 Docker 容器到 Cloud Run 教學
- 【學習筆記】用 GitHub Actions 實現 CI/CD - HackMD
- GitHub Actions CI/CD 自动化部署完全指南-腾讯云开发者社区-腾讯云
- 使用 GitHub Actions 設定 CI/CD 管道實現自動部署
- 🌟 GitHub Actions 與 CI/CD:現代開發者的自動化利器|慵懶貓系的小墨魚:數據外的日常觀察
- GitHub Action 教學:把 Docker 容器自動部署到 Cloud Run - iT 邦幫忙::一起幫忙解決難題,拯救 IT 人的一天
- Day 26:CI/CD 整合 - 自動化你的工作流程 - iT 邦幫忙::一起幫忙解決難題,拯救 IT 人的一天
- GitHub Actions CI/CD 管線建置指南:安全設定與執行效率優化實務
- GitHub Actions iOS CI/CD|完整實作自動化建置、測試與部署流程教學 | ZhgChgLi (Harry Li)
- CI/CD 不只跑流程!結合 GitHub Actions 實現敏捷開發與自動化部署 - Nextlink 博弘雲端科技
把方法落到實際品牌系統
從策略到執行,選擇你現在最需要補強的一環。
可將 haeng-un.com 設為 Google 偏好來源。
加入 Google 偏好來源把下一步做得更清楚。
需要網站、影像或社群內容一起整理,我們可以從現在最重要的問題開始。
