golang-continuous-integration

golang-continuous-integration

熱門

使用 GitHub Actions 為 Golang 專案配置 CI/CD 管線 — 包含測試、lint、SAST、安全掃描、程式碼覆蓋率、Dependabot、Renovate、GoReleaser、程式碼審查自動化以及發布管線。適用於設定或改善 Go 專案 CI、配置 GitHub Actions 工作流程、加入 linter 或安全掃描器、自動化相依性更新,或加入品質關卡。

2261星標
150分支
更新於 2026/6/6
SKILL.md
readonlyread-only
name
golang-continuous-integration
description

使用 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/checkoutactions/setup-gogolangci/golangci-lint-actioncodecov/codecov-actiongoreleaser/goreleaser-action 等)可能與此處顯示的不同。

快速參考

階段 工具 用途
測試 go test -race 單元測試 + 競爭檢測
覆蓋率 codecov/codecov-action 覆蓋率報告
Lint golangci-lint 全面 linting
Vet go vet 內建靜態分析
SAST gosecCodeQLBearer 安全靜態分析
漏洞掃描 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: writepull-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_USERNAMEDOCKERHUB_TOKEN 秘密必須在儲存庫秘密設定中配置 — 切勿硬編碼憑證。

關鍵細節:

  • QEMU + Buildx:多平台建置所需(linux/amd64,linux/arm64)。移除不需要的平台。
  • PR 上 push: false:映像在建置後絕不推送 — 這會驗證 Dockerfile 而不發布不受信任的程式碼。
  • Metadata action:自動產生 semver 標籤(v1.2.31.2.31.21)、分支標籤(main)和 SHA 標籤。
  • Provenance + SBOMprovenance: mode=maxsbom: true 產生供應鏈證明。這些需要 attestations: writeid-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-cligolang-contextgolang-data-structuresgolang-databasegolang-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-lintsamber/cc-skills-golang@golang-securitysamber/cc-skills-golang@golang-testingsamber/cc-skills-golang@golang-dependency-managementsamber/cc-skills-golang@golang-modernize 技能。