3、质量门禁基础概念

3.1 质量门禁定义

质量门禁(Quality Gate)是 CI/CD 流水线中预设的自动化检查点,用于在软件交付的特定阶段评估制品或代码是否满足预定义的质量标准。门禁的本质是将“事后发现”转变为“事中阻断”,确保只有符合质量要求的变更才能进入下一环节。

核心公式: 质量门禁 = 度量指标 + 阈值规则 + 判定动作

一个完整的质量门禁包含三个要素:

  • 度量指标(SLI): 如代码覆盖率、构建成功率、安全漏洞数、性能响应时间等。
  • 阈值规则(SLO): 如“单元测试覆盖率 ≥ 80%”、“高危漏洞 = 0”。
  • 判定动作: 通过(Pass)、阻塞(Block)、警告(Warn)、记录(Log)。

3.2 门禁类型

根据门禁触发后的行为差异,质量门禁分为三种类型:

类型 行为描述 流水线影响 典型场景
阻塞型 门禁失败时立即中断流水线,阻止后续阶段执行 流水线终止,返回失败状态 编译失败、安全漏洞超标、关键测试未通过
警告型 门禁失败时记录警告,流水线继续执行,但标记风险 流水线继续,但输出警告报告 代码风格违规、性能轻微退化、测试覆盖率略低于阈值
记录型 门禁仅记录度量结果,不阻断也不警告,用于数据采集 无影响,仅写入度量数据库 构建耗时统计、代码行数变化、历史趋势采集
最佳实践: 阻塞型门禁应控制在流水线关键路径上(如编译、单元测试、安全扫描),警告型和记录型门禁适合放在非关键路径或分析阶段,避免过度阻塞导致开发效率下降。

3.3 门禁在流水线中的位置

质量门禁通常部署在流水线的四个关键阶段,每个阶段的门禁类型和关注点不同:

  1. 提交阶段(Commit Stage): 代码编译、单元测试、静态代码分析。此处以阻塞型门禁为主,确保基础质量。
  2. 集成阶段(Integration Stage): 集成测试、API 契约测试、安全扫描。此处混合使用阻塞型和警告型门禁。
  3. 预发布阶段(Staging Stage): 性能测试、端到端测试、合规检查。此处以警告型和记录型门禁为主。
  4. 生产发布阶段(Production Stage): 灰度验证、金丝雀发布、SLO 校验。此处使用阻塞型门禁确保发布安全。
质量门禁在流水线中的位置与类型分布 质量门禁在流水线中的位置与类型分布 提交阶段 编译 / 单元测试 / 静态分析 阻塞型 集成阶段 集成测试 / 安全扫描 阻塞 警告 预发布阶段 性能测试 / 端到端测试 警告 记录 生产发布阶段 灰度验证 / SLO 校验 阻塞型 门禁类型分布原则 • 提交/生产阶段:以阻塞型为主,确保基础质量和发布安全 • 集成阶段:阻塞型 + 警告型混合,平衡质量与效率 • 预发布阶段:警告型 + 记录型为主,用于趋势分析和风险预警

3.4 门禁配置示例

以下是一个典型的多阶段门禁配置 YAML 示例,展示如何在流水线中定义不同类型的门禁:

quality_gates:
  - stage: "commit"
    gates:
      - name: "编译检查"
        type: blocking
        metric: "build_success"
        threshold: true
      - name: "单元测试覆盖率"
        type: blocking
        metric: "coverage"
        threshold: ">= 80%"
      - name: "代码规范检查"
        type: warning
        metric: "lint_errors"
        threshold: "<= 5"

  - stage: "integration"
    gates:
      - name: "高危漏洞扫描"
        type: blocking
        metric: "critical_vulnerabilities"
        threshold: 0
      - name: "API 兼容性"
        type: warning
        metric: "breaking_changes"
        threshold: 0

  - stage: "staging"
    gates:
      - name: "P95 响应时间"
        type: warning
        metric: "p95_latency_ms"
        threshold: "<= 500"
      - name: "构建耗时趋势"
        type: record
        metric: "build_duration_sec"
        threshold: null

  - stage: "production"
    gates:
      - name: "金丝雀错误率"
        type: blocking
        metric: "error_rate"
        threshold: "<= 0.1%"
常见误区: 不要将所有门禁都设置为阻塞型。过度阻塞会导致流水线频繁中断,降低开发效率。建议遵循“关键路径阻塞、非关键路径警告、数据采集记录”的分级策略。