我目前正在尝试构建我的 .gitlab-ci.yml 文件,如下所示:
为了避免将这些规则直接放入作业中(实际上大约有 30 个作业),我想在全球范围内重用这些规则。除了使用工作流程:规则之外,我找不到更好的方法。
workflow:
rules:
- if $CI_COMMIT_BRANCH == "develop"
variables:
RUN_A: "true"
- if $CI_COMMIT_BRANCH == "develop" && $CI_PIPELINE_SOURCE == "web"
variables:
RUN_B: "true"
job-a:
rules:
- if: $RUN_A == "true"
script:
- exit 0
job-b:
rules:
- if: $RUN_B == "true"
script:
- exit 0
Run Code Online (Sandbox Code Playgroud)
问题是,如果开发中有一个 Web 触发器,它不会将“RUN_B”设置为true
。它只会有“RUN_A”和true
. 我添加了另一项工作来打印变量只是为了确保:
test:
image: alpine
script:
- echo $RUN_A
- echo $RUN_B
Run Code Online (Sandbox Code Playgroud)
这只会打印true
RUN_A,但不会打印 RUN_B。我在 Gitlabs 文档中找不到任何说明它只会使用第一个匹配规则的内容。无论如何,有更好的方法来处理这个问题吗?我缺少什么?
小智 5
因为 GitLab ciRules
是按顺序评估的,直到第一个匹配。
在您的第一个规则if $CI_COMMIT_BRANCH == "develop"
匹配时,创建管道,此时RUN_A: "true"
设置了变量,但变量RUN_B
未定义。
根据您的情况,您可以修改 .gitlab-ci.yml。变量设置和规则顺序。
workflow:
rules:
- if: $CI_COMMIT_BRANCH == "develop" && $CI_PIPELINE_SOURCE == "web"
variables:
RUN_B: "true"
RUN_A: "true"
- if: $CI_COMMIT_BRANCH == "develop"
variables:
RUN_A: "true"
default:
image: alpine
job-a:
rules:
- if: $RUN_A == "true"
script:
- exit 0
job-b:
rules:
- if: $RUN_B == "true"
script:
- exit 0
test:
script:
- echo $RUN_A
- echo $RUN_B
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
3182 次 |
最近记录: |