Help us learn about your current experience with the documentation. Take the survey.

GitLab CI/CD workflow 关键字

  • Tier: Free, Premium, Ultimate
  • Offering: GitLab.com, GitLab Self-Managed, GitLab Dedicated

使用 workflow 关键字来控制何时创建流水线。

workflow 关键字在作业之前进行评估。例如,如果一个作业被配置为运行标签,但工作流阻止了标签流水线,那么该作业永远不会运行。

workflow:rules 常见的 if 子句

一些 workflow: rulesif 子句示例:

示例规则 详情
if: '$CI_PIPELINE_SOURCE == "merge_request_event"' 控制合并请求流水线的运行时机。
if: '$CI_PIPELINE_SOURCE == "push"' 控制分支流水线和标签流水线的运行时机。
if: $CI_COMMIT_TAG 控制标签流水线的运行时机。
if: $CI_COMMIT_BRANCH 控制分支流水线的运行时机。

更多示例请参见 规则常见 if 子句

workflow: rules 示例

在以下示例中:

  • 所有 push 事件(对分支的更改和新标签)都会触发流水线。
  • 提交消息以 -draft 结尾的 push 事件不会运行,因为它们被设置为 when: never
  • 计划任务或合并请求也不会运行,因为没有规则对其求值为真。
workflow:
  rules:
    - if: $CI_COMMIT_MESSAGE =~ /-draft$/
      when: never
    - if: $CI_PIPELINE_SOURCE == "push"

此示例有严格的规则,在其他任何情况下都不会运行流水线。

或者,所有规则都可以是 when: never,再加上一个最终的 when: always 规则。匹配 when: never 规则的流水线不会运行。所有其他类型的流水线都会运行。例如:

workflow:
  rules:
    - if: $CI_PIPELINE_SOURCE == "schedule"
      when: never
    - if: $CI_PIPELINE_SOURCE == "push"
      when: never
    - when: always

此示例会阻止计划任务或 push(分支和标签)流水线。最终的 when: always 规则会运行所有其他类型的流水线,包括合并请求流水线。

在分支流水线和合并请求流水线之间切换

要在合并请求创建后使流水线从分支流水线切换到合并请求流水线,请在 .gitlab-ci.yml 文件中添加 workflow: rules 部分。

如果您同时使用这两种流水线类型,可能会同时运行 重复的流水线。要防止重复流水线,请使用 CI_OPEN_MERGE_REQUESTS 变量

以下示例适用于仅运行分支和合并请求流水线的项目,但不运行其他情况的流水线。它会运行:

  • 当分支没有打开的合并请求时,运行分支流水线。
  • 当分支有打开的合并请求时,运行合并请求流水线。
workflow:
  rules:
    - if: $CI_PIPELINE_SOURCE == "merge_request_event"
    - if: $CI_COMMIT_BRANCH && $CI_OPEN_MERGE_REQUESTS
      when: never
    - if: $CI_COMMIT_BRANCH

如果 GitLab 尝试触发:

  • 合并请求流水线,启动流水线。例如,通过推送到带有相关打开合并请求的分支可以触发合并请求流水线。
  • 分支流水线,但如果该分支有打开的合并请求,则不运行分支流水线。例如,对分支的更改、API 调用、计划流水线等可以触发分支流水线。
  • 分支流水线,但如果该分支没有打开的合并请求,则运行分支流水线。

您还可以向现有的 workflow 部分添加规则,以便在创建合并请求时从分支流水线切换到合并请求流水线。

将该规则添加到 workflow 部分的顶部,后面跟着已有的其他规则:

workflow:
  rules:
    - if: $CI_COMMIT_BRANCH && $CI_OPEN_MERGE_REQUESTS && $CI_PIPELINE_SOURCE == "push"
      when: never
    - # 此处放置先前定义的工作流规则

在分支上运行的 触发式流水线 会设置 $CI_COMMIT_BRANCH,并且可能会被类似的规则阻塞。触发式流水线的管道源为 triggerpipeline,因此 && $CI_PIPELINE_SOURCE == "push" 确保该规则不会阻塞触发式流水线。

使用合并请求流水线的 Git Flow

您可以将 workflow: rules 与合并请求流水线一起使用。借助这些规则,您可以使用 合并请求流水线功能 处理特性分支,同时保留长期存在的分支以支持软件的多个版本。

例如,仅为您的合并请求、标签和保护分支运行流水线:

workflow:
  rules:
    - if: $CI_PIPELINE_SOURCE == "merge_request_event"
    - if: $CI_COMMIT_TAG
    - if: $CI_COMMIT_REF_PROTECTED == "true"

此示例假设您的长期存在分支是 受保护的

跳过草稿合并请求的流水线

您可以使用 workflow: rules 来跳过草稿合并请求的流水线。借助这些规则,您可以避免在开发完成前使用计算资源。

例如,以下规则将为标题包含 [Draft](Draft)Draft: 的合并请求禁用 CI 构建:

workflow:
  rules:
    - if: $CI_PIPELINE_SOURCE == "merge_request_event" && $CI_MERGE_REQUEST_TITLE =~ /^(\[Draft\]|\(Draft\)|Draft:)/
      when: never

stages:
  - build

build-job:
  stage: build
  script:
    - echo "测试中"

故障排除

合并请求卡在“正在检查流水线状态”消息

如果合并请求显示“正在检查流水线状态”,但消息从未消失(“加载动画”从未停止),可能是由于 workflow:rules 导致的。如果项目启用了 流水线必须成功,但 workflow:rules 阻止了对合并请求的流水线运行,就会发生这种情况。

例如,使用此工作流时,合并请求无法合并,因为没有流水线可以运行:

workflow:
  rules:
    - changes:
        - .gitlab/**/**.md
      when: never