首页 > 解决方案 > “仅”或“规则”关键字奇怪地从 CI 管道中删除作业

问题描述

我正在尝试使用“规则”和“仅”关键字来定义合并请求之间的管道行为,推送到开发分支并推送到分支。

我注意到 Gitlab CI 中有几个奇怪的行为,让我们看看我的 merge_requests 管道。

image: "python:3.8"


stages:
  - test_without_only_policy
  - test_with_only_policy

test_without_only_policy:
  stage: test_without_only_policy
  when: manual
  script:
    - echo "Yay, I am in the pipeline"

test_with_only_policy:
  stage: test_with_only_policy
  script:
  - echo "I am always in the pipeline"

没有规则时两个作业都会出现

一切都按预期工作,太好了

image: "python:3.8"

stages:
  - test_without_only_policy
  - test_with_only_policy

test_without_only_policy:
  stage: test_without_only_policy
  when: manual
  script:
    - echo "No, I am not in the pipeline anymore"

test_with_only_policy:
  stage: test_with_only_policy
  only:
  - merge_requests
  script:
  - echo "I am always in the pipeline"

没有的工作

为什么没有规则或“唯一”政策的第一份工作消失了?

image: "python:3.8"

stages:
  - test_without_only_policy
  - test_with_only_policy

test_without_only_policy:
  stage: test_without_only_policy
  when: manual
  script:
    - echo "No, I am not in the pipeline anymore"

test_with_only_policy:
  stage: test_with_only_policy
  rules:
  - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
    when: manual
  script:
  - echo "I am always in the pipeline"

没有的工作

为什么没有规则或“唯一”政策的第一份工作消失了?

感谢您的帮助,我不明白为什么我在其他工作中添加规则时我的工作消失了。

标签: gitlabcontinuous-integrationgitlab-cicontinuous-deploymentcicd

解决方案


根据Merge Request Pipelines 的文档,如果您有一个管道,其中只有一些作业使用 only/except/rules with merge_reqeusts,如果它是一个合并请求管道,则只有这些作业才会在管道中。其他工作将被排除在外。

这是文档中的示例:

build:
  stage: build
  script: ./build
  only:
    - main

test:
  stage: test
  script: ./test
  only:
    - merge_requests

deploy:
  stage: deploy
  script: ./deploy
  only:
    - main

在此示例中,指定它应该为合并请求管道运行的唯一作业是test作业。对于标准push管道,buildanddeploy作业将运行,但是当创建新的合并请求时,会将更改推送到作为现有合并请求的源分支的分支,或者您点击 Pipelines 选项卡上的 Run Pipeline 按钮合并请求,它将运行一个合并请求管道。

这是另一个具有不同场景的示例:

A:
  stage: some_stage
  only:
    - branches
    - tags
    - merge_reqeusts
  script:
    - script.sh

B: 
  stage: some_other_stage
  only:
    - branches
    - tags
    - merge_reqeusts
  script:
    - script.sh

C: 
  stage: third_stage
  only:
    - merge_reqeusts
  script:
    - script.sh

在此示例中,作业AB运行适用于所有管道类型pushtagsmerge_requests等,但作业C仅适用于merge_request管道。

这就是为什么你的test_without_only_policy工作永远不会在test_with_only_policy运行的管道中。test_with_only_policy专门为合并请求事件运行,但test_without_only_policy不运行。


推荐阅读