4. 流水线模板基础:流水线模板的组成要素与 YAML/JSON 语法

流水线模板是 CI/CD 服务目录的核心资产。它将重复的构建、测试、部署逻辑抽象为可复用的参数化定义,使团队无需从零编写流水线,只需填写参数即可生成标准化的交付流程。理解模板的组成要素与语法结构,是构建服务目录的第一步。

4.1 流水线模板的四大组成要素

一个完整的流水线模板由 阶段(Stage)、任务(Job)、步骤(Step) 和 触发器(Trigger) 四层结构构成。它们形成自上而下的嵌套关系:流水线包含多个阶段,每个阶段包含多个任务,每个任务包含多个步骤,而触发器决定流水线的启动条件。

要素 层级 职责 典型示例
阶段(Stage) 1(顶层) 定义流水线的逻辑阶段,如构建、测试、部署。阶段之间可串行或并行。 build、test、deploy
任务(Job) 2 阶段内的执行单元,每个任务运行在独立的执行环境中(如容器、虚拟机)。 compile、unit-test、deploy-prod
步骤(Step) 3 任务内的最小操作单元,可以是脚本命令、插件调用或子流水线。 npm install、docker build
触发器(Trigger) 0(前置) 定义流水线的启动条件,包括代码推送、定时、手动、事件等。 push、schedule、webhook
设计原则:阶段控制流程节奏,任务隔离执行环境,步骤封装原子操作,触发器解耦启动方式。四层分离使模板具备高度的可组合性与可维护性。

4.2 流水线模板的 YAML/JSON 语法结构

YAML 和 JSON 是流水线模板最常用的两种序列化格式。YAML 因其可读性高、支持注释、缩进结构清晰,成为主流选择;JSON 则在工具链集成和严格校验场景中更受青睐。以下以 YAML 为例展示标准模板结构。

# 流水线模板示例:标准 Java 微服务 CI 流水线
# 文件: pipeline-template-java-ci.yaml

# 模板元数据
name: java-ci-pipeline
version: 1.0.0
description: "标准 Java 微服务 CI 流水线模板"

# 参数定义(服务目录填充入口)
parameters:
  - name: app_name
    type: string
    description: "应用名称"
  - name: java_version
    type: string
    default: "17"
  - name: deploy_env
    type: string
    allowed_values: ["dev", "staging", "prod"]

# 触发器定义
trigger:
  - event: push
    branches: ["main", "develop"]
  - event: pull_request
    branches: ["main"]

# 阶段定义
stages:
  - name: build
    jobs:
      - name: compile
        steps:
          - run: echo "Checking out code..."
          - run: mvn clean compile -Djava.version=${{ parameters.java_version }}
      - name: unit-test
        steps:
          - run: mvn test
  - name: package
    jobs:
      - name: docker-build
        steps:
          - run: docker build -t ${{ parameters.app_name }}:latest .
  - name: deploy
    jobs:
      - name: deploy-to-env
        steps:
          - run: echo "Deploying to ${{ parameters.deploy_env }}..."
语法要点:YAML 使用缩进表示层级(2 空格为标准),# 表示注释,${{ }} 为参数引用语法。JSON 版本需使用双引号包裹所有键和字符串值,且不支持注释。

4.3 要素详解:阶段、任务、步骤、触发器的配置模式

4.3.1 阶段(Stage)配置

阶段是流水线的顶层逻辑分组。每个阶段可以包含一个或多个任务,阶段之间默认串行执行,但可通过 parallel 属性实现并行阶段。

stages:
  - name: build
    parallel: false   # 阶段内任务串行
    jobs:
      - name: compile
      - name: unit-test
  - name: deploy
    parallel: true    # 阶段内任务并行
    jobs:
      - name: deploy-dev
      - name: deploy-staging

4.3.2 任务(Job)配置

任务定义执行环境、依赖关系和超时策略。每个任务运行在独立的容器或虚拟机中,确保环境隔离。

jobs:
  - name: compile
    image: maven:3.8-openjdk-17   # 执行环境
    timeout: 30                    # 超时分钟
    dependencies: []               # 依赖的上游任务
    steps:
      - run: mvn compile

4.3.3 步骤(Step)配置

步骤是原子操作,支持三种类型:run(执行脚本)、plugin(调用插件)、pipeline(触发子流水线)。

步骤类型 语法 适用场景
脚本步骤 run: echo "Hello" 执行 shell 命令、构建工具、测试脚本
插件步骤 plugin: sonarqube 集成第三方工具(代码扫描、通知、制品上传)
子流水线步骤 pipeline: child-pipeline.yml 复用已有流水线模板,实现嵌套编排

4.3.4 触发器(Trigger)配置

触发器定义流水线的启动条件。常见触发器包括代码事件、定时任务、手动触发和外部 Webhook。

