111 lines
3.4 KiB
Markdown
111 lines
3.4 KiB
Markdown
# 11.11 CI/CD 流水线
|
||
|
||
:::tip 概述
|
||
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 |
|