跳转到内容

Ci Cd规范

流水线设计、自动化检查


[Requirement] CI/CD 流水线必须包含以下阶段,按顺序执行,任一阶段失败则中止后续阶段。

代码提交 → 1.构建 → 2.静态检查 → 3.单元测试 → 4.集成测试 → 5.安全扫描 → 6.制品入库 → 7.部署
阶段说明失败处理
构建编译、打包、生成可部署制品中止,通知提交者
静态检查Lint、类型检查、代码风格中止,通知提交者
单元测试运行单测,校验覆盖率中止,通知提交者
集成测试启动依赖服务,运行集成测试中止,通知提交者
安全扫描依赖漏洞、镜像漏洞、SAST中止,通知提交者 + 安全团队
制品入库推送镜像/包到制品仓库中止
部署部署到目标环境中止,回滚

[Standard] 所有项目使用统一的 CI/CD 流水线模板,禁止每个项目自行定义完整流水线,仅允许覆写特定步骤的参数。

GitHub Actions 示例:

# .github/workflows/ci.yml
name: CI
 
on:
  push:
    branches: [main, develop]
  pull_request:
    branches: [main]
 
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
 
      - name: Setup
        uses: actions/setup-node@v4
        with:
          node-version: '20'
          cache: 'npm'
 
      - name: Install
        run: npm ci
 
      - name: Lint
        run: npm run lint
 
      - name: Type Check
        run: npm run type-check
 
      - name: Unit Test
        run: npm run test:unit -- --coverage
 
      - name: Build
        run: npm run build
 
      - name: Security Scan
        run: npm audit --audit-level=high
 
  deploy-staging:
    needs: build
    if: github.ref == 'refs/heads/main'
    runs-on: ubuntu-latest
    steps:
      - name: Deploy to staging
        run: ./scripts/deploy.sh staging

[Standard] CI 流水线单次执行时间不超过 15 分钟,超时需优化(拆分任务、缓存依赖、并行化)。

[Suggestion] 对依赖安装、构建产物使用缓存,减少重复构建时间。

# 依赖缓存示例
- uses: actions/cache@v4
  with:
    path: ~/.npm
    key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
    restore-keys: |
      ${{ runner.os }}-node-
  • ❌ 流水线只有构建和部署,缺少测试和安全检查阶段。
  • ❌ 流水线执行时间超过 30 分钟,导致开发效率低下。
  • ❌ 每个项目自行定义流水线,格式和质量参差不齐。

[Requirement] 合并到主干分支前,以下检查必须全部通过,任一失败禁止合并。

检查项工具示例说明
代码风格检查ESLint / Prettier / Black / gofmt统一代码风格
类型检查TypeScript / mypy / Go vet编译期类型安全
单元测试Jest / pytest / JUnit核心逻辑测试
测试覆盖率nyc / coverage.py / JaCoCo覆盖率达标(见 单元测试规范)
安全扫描npm audit / Snyk / Trivy依赖漏洞检测
构建验证各语言构建命令确保可成功构建

[Requirement] CI 必须设置质量门禁(Quality Gate),以下指标不达标则流水线失败:

指标阈值
单元测试覆盖率≥ 70%(核心模块 ≥ 80%)
新增代码覆盖率≥ 80%
严重/高危漏洞数0
阻断级 Code Smell 数0
# sonar-project.properties
sonar.qualitygate.wait=true
 
# 门禁规则(在 SonarQube 控制台配置)
# 1. Coverage on New Code < 80% → Error
# 2. Vulnerabilities > 0 → Error
# 3. Security Hotspots Reviewed < 100% → Error

[Standard] 使用 Git Hooks(Husky / pre-commit)在提交前自动执行轻量检查,减少 CI 失败次数。

