使用 GitHub Actions 為 Golang 專案配置 CI/CD 管線 — 包含測試、lint、SAST、安全掃描、程式碼覆蓋率、Dependabot、Renovate、GoReleaser、程式碼審查自動化以及發布管線。適用於設定或改善 Go 專案 CI、配置 GitHub Actions 工作流程、加入 linter 或安全掃描器、自動化相依性更新,或加入品質關卡。
角色: 你是一位 Go DevOps 工程師。你將 CI 視為品質關卡 — 每個管線決策都需權衡建置速度、訊號可靠性與安全態勢。
模式:
- 設定 — 首次為專案加入 CI:從快速參考表格開始,然後依序產生工作流程:test → lint → security → release。每個 GitHub Action 偏好使用最新的穩定主要版本。
- 改善 — 審核或擴展現有管線:先讀取現有工作流程檔案,對照快速參考表格找出缺口,然後提出有針對性的新增項目,避免重複既有步驟。
相依性:
- goreleaser:
go install github.com/goreleaser/goreleaser/v2@latest - gh:
brew install gh
Go 持續整合
使用 GitHub Actions 為 Go 專案設定生產級 CI/CD 管線。
Action 版本
以下範例中的版本是參考版本,可能已過時。GitHub Actions 發布頻繁 — 每個 action 的當前主要版本(actions/checkout、actions/setup-go、golangci/golangci-lint-action、codecov/codecov-action、goreleaser/goreleaser-action 等)可能與此處顯示的不同。
快速參考
| 階段 | 工具 | 用途 |
|---|---|---|
| 測試 | go test -race |
單元測試 + 競爭檢測 |
| 覆蓋率 | codecov/codecov-action |
覆蓋率報告 |
| Lint | golangci-lint |
全面 linting |
| Vet | go vet |
內建靜態分析 |
| SAST | gosec、CodeQL、Bearer |
安全靜態分析 |
| 漏洞掃描 | govulncheck |
已知漏洞檢測 |
| Docker | docker/build-push-action |
多平台映像建置 |
| 相依性 | Dependabot / Renovate | 自動化相依性更新 |
| 發布 | GoReleaser | 自動化二進位發布 |
| AI 審查 | Claude Code / Copilot | AI 驅動的 PR 審查 |
測試
.github/workflows/test.yml — 參見 test.yml
根據 go.mod 調整 Go 版本矩陣:
go 1.23 → matrix: ["1.23", "1.24", "1.25", "1.26", "stable"]
go 1.24 → matrix: ["1.24", "1.25", "1.26", "stable"]
go 1.25 → matrix: ["1.25", "1.26", "stable"]
go 1.26 → matrix: ["1.26", "stable"]
使用 fail-fast: false,這樣某個 Go 版本的失敗不會取消其他版本。
測試旗標:
-race:CI 必須使用-race旗標執行測試(捕捉資料競爭 — Go 中的未定義行為)-shuffle=on:隨機化測試順序以捕捉測試間的相依性-coverprofile:產生覆蓋率資料git diff --exit-code:如果go mod tidy變更了任何內容則失敗
覆蓋率配置
CI 應強制執行程式碼覆蓋率門檻。在專案根目錄的 codecov.yml 中配置門檻 — 參見 codecov.yml
整合測試
.github/workflows/integration.yml — 參見 integration.yml
使用 -count=1 停用測試快取 — 快取的結果可能隱藏不穩定的服務互動。
Linting
golangci-lint 必須在 CI 中對每個 PR 執行。.github/workflows/lint.yml — 參見 lint.yml
golangci-lint 配置
在專案根目錄建立 .golangci.yml。參見 samber/cc-skills-golang@golang-lint 技能以取得建議配置。
安全與 SAST
.github/workflows/security.yml — 參見 security.yml
CI 必須執行 govulncheck。它只報告專案實際呼叫的程式碼路徑中的漏洞 — 不像一般的 CVE 掃描器。CodeQL 結果會顯示在儲存庫的「安全性」標籤頁中。Bearer 擅長偵測敏感資料流問題。
CodeQL 配置
建立 .github/codeql/codeql-config.yml 以使用延伸安全查詢套件 — 參見 codeql-config.yml
可用的查詢套件:
- default:標準安全查詢
- security-extended:額外安全查詢,精確度略低
- security-and-quality:安全查詢加上可維護性與可靠性檢查
容器映像掃描
如果專案產生 Docker 映像,Docker 工作流程中包含 Trivy 容器掃描 — 參見 docker.yml
相依性管理
Dependabot
.github/dependabot.yml — 參見 dependabot.yml
次要/修補更新會合併到單一 PR。主要更新會獲得個別 PR,因為它們可能包含破壞性變更。
Dependabot 自動合併
.github/workflows/dependabot-auto-merge.yml — 參見 dependabot-auto-merge.yml
安全警告: 此工作流程需要
contents: write和pull-requests: write— 這些是提升的權限,允許合併 PR 和修改儲存庫內容。if: github.actor == 'dependabot[bot]'防護將執行限制為僅限 Dependabot。請勿移除此防護。請注意,github.actor檢查並非完全防偽 — 分支保護規則才是真正的安全網。確保已配置分支保護(參見儲存庫安全設定),包含必要的狀態檢查和必要的核准,這樣無論誰觸發工作流程,自動合併只會在通過所有檢查後成功。
Renovate(替代方案)
Renovate 是比 Dependabot 更成熟且可配置的替代方案。它原生支援自動合併、分組、排程、正則表達式管理器以及 monorepo 感知更新。如果 Dependabot 感覺太受限,Renovate 是首選。
安裝 Renovate GitHub App,然後在儲存庫根目錄建立 renovate.json — 參見 renovate.json
相較於 Dependabot 的主要優勢:
gomodTidy:更新後自動執行go mod tidy- 原生自動合併:無需單獨的工作流程
- 更好的分組:更靈活的 PR 分組規則
- 正則表達式管理器:可以更新 Dockerfile、Makefile 等中的版本
- Monorepo 支援:處理 Go workspace 和多模組儲存庫
發布自動化
GoReleaser 自動化二進位建置、校驗和和 GitHub Releases。配置會根據專案類型而有顯著差異。
發布工作流程
.github/workflows/release.yml — 參見 release.yml
安全警告: 此工作流程需要
contents: write以建立 GitHub Releases。它限制為標籤推送(tags: ["v*"]),因此無法由 pull request 或分支推送觸發。只有具有儲存庫推送權限的使用者才能建立標籤。
CLI/程式的 GoReleaser
程式需要跨平台編譯的二進位檔、壓縮檔,以及可選的 Docker 映像。
.goreleaser.yml — 參見 goreleaser-cli.yml
函式庫的 GoReleaser
函式庫不產生二進位檔 — 它們只需要一個包含變更記錄的 GitHub Release。使用跳過建置的最小配置。
.goreleaser.yml — 參見 goreleaser-lib.yml
對於函式庫,您甚至可能不需要 GoReleaser — 透過 UI 或 gh release create 建立的簡單 GitHub Release 通常就足夠了。
Monorepo / 多二進位檔的 GoReleaser
當儲存庫包含多個指令(例如 cmd/api/、cmd/worker/)時。
.goreleaser.yml — 參見 goreleaser-monorepo.yml
Docker 建置與推送
適用於產生 Docker 映像的專案。此工作流程建置多平台映像、產生 SBOM 和來源證明、推送到 GitHub Container Registry (GHCR) 和 Docker Hub,並包含 Trivy 容器掃描。
.github/workflows/docker.yml — 參見 docker.yml
安全警告: 權限按工作劃分:
container-scan工作僅獲得contents: read+security-events: write,而docker工作獲得packages: write(用於推送到 GHCR)和attestations: write+id-token: write(用於來源/SBOM 簽署)。這確保即使掃描工作被入侵也無法推送映像。push旗標在 pull request 上設為false,因此不受信任的程式碼無法發布映像。DOCKERHUB_USERNAME和DOCKERHUB_TOKEN秘密必須在儲存庫秘密設定中配置 — 切勿硬編碼憑證。
關鍵細節:
- QEMU + Buildx:多平台建置所需(
linux/amd64,linux/arm64)。移除不需要的平台。 - PR 上
push: false:映像在建置後絕不推送 — 這會驗證 Dockerfile 而不發布不受信任的程式碼。 - Metadata action:自動產生 semver 標籤(
v1.2.3→1.2.3、1.2、1)、分支標籤(main)和 SHA 標籤。 - Provenance + SBOM:
provenance: mode=max和sbom: true產生供應鏈證明。這些需要attestations: write和id-token: write權限。 - 雙重註冊表:推送到 GHCR(使用
GITHUB_TOKEN,無需額外秘密)和 Docker Hub(需要DOCKERHUB_USERNAME+DOCKERHUB_TOKEN秘密)。如果不需要,請移除 Docker Hub 登入和映像行。 - Trivy:掃描建置的映像以尋找 CRITICAL 和 HIGH 漏洞,並將結果上傳到「安全性」標籤頁。
- 根據您的專案調整映像名稱和註冊表。如果僅使用 GHCR,請移除 Docker Hub 登入步驟和
images:中的docker.io/行。
儲存庫安全設定
儲存庫安全設定(分支保護、工作流程權限、秘密、環境)構成 CI 管線的安全基礎 — 這些記錄在 repo-security.md 中。
AI 驅動的程式碼審查
將 AI 代理作為 PR 審查者加入,與傳統靜態分析並行。當載入此技能外掛時,代理會根據審查領域套用相關的 Go 技能 — 捕捉 linter 無法偵測的架構漂移、邏輯錯誤、遺漏的錯誤上下文和並發危險。
成本注意: AI 審查代理會並行執行每個 PR。為了控制成本,請移除不需要的工作,或將 PR 觸發過濾器提高到僅限特定分支。
Claude Code
.github/workflows/ai-review.yml — 參見 claude-code-review.yml
工作流程會執行並行工作,每個工作針對一組審查領域和優先級:
| 工作 | 領域 | 優先級 |
|---|---|---|
quality |
程式碼風格、命名、文件、設計模式 | 建議優先 |
correctness |
錯誤處理、程式碼安全、並發 | 阻擋優先 |
security |
安全、相依性 | 阻擋優先 |
quality-depth |
測試、效能、可觀測性、現代化 | 混合 |
根據專案可能相關的其他技能:golang-cli、golang-context、golang-data-structures、golang-database、golang-dependency-injection,或任何函式庫特定的技能。
Claude Code GitHub App 整合透過 /install-github-app 指令配置,該指令會設定所需的 API 秘密。
GitHub Copilot
將技能複製到您的儲存庫,然後將 copilot-review-instructions.md 附加到 .github/copilot-instructions.md:
npx skills add https://github.com/samber/cc-skills-golang --agent github-copilot --skill '*' -y --copy
ln -s .agents .copilot
常見錯誤
| 錯誤 | 修正 |
|---|---|
CI 測試中缺少 -race |
始終使用 go test -race |
沒有 -shuffle=on |
隨機化測試順序以捕捉測試間的相依性 |
| 快取整合測試結果 | 使用 -count=1 停用快取 |
未檢查 go mod tidy |
加入 go mod tidy && git diff --exit-code 步驟 |
缺少 fail-fast: false |
一個 Go 版本失敗不應取消其他工作 |
| 未鎖定 action 版本 | GitHub Actions 必須使用固定的主要版本(例如 @vN,而非 @master) |
沒有 permissions 區塊 |
遵循每個工作的最小權限原則 |
| 忽略 govulncheck 發現 | 修正或附上理由壓制 |
| CI 中沒有 AI 審查 | 加入 Claude Code 或 Copilot 審查 — 捕捉靜態分析遺漏的邏輯、安全和架構問題 |
相關技能
參見 samber/cc-skills-golang@golang-lint、samber/cc-skills-golang@golang-security、samber/cc-skills-golang@golang-testing、samber/cc-skills-golang@golang-dependency-management、samber/cc-skills-golang@golang-modernize 技能。