trigger:
  - event: push
    branches: ["main", "release/*"]
    paths: ["src/**", "pom.xml"]   # 仅当这些文件变更时触发
  - event: schedule
    cron: "0 2 * * *"              # 每天凌晨 2 点执行
  - event: manual                  # 手动触发,需带参数
    parameters:
      - name: deploy_env
        type: string
常见陷阱:触发器路径过滤(paths)容易遗漏文档或配置文件变更;建议在模板中同时包含 paths_ignore 黑名单机制,避免不必要的流水线执行。

4.4 流水线模板的 YAML/JSON 语法对比

特性 YAML JSON
可读性 高(缩进结构,支持注释) 中(括号嵌套,无注释)
严格性 低(缩进敏感,易出错) 高(语法严格,校验工具多)
参数引用 ${{ param }} "{{ param }}"
多行字符串 支持 | 和 > 块标量 需 \n 转义
工具生态 GitLab CI、GitHub Actions、CircleCI Jenkins Pipeline、Azure DevOps
推荐策略:服务目录的模板定义层使用 YAML(便于人工编写和审查),模板渲染后的实例化流水线可转换为 JSON(便于机器解析和缓存)。这种“YAML 源 → JSON 运行时”的双格式策略兼顾了开发体验与执行效率。

4.5 流水线模板的组成结构图

下图展示了流水线模板的四层组成结构及其嵌套关系,帮助理解从触发器到步骤的完整链路。

流水线模板四层组成结构图 流水线模板四层组成结构 触发器(Trigger) 阶段(Stage) build → test → package → deploy 任务(Job) compile(Maven) | unit-test(JUnit) | docker-build 每个任务独立容器/VM,支持并行执行 步骤(Step) run: mvn clean compile | plugin: sonarqube | pipeline: child.yml 四层嵌套关系 1 个流水线包含 N 个阶段 → 1 个阶段包含 N 个任务 → 1 个任务包含 N 个步骤

4.6 模板参数化与变量引用

服务目录的核心价值在于参数化。模板通过 parameters 块定义可配置项,用户在创建流水线实例时只需填写参数值,无需修改模板逻辑。参数支持类型校验、默认值和枚举约束。

# 参数定义示例
parameters:
  - name: app_name
    type: string
    description: "应用名称"
    required: true
  - name: replicas
    type: integer
    default: 2
    min: 1
    max: 10
  - name: env
    type: string
    allowed_values: ["dev", "staging", "prod"]
    default: "dev"

# 在步骤中引用参数
steps:
  - run: kubectl scale deployment ${{ parameters.app_name }} --replicas=${{ parameters.replicas }}
参数引用语法:YAML 模板中统一使用 ${{ parameters.xxx }} 格式;JSON 模板使用 "{{ parameters.xxx }}"。部分平台(如 GitLab CI)使用 $VAR 环境变量方式,但服务目录推荐显式参数引用以提升可读性。

4.7 模板版本管理与复用策略

流水线模板应纳入版本控制(Git),每个模板文件包含 version 字段。服务目录支持模板的语义化版本(SemVer),用户可指定使用 1.x 或 ^1.2.0 等版本范围。

版本策略 语法 说明
精确版本 1.2.0 锁定特定版本,不自动升级
次要版本范围 ^1.2.0 允许补丁版本升级(1.2.x)
主版本范围 ~1.0.0 允许次要版本升级(1.x.x)
最新版本 latest 始终使用最新模板(不推荐生产环境)
最佳实践:服务目录的模板仓库采用 Git 分支策略——main 分支存放稳定版本,develop 分支存放开发中版本。每个模板文件通过 version 字段与 Git Tag 对齐,确保可追溯。

4.8 模板语法校验与测试

在将模板发布到服务目录之前,必须进行语法校验和逻辑测试。推荐使用以下工具链:

  • YAML 校验:yamllint 检查缩进、键值对格式;yq 用于查询和转换 YAML 结构。
  • JSON 校验:jsonlint 或 jq 验证 JSON 语法和结构完整性。
  • 模板渲染测试:使用服务目录的 CLI 工具(如 catalog-cli validate)模拟参数填充,验证渲染后的流水线是否合法。
  • 流水线模拟执行:在沙箱环境中执行渲染后的流水线,验证阶段顺序、任务依赖和步骤命令的正确性。
# 使用 yamllint 校验模板
yamllint pipeline-template-java-ci.yaml

# 使用 yq 提取参数列表
yq eval '.parameters[].name' pipeline-template-java-ci.yaml

# 使用服务目录 CLI 渲染并校验
catalog-cli render --template java-ci --params '{"app_name":"my-app","env":"dev"}' --validate
注意:模板中的脚本步骤(run)不会在语法校验阶段执行,建议在模板中嵌入单元测试步骤,或在沙箱环境中执行完整的流水线模拟,避免将语法正确但逻辑错误的模板发布到生产目录。