🎯 什麼情境該想到我

分工:《DevOps 手冊》的部署相關實踐已經展開成型錄 → 版本控管一切、主幹開發、測試金字塔、自動化自助部署、保護部署管線、解耦部署與發布、藍綠部署、金絲雀發布、功能開關、黑啟動。這張補怎麼量交付能力(DORA)、管線階段的排序原則,以及 Go 專案的具體管線。

當「每次發布都是大工程/要熬夜/容易出錯」,你想讓上線變成頻繁、可靠、無聊的日常時。

⚙️ 怎麼用

  1. 版本控管一切:程式碼、設定、環境、基礎設施(IaC)都進 git。
  2. 持續整合(CI):每次提交自動建置 + 跑自動化測試,保持主幹隨時可發布。
  3. 建部署管線:一條自動化流水線把「提交 → 測試 → 部署」串起來,一鍵(或自動)到各環境。
  4. 小批量、頻繁發布:批量越小,風險越小、出錯越好定位。
  5. 降低發布風險:藍綠部署、金絲雀、功能開關(feature flag)、可快速回滾。

★ 怎麼知道交付能力有沒有進步:DORA 指標

DORA 目前把軟體交付表現分成吞吐量和不穩定度兩組(依 dora.dev,2026-09-25 查證):

組別指標定義
吞吐量變更前置時間一個變更從提交到版本控制到部署到正式環境的時間
部署頻率一段時間內的部署次數,或兩次部署之間的間隔
失敗部署的恢復時間一次需要立即介入的失敗部署,要多久才恢復
不穩定度變更失敗率部署後需要立即介入的比例
部署重工率因為正式環境事故而進行的計畫外部署比例
  • 「失敗部署的恢復時間」取代了早期的 MTTR——範圍縮小到因部署造成的失敗,而不是所有事故。
  • 這兩組要一起看:只衝吞吐量而不穩定度上升,代表在把問題更快送上線;DORA 的研究結論是兩者可以同時變好,因為小批量的變更更快也更安全。

★ 管線階段的排序:便宜又快的在前面

每個階段都是一道篩子。越早失敗越便宜,所以把「跑得快、最常抓到問題」的階段放前面:

順序階段典型耗時為什麼放這裡
1格式、靜態檢查秒最便宜;錯了就不必浪費時間建置
2單元測試秒~分鐘抓大部分邏輯錯誤
3建置產物(二進位檔、容器映像)分鐘只建置一次,之後每個環境都用同一個產物
4整合測試、契約測試分鐘需要資料庫等外部資源
5部署到預備環境 + 冒煙測試分鐘驗證「能部署、能啟動」
6正式環境:金絲雀 → 全量分鐘~小時用真實流量驗證,出問題自動回滾

「只建置一次」是關鍵原則:如果每個環境各自重新建置,你在預備環境測過的東西,就不是正式環境上跑的東西。

★ Go 專案的管線(對應上表 1–3)

# 1. 靜態檢查
test -z "$(gofmt -l .)"            # 有未格式化的檔案就失敗
go vet ./...
golangci-lint run --new-from-rev=origin/main   # 只擋新增的問題(見「破窗」卡的棘輪)
 
# 2. 測試:競爭偵測 + 不使用快取
go test -race -count=1 ./...
 
# 3. 建置:可重現、帶版本資訊
CGO_ENABLED=0 go build -trimpath -o bin/app ./cmd/app
  • -trimpath:從二進位檔移除本機路徑,讓不同機器建置出的結果一致。
  • Go 會自動把版本控制資訊寫進二進位檔:在 git 倉庫中建置後,用 go version -m bin/app 可以看到 vcs.revision(commit 雜湊)、vcs.time、vcs.modified(建置時工作區是否有未提交的修改)。本機以 Go 1.26.4 驗證過(2026-09-25)。程式內可用 runtime/debug.ReadBuildInfo() 讀取,放進 /version 端點——事故時第一個問題就是「現在線上跑的是哪個 commit」。
  • CGO_ENABLED=0 產生靜態連結的二進位檔,可以放進極小的容器映像(scratch 或 distroless)。

★ 回滾要比修復快

管線的最後一道防線是回滾。設計目標:

  • 回滾是一個按鈕或一個指令,不需要重新建置(直接部署上一個已建置好的產物)。
  • 資料庫遷移要向後相容(先加欄位、程式碼上線、再移除舊欄位——見 工具-小步重構的平行改動),否則程式碼可以回滾,資料庫回不去。
  • 定期演練回滾。從沒用過的回滾程序,出事時很可能不能用。

🧪 我實際套用的紀錄

  • 2026-07-15:(待填)

⚠️ 注意

  • 沒有可靠的自動化測試,CD 只是「更快地把 bug 送上線」;測試是前提。

  • 管線太慢,大家就會繞過它:主幹上的管線超過 15–20 分鐘,工程師就會開始累積大批變更一起送,失去小批量的好處。要持續量測並縮短管線時間。

  • 不穩定的測試會毀掉對管線的信任:見 工具-破窗理論與軟體熵——flaky test 要立刻隔離。

🔗 相關工具