// package.json
{
  "husky": {
    "hooks": {
      "pre-commit": "lint-staged",
      "pre-push": "npm run test:unit"
    }
  },
  "lint-staged": {
    "*.{ts,tsx}": ["eslint --fix", "prettier --write"],
    "*.py": ["black --check", "flake8"]
  }
}
  • ❌ CI 检查失败后,通过 --force 或关闭门禁强行合并。
  • ❌ 测试覆盖率统计排除了核心业务代码。
  • ❌ 安全扫描只在发布时才运行,开发阶段完全不检查。

[Requirement] 所有可部署制品(Docker 镜像、Jar 包、前端构建产物)必须有唯一不可变版本号,遵循 版本号规范 的语义化版本(SemVer)。

镜像标签:registry.example.com/user-service:1.2.3
制品路径:artifactory.example.com/user-service/1.2.3/app.jar

[Caution] 禁止使用 latest 标签部署到生产环境,必须使用确定的版本号。

[Standard] 所有制品必须推送到统一的制品仓库(Nexus / Artifactory / Harbor),禁止制品散落在开发机或 CI 临时目录。

制品类型仓库说明
Docker 镜像Harbor / ECR按项目分仓库
Maven 包NexusgroupId 统一前缀 com.example
npm 包Verdaccio / npm registry私有包前缀 @example/
前端构建产物对象存储 / CDN按版本号分目录

[Standard] 制品保留策略:

环境保留时长说明
dev 构建7 天自动清理
test 构建30 天自动清理
staging 构建90 天自动清理
prod 构建永久不可删除

[Suggestion] 生产环境制品必须经过签名校验,防止篡改。

# Docker 镜像签名(cosign)
cosign sign registry.example.com/user-service:1.2.3
cosign verify registry.example.com/user-service:1.2.3

[Standard] 不同分支的 CI/CD 行为必须区分:

分支CI 触发CD 目标
feature/*全量 CI 检查不部署
develop全量 CI 检查自动部署到 test
main全量 CI 检查 + 制品入库自动部署到 staging
release/*全量 CI 检查手动审批后部署到 prod
hotfix/*全量 CI 检查手动审批后部署到 prod

[Requirement] 所有 Pull Request 必须触发 CI 检查,检查通过且至少 1 人审批后方可合并。

# GitHub 分支保护规则
required_status_checks:
  strict: true
  contexts:
    - lint
    - type-check
    - unit-test
    - security-scan
required_pull_request_reviews:
  required_approving_review_count: 1
  dismiss_stale_reviews: true

[Standard] 每天凌晨定时运行全量测试和安全扫描,及时发现依赖漏洞和间歇性测试失败。

on:
  schedule:
    - cron: '0 2 * * *'  # 每天凌晨 2 点

[Standard] 支持手动触发流水线(workflow_dispatch),便于回滚和紧急部署。

on:
  workflow_dispatch:
    inputs:
      version:
        description: '部署版本号'
        required: true
      environment:
        description: '目标环境'
        required: true
        default: 'staging'

[Requirement] CI/CD 流水线使用的凭证(Token、密钥)必须最小权限,禁止使用管理员权限或个人 Token。

[Requirement] 所有密钥必须通过 Secret Manager 管理,禁止明文写入流水线配置文件。

# GitHub Actions 使用 Secrets
- name: Deploy
  env:
    DEPLOY_TOKEN: ${{ secrets.DEPLOY_TOKEN }}
    DB_PASSWORD: ${{ secrets.DB_PASSWORD }}
  run: ./scripts/deploy.sh

[Requirement] prod 环境部署必须经过审批,禁止自动部署。审批人至少 1 人,且不能是提交者本人。

环境审批要求
dev无需审批
test无需审批
staging无需审批(自动)
prod必须审批(≥1 人)

[Requirement] 所有流水线操作(构建、部署、回滚)必须记录操作日志,包括操作人、时间、版本、环境。

[Standard] 审计日志保留至少 180 天,支持按操作人、时间、环境检索。

  • ❌ 流水线配置中硬编码数据库密码。
  • ❌ 使用个人 GitHub Token 作为 CI 凭证,人员离职后失效。
  • ❌ prod 部署无审批,合并即自动上线。
  • ❌ 无操作审计日志,出问题无法追溯。