gitlab - “仅”或“规则”关键字奇怪地从 CI 管道中删除作业
问题描述
我正在尝试使用“规则”和“仅”关键字来定义合并请求之间的管道行为,推送到开发分支并推送到主分支。
我注意到 Gitlab CI 中有几个奇怪的行为,让我们看看我的 merge_requests 管道。
- 有了这个gitlab-ci.yml文件,没有任何规则,所有的作业都会显示并运行。
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"
一切都按预期工作,太好了
- 有了这个gitlab-ci.yml文件,在第二个作业中没有“唯一”策略,没有规则的第一个作业就会消失。
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"
为什么没有规则或“唯一”政策的第一份工作消失了?
- 使用这个gitlab-ci.yml文件,在第二个作业中使用“规则”关键字,第一个没有规则的作业就会消失。
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"
为什么没有规则或“唯一”政策的第一份工作消失了?
感谢您的帮助,我不明白为什么我在其他工作中添加规则时我的工作消失了。
解决方案
根据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
管道,build
anddeploy
作业将运行,但是当创建新的合并请求时,会将更改推送到作为现有合并请求的源分支的分支,或者您点击 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
在此示例中,作业A
和B
运行适用于所有管道类型push
、tags
、merge_requests
等,但作业C
仅适用于merge_request
管道。
这就是为什么你的test_without_only_policy
工作永远不会在test_with_only_policy
运行的管道中。test_with_only_policy
专门为合并请求事件运行,但test_without_only_policy
不运行。
推荐阅读
- sql - BigQuery 中的 SQL WITHIN GROUP 相当于什么?
- django - 我们可以使用 queryset.first() 代替捕获异常吗?
- c++ - 如何处理错误:使用已删除的函数 c++?
- php - 为 WordPress 添加简码
- android - Android 6 上带有矢量可绘制对象的背景崩溃
- go - gorm 替换关联做许多更新查询
- angular - 使用角度时如何为mat-expansion-panel-body设置overflow = auto?
- c# - 如何从字节或流中获取文件版本?
- c# - 使用表达式访问嵌套属性和集合
- android - Android Studio:模拟器未检测到 wifi 网络