skills/go-ci-tooling/SKILL.md
Go CI/CD 工具配置:Makefile、golangci-lint、GitHub Actions、Docker、測試覆蓋率、 自動化流程、Pre-commit Hook。 **適用場景**:設計 CI/CD Pipeline、配置 golangci-lint、撰寫 Makefile、 Docker 多階段建置、測試自動化、程式碼品質檢查、GitHub Actions。
npx skillsauth add vincent119/ai-rules-kit go-ci-toolingInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
相關 Skills:本規範建議搭配
go-testing-advanced(測試)與go-graceful-shutdown(建置)
.PHONY: help
help: ## 顯示此說明
@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | \
awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-20s\033[0m %s\n", $$1, $$2}'
# 變數
BINARY_NAME=myapp
VERSION?=dev
COMMIT=$(shell git rev-parse --short HEAD)
BUILD_TIME=$(shell date -u '+%Y-%m-%d_%H:%M:%S')
# Go 變數
GOBASE=$(shell pwd)
GOBIN=$(GOBASE)/bin
GOCMD=go
GOBUILD=$(GOCMD) build
GOTEST=$(GOCMD) test
GOMOD=$(GOCMD) mod
# Ldflags(注入版本資訊)
LDFLAGS=-ldflags "-X main.Version=$(VERSION) -X main.Commit=$(COMMIT) -X main.BuildTime=$(BUILD_TIME)"
.PHONY: build
build: ## 建置二進位檔
@echo "Building $(BINARY_NAME)..."
$(GOBUILD) $(LDFLAGS) -o $(GOBIN)/$(BINARY_NAME) ./cmd/server
.PHONY: test
test: ## 執行單元測試
$(GOTEST) -v -race -coverprofile=coverage.out ./...
.PHONY: test-coverage
test-coverage: test ## 測試覆蓋率報告
$(GOCMD) tool cover -html=coverage.out -o coverage.html
@echo "Coverage report: coverage.html"
.PHONY: lint
lint: ## 執行 Linter
@which golangci-lint > /dev/null || (echo "Installing golangci-lint..." && go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest)
golangci-lint run --timeout=5m
.PHONY: fmt
fmt: ## 格式化程式碼
gofmt -s -w .
goimports -w .
.PHONY: tidy
tidy: ## 整理依賴
$(GOMOD) tidy
$(GOMOD) verify
.PHONY: clean
clean: ## 清理建置產物
@echo "Cleaning..."
@rm -rf $(GOBIN)
@rm -f coverage.out coverage.html
.PHONY: docker-build
docker-build: ## 建置 Docker Image
docker build -t $(BINARY_NAME):$(VERSION) .
.PHONY: run
run: build ## 執行應用程式
$(GOBIN)/$(BINARY_NAME)
.PHONY: install-tools
install-tools: ## 安裝開發工具
@echo "Installing development tools..."
go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest
go install golang.org/x/tools/cmd/goimports@latest
go install go.uber.org/mock/mockgen@latest
.PHONY: generate
generate: ## 執行 go generate
go generate ./...
.PHONY: all
all: tidy fmt lint test build ## 執行所有檢查與建置
# 只在原始碼變更時重新建置
$(GOBIN)/$(BINARY_NAME): $(shell find . -name '*.go')
@echo "Source changed, rebuilding..."
$(GOBUILD) $(LDFLAGS) -o $@ ./cmd/server
.PHONY: build
build: $(GOBIN)/$(BINARY_NAME)
run:
timeout: 5m
tests: true
skip-dirs:
- mocks
- vendor
skip-files:
- ".*\\.pb\\.go$"
- ".*_gen\\.go$"
linters:
enable:
- errcheck # 檢查未處理的錯誤
- gosimple # 簡化程式碼
- govet # Go vet
- ineffassign # 檢測無效的賦值
- staticcheck # 靜態分析
- typecheck # 型別檢查
- unused # 檢查未使用的變數
- gofmt # 格式檢查
- goimports # Import 排序
- misspell # 拼寫檢查
- gocritic # 程式碼評論
- godox # 檢查 TODO/FIXME
- revive # 取代 golint
- cyclop # 循環複雜度
- dupl # 重複程式碼檢測
- gosec # 安全性檢查
- gocognit # 認知複雜度
- nestif # 巢狀 if 檢查
- prealloc # Slice 預分配
- gci # Import 排序
- lll # 行長度檢查
linters-settings:
errcheck:
check-blank: true
check-type-assertions: true
govet:
check-shadowing: true
gocognit:
min-complexity: 15
cyclop:
max-complexity: 15
lll:
line-length: 120
revive:
rules:
- name: exported
severity: warning
- name: unexported-return
severity: warning
- name: indent-error-flow
severity: warning
gosec:
excludes:
- G104 # 允許部分未檢查的錯誤(需有註釋)
- G304 # 允許檔案路徑來自變數
issues:
exclude-rules:
# 測試檔案放寬限制
- path: _test\.go
linters:
- dupl
- gosec
- gocognit
- cyclop
# Mock 檔案不檢查
- path: mock/
linters:
- all
max-issues-per-linter: 50
max-same-issues: 3
name: CI
on:
push:
branches: [ main, develop ]
pull_request:
branches: [ main, develop ]
jobs:
lint:
name: Lint
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Setup Go
uses: actions/setup-go@v4
with:
go-version: '1.21'
cache: true
- name: golangci-lint
uses: golangci/golangci-lint-action@v3
with:
version: latest
args: --timeout=5m
test:
name: Test
runs-on: ubuntu-latest
services:
postgres:
image: postgres:15
env:
POSTGRES_PASSWORD: postgres
POSTGRES_DB: testdb
options: >-
--health-cmd pg_isready
--health-interval 10s
--health-timeout 5s
--health-retries 5
ports:
- 5432:5432
redis:
image: redis:7
options: >-
--health-cmd "redis-cli ping"
--health-interval 10s
--health-timeout 5s
--health-retries 5
ports:
- 6379:6379
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Setup Go
uses: actions/setup-go@v4
with:
go-version: '1.21'
cache: true
- name: Run tests
run: |
go test -v -race -coverprofile=coverage.out -covermode=atomic ./...
env:
DATABASE_URL: postgres://postgres:postgres@localhost:5432/testdb?sslmode=disable
REDIS_URL: redis://localhost:6379
- name: Upload coverage
uses: codecov/codecov-action@v3
with:
files: ./coverage.out
flags: unittests
fail_ci_if_error: true
build:
name: Build
runs-on: ubuntu-latest
needs: [lint, test]
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Setup Go
uses: actions/setup-go@v4
with:
go-version: '1.21'
cache: true
- name: Build
run: make build
- name: Upload artifact
uses: actions/upload-artifact@v3
with:
name: binary
path: bin/myapp
name: Release
on:
push:
tags:
- 'v*'
jobs:
release:
name: Release
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v3
with:
fetch-depth: 0
- name: Setup Go
uses: actions/setup-go@v4
with:
go-version: '1.21'
- name: Run GoReleaser
uses: goreleaser/goreleaser-action@v4
with:
version: latest
args: release --clean
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
# Stage 1: Builder
FROM golang:1.21-alpine AS builder
# 安裝必要工具
RUN apk add --no-cache git make
WORKDIR /app
# 複製 go.mod 和 go.sum(利用快取)
COPY go.mod go.sum ./
RUN go mod download
# 複製原始碼
COPY . .
# 建置
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 \
go build -ldflags="-s -w" -o bin/myapp ./cmd/server
# Stage 2: Runtime
FROM alpine:latest
# 安裝 CA 憑證與時區資料
RUN apk --no-cache add ca-certificates tzdata
WORKDIR /app
# 複製二進位檔
COPY --from=builder /app/bin/myapp .
# 複製設定檔(可選)
COPY ./configs ./configs
# 建立非 root 使用者
RUN addgroup -g 1000 appuser && \
adduser -D -u 1000 -G appuser appuser && \
chown -R appuser:appuser /app
USER appuser
EXPOSE 8080
ENTRYPOINT ["./myapp"]
# Git
.git
.gitignore
# IDE
.vscode
.idea
*.swp
# Build artifacts
bin/
coverage.out
coverage.html
# Docs
docs/
*.md
# Tests
*_test.go
# Temp files
tmp/
*.log
repos:
- repo: https://github.com/golangci/golangci-lint
rev: v1.54.2
hooks:
- id: golangci-lint
args: ['--timeout=5m']
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v4.4.0
hooks:
- id: trailing-whitespace
- id: end-of-file-fixer
- id: check-yaml
- id: check-added-large-files
# 安裝 pre-commit
pip install pre-commit
# 安裝 Hooks
pre-commit install
# 手動執行(所有檔案)
pre-commit run --all-files
[](https://codecov.io/gh/username/repo)
# HTML 報告
make test-coverage
open coverage.html
# 終端顯示
go test -coverprofile=coverage.out ./...
go tool cover -func=coverage.out
# 按套件統計
go test -coverprofile=coverage.out ./...
go tool cover -func=coverage.out | grep -E '^total:'
Makefile
help 目標(自動生成說明)golangci-lint
.golangci.ymlGitHub Actions
Docker
.dockerignorePre-commit
.pre-commit-config.yaml測試覆蓋率
tools
基於 SLA/SLO 量化評估事故影響的計算模型與業務影響矩陣。適用於「SLA 影響」、「SLO 違反」、「影響評估」、「營收損失估算」、「Error Budget」、「可用性計算」、「事故成本評估」等量化事故業務影響的任務。強化 impact-assessor 的評估能力。注意:事故原因分析與改善規劃不在此技能範圍內。
research
根因分析(RCA)方法論詳細指南。提供 5 Whys、Fishbone 圖、Fault Tree Analysis、變更分析等結構化 RCA 技術,以及認知偏誤防範清單。適用於「根因分析」、「RCA」、「5 Whys」、「魚骨圖」、「Fault Tree」、「原因分析方法論」、「變更分析」等事故原因分析任務。強化 root-cause-investigator 的分析能力。注意:時間軸重建與改善規劃不在此技能範圍內。
testing
事故事後分析(Postmortem)完整流程。協調 7 個執行階段:資訊收集 → 時間軸重建 → 根因分析 → 影響評估 → 改善規劃 → 報告審查 → 整合報告,最終產出完整的 Postmortem 報告。適用於「寫事故報告」、「post-incident 分析」、「RCA 報告」、「事故時間軸整理」、「建立改善措施」等請求。注意:即時 Incident Response(on-call)、監控系統設定、告警配置不在此技能範圍內。
content-media
投影片版面模式庫。提供 20 種投影片類型的最佳版面配置、格線系統、色彩與字型設計 Token。適用於「投影片版面」、「Slide Layout」、「設計系統」、「格線」、「字型」、「色彩規範」等投影片視覺設計任務。強化 visual-designer 的設計能力。注意:PPT/Keynote 檔案直接輸出不在此技能範圍內。