11.11 CI/CD 流水线
概述
CI 门禁:后端 go vet + gofmt + build + test;前端 vue-tsc + eslint + 构建。CD:镜像/产物构建 → 部署 → 健康检查 → 冒烟。本节给出流水线模板与质量门建议。
CI 门禁(每次提交)
yaml
# 流水线示意(GitLab CI / GitHub Actions 通用)
stages: [check, build]
backend-check:
stage: check
script:
- go build ./...
- go vet ./...
- test -z "$(gofmt -l .)" # 格式检查(有输出即失败)
- go test ./... # sqlite 集成 + hooks MySQL 集成
frontend-check:
stage: check
working_dir: ui
script:
- pnpm install --frozen-lockfile
- pnpm type:check # vue-tsc
- pnpm lint:eslint构建与发布(tag/主干)
yaml
build-push:
stage: build
script:
# 后端镜像(多阶段 Dockerfile,位于 docker/ 目录,上下文为项目根)
- docker build -f docker/Dockerfile -t $REGISTRY/easygoadmin:$TAG .
- docker push $REGISTRY/easygoadmin:$TAG
# 前端产物
- cd ui && pnpm build && rsync -az dist/ $SERVER:/opt/ui/dist/
only: [main, tags]
deploy:
stage: deploy
script:
- ssh $SERVER "docker pull $REGISTRY/easygoadmin:$TAG && cd docker && docker compose up -d easygoadmin"
- ssh $SERVER "curl -sf http://127.0.0.1:8000/api/health" # 健康检查失败即中止
# 冒烟:登录 + 核心接口质量门建议
text
必过(阻断合并):
go build / go vet / gofmt
go test(sqlite 集成 + hooks MySQL 集成)
vue-tsc / eslint
增强(告警或分级):
黄金样本回归(hack/golden 接口响应比对——录制参数带 pageSize=3 等)
pnpm audit / go vulncheck(依赖漏洞)
覆盖率报告(逐步提升)黄金样本回归(项目内置能力)
text
hack/golden/after*/ 接口响应黄金样本(回归比对基线)
录制规范:带录制参数(pageSize=3 等)保证响应稳定可比
DIFF 归因三类:预期变更(更新样本)/ 非预期回归(修复)/ 环境差异(排除)
接入 CI:接口回归 job 对比新旧响应,非零差异阻断发布流水线完整链
text
提交 → CI 门禁 → 合并主干 → 构建镜像/产物 → 部署测试环境
→ 冒烟/回归 → 人工确认 → 生产发布(滚动/蓝绿)
→ health 验证 → 观察日志 → 完成/回滚密钥管理
text
CI 变量(加密变量/密钥库):
REGISTRY 凭据 / 部署 SSH 密钥 / GF_JWT_SECRET 等生产密钥
原则:
* 密钥不进代码仓库与镜像层
* 生产密钥仅 deploy 阶段注入(check 阶段不可见)
* 轮换有流程(改密钥 → 滚动重启 → 旧值失效窗口评估)分支策略建议
text
main 可发布主干(保护分支,CI 必过)
feature/* 功能分支 → MR → CI 门禁 → review 合并
hotfix/* 紧急修复 → 双人确认 → 快速通道发布
release/* 版本发布分支(打 tag 触发 CD)流水线排障
| 症状 | 处理 |
|---|---|
| gofmt 失败 | gofmt -w . 本地修复后提交 |
| go test 失败 | 集成测试依赖 MySQL/sqlite——CI 需起测试库服务 |
| vue-tsc 失败 | 类型错误本地 pnpm type:check 复现 |
| 部署后 health 失败 | 流水线自动中止;查容器日志/配置注入 |
| 镜像过大 | 多阶段构建 + alpine + .dockerignore |