流水線的目標是降低變更風險
CI/CD 不是把手動指令搬進 YAML。好的交付流程,會讓小變更更容易通過檢查、更快到達使用者;出問題時,也能很快判斷影響並復原。
目前 DORA 用五個 software delivery metrics 觀察 throughput 與 instability:
- Change lead time。
- Deployment frequency。
- Failed deployment recovery time。
- Change fail rate。
- Deployment rework rate。
這些指標應針對同一個 application/service 長期觀察,不用拿一張「菁英團隊門檻」逼所有團隊追同一個數字。高風險醫療系統和行銷網站的發佈節奏本來就不同。真正要找的是流程裡最大的等待、返工和失敗來源。

圖解:建置只產生一份可辨識 digest 的產物,附上 provenance 並通過安全與政策檢查;同一份產物再逐步推進環境,監控結果決定暫停、繼續或回復。
把交付流程拆成六個責任點
一條容易稽核的流程通常包含:
- Source:誰能提交、review 和合併?
- Build:使用什麼乾淨環境,把哪個 commit 建成產物?
- Evidence:tests、scan 和 provenance 記錄了什麼?
- Artifact:推進的是哪個 immutable digest?
- Deploy:誰能把 release 推到哪個 target?
- Verify:怎麼判斷成功,失敗後回滾還是 fix forward?
把 CI 和 CD 分開管理,能避免 build service account 順便擁有 production admin,也能讓同一份已驗證產物在環境間推進。
流程圖暫時無法顯示。可先查看下方的流程與節點文字,或重新整理頁面後再試。
查看流程與節點文字
箭頭表示流程方向;方括號與引號內是節點名稱,可搭配下方圖解閱讀。
flowchart TB
S["Source<br/>Commit、<br/>Review、Merge"] --> B["Build<br/>乾淨環境+固定工具"]
B --> E["Evidence<br/>Tests、Scans、Provenance"]
E --> A["Artifact<br/>Immutable digest"]
A --> D["Deploy<br/>Release+Rollout"]
D --> V["Verify<br/>SLO+Business journey"]
V --> O{"Healthy?"}
O -->|"是"| P["Promote 同一 digest"]
O -->|"否"| R["Abort/Rollback/<br/>Fix forward"]
CI["CI identity<br/>不能部署 Production"] -.-> B
CD["CD identity<br/>不能修改 Source/Policy"] -.-> D Source:先處理信任邊界
Cloud Build 2nd gen repositories 可連 GitHub、GitLab、Bitbucket 的 cloud/enterprise 版本,也可依架構使用 Developer Connect 或 Secure Source Manager。Cloud Source Repositories 從 2024-06-17 起已不提供給新客戶,不應再當成新專案預設。
Repository connection 本身帶有 credential 和 webhook trust。設計時要確認:
- Push、pull request、tag 和 manual trigger 各能觸發哪一條 pipeline。
- 來自 fork 的不受信任程式碼,是否能讀 secret 或使用高權限 service account。
- Protected branch、required review、CODEOWNERS 和 signed commit 是否符合風險。
- Build config 的修改是否需要 platform/security owner review。
如果 PR 可以同時改應用程式和 cloudbuild.yaml,那麼「只有 pipeline 能讀 production secret」並沒有想像中安全。要限制哪些 trigger 能注入 secret、使用 private pool 或取得 privileged identity。
流程圖暫時無法顯示。可先查看下方的流程與節點文字,或重新整理頁面後再試。
查看流程與節點文字
箭頭表示流程方向;方括號與引號內是節點名稱,可搭配下方圖解閱讀。
flowchart TB
E["Source event"] --> T{"來源是否受信任?"}
T -->|"Fork/External PR"| U["Untrusted<br/>validation pipeline"]
U --> U1["無 Production secrets<br/>無 privileged identity<br/>隔離 network/runner"]
T -->|"Protected branch/Approved tag"| R["Trusted release pipeline"]
R --> C{"Build config<br/>或 privileged path<br/>是否也被修改?"}
C -->|"是"| O["要求 Platform/<br/>Security owner review"]
C -->|"否"| B["使用專用 Build identity"]
O --> B
B --> L["取得最小必要 Secret/Network path<br/>並完整 Audit"] Cloud Build:每個步驟都要知道用誰的權限
Cloud Build 以 containerized steps 執行 build、test、scan 和 packaging。安全重點包括:
- 使用用途清楚的 user-specified service account,不依賴 default service account 的歷史行為。
- 只授予 build 所需 Artifact Registry、log 和 source 權限;部署權限交給 CD 階段。
- 以 Secret Manager 提供必要 secret,避免寫進 substitution、image layer 或 build log。
- 固定 builder image digest/工具版本,並定期升級。
- 設 timeout、machine/pool capacity 和 log retention,避免失控 build。
Private pool 解決什麼?
Private pools 提供可自訂網路和 worker 環境,適合存取 private service、限制 egress 或符合特定 isolation 要求。它不是「較安全」的自動同義詞:pool 的 peering/PSC、DNS、egress、worker service account、machine image 和 patching 仍要設計。
不需要 private network 的一般 build,使用 fully managed pool 可能更簡單。需求應由 network path 和 compliance 驅動。
Artifact Registry:用 digest 推進同一份產物
Artifact Registry 支援 container image 與多種 package formats,也有 standard、remote 和 virtual repositories。Remote repository 可快取 upstream package;virtual repository 能用單一 endpoint 聚合 upstreams。這有助於控制依賴來源,但還要處理:
- Repository IAM 與 production/non-production 分隔。
- Upstream outage、package substitution 和 dependency pinning。
- Cleanup policy,避免誤刪仍在 production 使用的 digest。
- Vulnerability scanning 的 coverage、資料新鮮度和 exception workflow。
環境推進應引用 image digest,而不是可被移動的 latest tag。Dev、staging、prod 使用同一個 digest,只改環境 configuration,才能把 staging 驗證的內容和 production 部署的內容對上。
掃描結果也不是「只要有 High CVE 就永遠阻擋」。Policy 可以結合 exploitability、是否在 runtime path、修補可用性和 exception 到期日;高風險 exception 必須可追蹤。
Provenance 與 Binary Authorization
Software supply chain evidence 可以回答:產物來自哪個 source revision、由什麼 builder 和參數產生、經過哪些 policy。Cloud Build 在符合條件的 managed build 可產生 provenance;實際 SLSA build level 要依使用的 build type 與設定確認,不應替所有 Cloud Build 宣稱固定等級。
Binary Authorization 能在支援的 deployment target 檢查 policy 與 attestation。好的 attestation 代表一項可驗證事實,例如:
- 由受信任 builder 產生且 provenance 符合 policy。
- 指定 test suite 成功。
- Vulnerability policy 通過或 exception 尚未到期。
- Release 已由有權限的 approver 核准。
如果 build 成功就自動簽署、而 build service account 又能修改 policy,attestation 只剩形式。Signer、policy admin 和 deployer 應依風險分離,break-glass 也要留下理由並事後 review。
流程圖暫時無法顯示。可先查看下方的流程與節點文字,或重新整理頁面後再試。
查看流程與節點文字
箭頭表示流程方向;方括號與引號內是節點名稱,可搭配下方圖解閱讀。
flowchart TB
S["Source revision"] --> B["Trusted builder<br/>固定 image/parameters"]
B --> I["Artifact digest"]
B --> P["Provenance<br/>Source+Builder+Inputs"]
I --> T["Tests/SBOM/<br/>Vulnerability scan"]
P --> A["Attestation policy checks"]
T --> A
A --> G{"Evidence 符合政策<br/>或有效 exception?"}
G -->|"否"| X["拒絕 Promotion/<br/>Deployment"]
G -->|"是"| N["Authorized signer<br/>產生 attestation"]
N --> D["Binary Authorization<br/>在支援 target 驗證"]
D --> R["Runtime receives<br/>exact digest"]
PA["Policy admin"] -.->|"與 Builder/Signer/Deployer 分離"| G Cloud Deploy:管理 release 到 target 的推進
Cloud Deploy 以 delivery pipeline、target、release 和 rollout 管理 GKE、Cloud Run 等支援環境。CI 建好 artifact 後建立 release,再由 rollout 將它部署到各 target。
可搭配:
- Promotion approval 與 separation of duties。
- Canary phases、parallel/multi-target deployment。
- Pre/post deploy hooks 和 deployment verification。
- Automation rules 做排程 promotion、phase advancement、retry 或符合設定的 rollback。
Canary 並不會因為你寫了 10% → 50% → stable,就自動知道應用健康。要為每個 phase 定義可判斷的 verification,例如 error rate、latency、核心交易成功率和 log anomaly,並決定自動或人工 advancement。Cloud Run jobs 沒有 request traffic split,因此 Cloud Deploy 不支援對 job 做 canary。
流程圖暫時無法顯示。可先查看下方的流程與節點文字,或重新整理頁面後再試。
查看流程與節點文字
箭頭表示流程方向;方括號與引號內是節點名稱,可搭配下方圖解閱讀。
flowchart TB
R["Release references<br/>immutable digest"] --> S["Deploy to Staging"]
S --> V["Integration/Load/<br/>Migration compatibility"]
V --> C1["Canary phase 1<br/>Small traffic/targets"]
C1 --> M["量測 Error、Latency、<br/>SLO burn、核心交易<br/>與 Log anomaly"]
M --> G{"代表性樣本足夠<br/>且健康?"}
G -->|"否"| A["Abort rollout<br/>Rollback<br/>或 Fix forward"]
G -->|"是"| N{"還有下一 phase?"}
N -->|"是"| C2["Advance<br/>traffic/targets"]
C2 --> M
N -->|"否"| P["Promote Stable"]
P --> M2["持續觀察<br/>post-deploy signals"] 回滾只處理可回復的部分
Cloud Deploy 的 rollback 會讓先前 release 回到 target;它不會自動復原已執行的 database migration、Pub/Sub event、付款或第三方 side effect。Release 設計要先處理相容性:
- Schema 使用 expand/migrate/contract,讓新舊版本能短期共存。
- Event schema 有 version 與 backward compatibility。
- Feature flag 的 state 和 application deployment 分開追蹤。
- 不可逆操作有補償或明確 fix-forward plan。
所以「一鍵回滾」是操作入口,不是整個系統狀態都能倒帶。
流程圖暫時無法顯示。可先查看下方的流程與節點文字,或重新整理頁面後再試。
查看流程與節點文字
箭頭表示流程方向;方括號與引號內是節點名稱,可搭配下方圖解閱讀。
flowchart TB
D["Release deployment"] --> A["Application<br/>version"]
D --> S["Database schema/<br/>Data migration"]
D --> E["Events/<br/>Payments/<br/>Third-party<br/>side effects"]
A -->|"Artifact<br/>與 config 相容"| R["可切回<br/>previous release"]
S --> X{"舊版仍能讀寫?"}
X -->|"Expand/<br/>Migrate/<br/>Contract"| R
X -->|"Destructive/<br/>Incompatible"| F["Forward<br/>migration<br/>或補償流程"]
E --> I["Idempotency、<br/>Versioned event、<br/>Compensation/<br/>Manual repair"]
R --> V["重新驗證 User journey"]
F --> V
I --> V 部署策略看的是故障隔離
- Rolling:分批替換 instance,資源需求較低;新舊版本會共存,capacity 和 compatibility 要測。
- Blue/green:保留兩套環境再切換,回切快但成本高,stateful dependency 仍共享時風險沒有消失。
- Canary:讓部分 traffic/instances 使用新版本,適合用 production signal 驗證;sample 要足夠代表真實使用者。
- Feature flag:把 deploy 和 release 分開,但 flag 也需要 owner、權限、到期清理和測試組合。
任何策略都不保證 zero downtime。Readiness、connection draining、capacity、client retry、schema 和 load balancer 行為共同決定使用者是否感受到中斷。
情境練習:支付 API 的安全發佈
假設團隊要把支付 API 的新版本送上 production。程式碼放在 GitHub,這次變更帶著 database migration,出錯的代價是付款失敗或重複扣款。
照本課的六個責任點(Source、Build、Evidence、Artifact、Deploy、Verify),各寫一條你會設的關卡,再展開對照。
寫完再展開:參考做法
- GitHub protected branch 要求 payment owner 與 security-sensitive config owner review。
- PR build 只跑不含 production secrets 的 tests;main build 用專用 service account 產生 image、SBOM 和 provenance。
- Image 以 digest 存入受控 Artifact Registry;vulnerability policy 通過後產生 attestation。
- Cloud Deploy 先推 staging,同一 digest 通過 integration、load 和 migration compatibility tests。
- Production rollout 先 small canary,verification 觀察付款成功率、重複扣款、p99 latency 和 error budget burn。
- Promotion 需要 release approver;deploy identity 不能修改 Binary Authorization policy。
- Database migration 先 expand,舊版仍可運作;canary 失敗能回先前 release,不必逆向刪 schema。
- Break-glass release 有短效權限、理由、告警和 incident review。
課後檢查
往下看重點之前,先試著回答這幾題;答不出來,括號裡是該回去重讀的那一節。
- 來自 fork 的 PR build,為什麼不該讀得到 production secret?(回〈Source:先處理信任邊界〉)
- 為什麼各環境要推進同一個 image digest,而不是各自重建或用
latesttag?(回〈Artifact Registry:用 digest 推進同一份產物〉) - Cloud Deploy rollback 之後,哪些東西不會跟著回復?(回〈回滾只處理可回復的部分〉)
本課重點
- DORA 現在使用五個指標;目的是找流程瓶頸,不是追固定排名。
- Source trigger 要區分 trusted branch 和 untrusted PR,避免外部程式讀取 secret。
- Build、artifact、deploy 和 policy identities 應按責任分離。
- 同一個 immutable digest 在環境間推進,不能每個環境重建。
- Provenance 與 attestation 要代表可驗證 evidence,不是流水線蓋章。
- Canary 必須有代表業務的 verification 與 advancement/abort 條件。
- Rollback 不會復原資料與外部 side effects,schema 和 event compatibility 要先設計。
延伸閱讀
- DORA software delivery performance metrics
- Cloud Build repositories
- Cloud Deploy overview
- Binary Authorization overview
下一步
下一課會把交付速度和基礎設施選擇轉成成本與業務指標,建立能看見、能歸屬、能安全採取行動的 FinOps 流程。