4. 标准模板设计原则:单一职责、可复用性、可组合性、版本化、参数化设计

标准模板是 CI/CD 服务目录的“乐高积木”。如果模板设计不合理,服务目录将变成难以维护的“意大利面条”。本章定义五项核心设计原则,确保模板具备高内聚、低耦合、可演进的特征。

设计目标: 模板不仅是“复制粘贴”的起点,更是平台工程中可编程、可治理、可审计的基础单元。每一条原则都直接对应服务目录的验证规则。

4.1 五项原则总览

原则 核心含义 反例(不可接受) 验证要点
单一职责 一个模板只解决一个构建/部署/基础设施动作 一个模板同时做编译、单元测试、镜像推送、K8s 部署 模板动作数 ≤ 1 个原子操作
可复用性 模板不绑定特定项目、环境或秘钥 模板内硬编码项目名 my-app 或数据库连接串 模板变量覆盖率 ≥ 95%
可组合性 模板可通过输入/输出串联成流水线 模板之间无 artifact 传递,只能手动触发 输入/输出接口标准化率 100%
版本化 模板有语义化版本,变更可追溯 模板直接覆盖,无版本记录 模板仓库 Git tag 合规率
参数化设计 所有可变项通过参数暴露,含默认值和校验 参数无类型、无校验、无默认值 参数 schema 定义完整度

4.2 单一职责(Single Responsibility)

每个模板对应 CI/CD 服务目录中的一个原子服务单元。例如:maven-build 只负责编译和单元测试;docker-push 只负责构建镜像并推送到仓库;helm-deploy 只负责执行 Helm 升级。

验证规则: 模板 YAML 中 steps 或 jobs 数量不得超过 1 个逻辑阶段。如果模板包含“编译 + 部署”两个阶段,必须拆分为两个独立模板。
# 错误示例:一个模板做两件事
stages:
  - build: mvn clean package
  - deploy: kubectl apply -f deploy.yaml

# 正确示例:拆分为两个模板
# template: maven-build
stages:
  - build: mvn clean package
# template: k8s-deploy
stages:
  - deploy: kubectl apply -f deploy.yaml

4.3 可复用性(Reusability)

模板必须与具体项目、环境、秘钥解耦。所有差异化内容通过参数注入。可复用性直接决定服务目录的“模板共享率”。

  • 禁止硬编码: 项目名、命名空间、镜像仓库地址、 等必须参数化。
  • 环境无关: 模板不区分 dev/staging/prod,环境差异由参数覆盖。
  • 秘钥外部化: 敏感信息通过 CI/CD 平台的 Secret 管理或 Vault 引用。
常见失败模式: 团队 A 创建了一个“完美”模板,但团队 B 使用时发现模板内嵌了团队 A 的 Git 仓库地址。可复用性验证必须包含“跨团队盲测”。

4.4 可组合性(Composability)

模板之间通过标准化的输入/输出契约串联成完整流水线。可组合性使服务目录从“模板列表”进化为“流水线工厂”。

模板可组合性:标准化输入/输出串联流水线 代码检出 输出: source_dir Maven 构建 输出: artifact.jar 镜像构建 输出: image:tag K8s 部署 输出: deploy_status 标准化接口契约 • 每个模板声明 inputs(参数)和 outputs(产物/状态) • 下游模板通过 ${{ outputs.上游模板名.变量名 }} 引用上游产物 • 服务目录验证:模板间引用关系必须形成有向无环图(DAG)

4.5 版本化(Versioning)

模板必须遵循语义化版本 2.0.0(MAJOR.MINOR.PATCH)。版本化是服务目录治理的基石,直接影响变更审计和回滚能力。

版本段 变更场景 示例 服务目录影响
MAJOR 破坏性变更:输入参数删除、输出格式变更 v1.0.0 → v2.0.0 所有引用该模板的流水线必须升级
MINOR 新增功能:增加可选参数、增加输出字段 v1.0.0 → v1.1.0 向下兼容,流水线可选择性升级
PATCH 缺陷修复:脚本 bug 修复、安全补丁 v1.0.0 → v1.0.1 自动推荐升级,不影响接口
版本存储策略: 模板仓库使用 Git tag 标记版本,服务目录只引用 refs/tags/v1.2.3 而非分支名。禁止使用 latest 或 main 作为模板版本。

4.6 参数化设计(Parameterization)

模板的所有可变项必须通过参数暴露,并附带类型、默认值、描述、校验规则。参数化设计是模板从“黑盒”变为“白盒”的关键。

# 参数化模板示例(YAML 格式)
parameters:
  - name: app_name
    type: string
    description: "应用名称,用于命名空间和标签"
    default: "my-app"
    validation:
      pattern: "^[a-z0-9-]{3,30}$"
      message: "应用名称必须为小写字母、数字、连字符,长度 3-30"
  - name: replicas
    type: integer
    description: "Pod 副本数"
    default: 2
    validation:
      min: 1
      max: 10
  - name: enable_canary
    type: boolean
    description: "是否启用金丝雀发布"
    default: false
参数化设计层级:从模板定义到运行时注入 模板定义层 声明参数 schema 类型/默认值/校验 服务目录层 绑定参数默认值 环境级参数覆盖 运行时注入层 Pipeline 触发传参 手动/自动覆盖 参数优先级(从低到高) 模板默认值 → 服务目录环境配置 → Pipeline 触发参数 → 运行时手动输入

4.7 原则协同与验证矩阵

五项原则并非孤立存在,它们共同构成模板质量的五维验证模型。服务目录在收录模板时,必须逐项检查。

验证维度 检查项 通过标准 自动化工具
单一职责 模板动作数 ≤ 1 个原子操作 YAML 解析 + 阶段计数
可复用性 硬编码字符串检测 0 个硬编码项目名/环境名 正则扫描 + 白名单
可组合性 输入/输出接口定义 100% 模板声明 inputs/outputs Schema 校验
版本化 Git tag 合规 符合 semver 2.0 Git tag 正则校验
参数化设计 参数 schema 完整度 每个参数含 type/default/description JSON Schema 校验
治理建议: 在服务目录的 CI/CD 流水线中,加入“模板质量门禁”。每次模板提交时,自动运行五维验证,任何一项不通过则阻断合并。只有通过验证的模板才能被服务目录收录和发布。