GitLab CI/CD workflow 关键字
- Tier: Free, Premium, Ultimate
- Offering: GitLab.com, GitLab Self-Managed, GitLab Dedicated
使用 workflow 关键字来控制何时创建流水线。
workflow 关键字在作业之前进行评估。例如,如果一个作业被配置为运行标签,但工作流阻止了标签流水线,那么该作业永远不会运行。
workflow:rules 常见的 if 子句
一些 workflow: rules 的 if 子句示例:
| 示例规则 | 详情 |
|---|---|
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,并且可能会被类似的规则阻塞。触发式流水线的管道源为 trigger 或 pipeline,因此 && $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