Gitlab CI条件语句不能按预期工作:AND和OR条件都不能工作
对于Gitlab CI(Gitlab cloud)中的作业,我希望具备以下条件Gitlab CI条件语句不能按预期工作:AND和OR条件都不能工作,gitlab,gitlab-ci,Gitlab,Gitlab Ci,对于Gitlab CI(Gitlab cloud)中的作业,我希望具备以下条件 目标分支应为主分支或生产分支 提交应该有一个与之关联的标记,其模式为vx.x或vx.x 首先,我认为以下陈述应该有效: only: - master - production only: - tags only: - /^v[0-9](?:\.[0-9]){2,3}/ 但是不管你怎么安排,它总是把不同的语句看作是或。因此,我提出了以下声明,看看我是否能够正确地解决
- 目标分支应为
或主分支
生产分支
- 提交应该有一个与之关联的标记,其模式为
或vx.x
vx.x
only:
- master
- production
only:
- tags
only:
- /^v[0-9](?:\.[0-9]){2,3}/
但是不管你怎么安排,它总是把不同的语句看作是或。因此,我提出了以下声明,看看我是否能够正确地解决这个问题:
only:
- tags
- /^v[0-9](?:\.[0-9]){2,3}/
except:
- /^(?!master)/
- /^(?!production)/
那也没用。然后我想我应该能够使用最近添加到Gitlab CI中的规则:
rules:
- if: '($CI_MERGE_REQUEST_TARGET_BRANCH == "master" || $CI_MERGE_REQUEST_TARGET_BRANCH == "production") && $CI_COMMIT_TAG =~ /^v[0-9](?:\.[0-9]){2,3}/'
when: always
但是,结果表明语法不正确,不允许使用括号。然后我得出以下结论:
rules:
- if: '$CI_MERGE_REQUEST_TARGET_BRANCH == "master" && $CI_COMMIT_TAG =~ /^v[0-9](?:\.[0-9]){2,3}/'
when: always
- if: '$CI_MERGE_REQUEST_TARGET_BRANCH == "production" && $CI_COMMIT_TAG =~ /^v[0-9](?:\.[0-9]){2,3}/'
when: always
但上述说法也不起作用。如果有人能帮助我了解如何在Gitlab CI中满足要求的条件,我将不胜感激。我发现两个问题:
您的正则表达式与vx.x不匹配,我创建了一个适合此情况的新正则表达式
在if语句中,您试图将标记与master或production匹配,但我认为标记不适合分支。因此,您必须验证标签、主控或产品
我使用GitLab Enterprise Edition 12.3.0-pre版本在gilab.com项目上执行了一些测试。
说:
仅使用时,各个键在逻辑上由AND连接:
(任何参考)和(任何变量)和(任何变化)和(如果
kubernetes处于活动状态)
所以我创建了如下管道来测试它:
build0参考文献:
脚本:
-环境分类
仅:
参考文献:
-主人
-生产
build1变量:
脚本:
-环境分类
仅:
变量:
-$CI_COMMIT_TAG=~/^v[0-9](?:\[0-9]){1,2}$/
构建2参考和变量:
脚本:
-环境分类
仅:
参考文献:
-主人
-生产
变量:
-$CI_COMMIT_TAG=~/^v[0-9](?:\[0-9]){1,2}$/
我在不同的分支上尝试了不同的案例,有标记和没有标记,并检查了触发的构建
对于标记的提交,将触发2个管道。一个具有CI\u COMMIT\u REF\u NAME=master且缺少CI\u COMMIT\u标签,另一个具有CI\u BUILD\u REF\u NAME和CI\u COMMIT\u标签且标签值相同
build2引用和变量从未被触发。看起来ref name和commit标记的条件相互排除。您可能应该更改流程。谢谢您的帮助。那么,我怎样才能同时拥有分支条件(主控或生产)和标记呢?我想了想,然后改变了我的答案,你能帮我吗?我不认为有任何CI_COMMIT_REF_分支,因为如果你是指CI_COMMIT_REF_NAME,那么它的值将是branch或tag,因此,当我有一个提交标签时,它是$CI_commit_标签的副本。好的,我必须考虑并配合在周末做一些测试。但是您是否在master和production旁边的分支上设置了版本标记?因为master和production分支受保护,它们只接受提交作为MR的结果。因此,当我们需要发布时,应该在提交到任何将合并到master的分支上启动发布标记。因此,标签发布也可以分配给任何其他分支。它是真的吗?我认为refs和varibale的东西只是混合了两者,但如果其中只有一个是有效的,那么也是触发器。对于refs和变量,gitlab ci将使用逻辑and和:(任何refs)和(任何变量),因此两者都必须为真才能触发作业。那么你是说我不可能同时拥有master和tag吗?是的,您可以在一些测试项目上检查我的管道配置,并查看标记和非标记提交的环境变量。也许你可以找到一些满足你需要的模式,但从我的调查来看,你的案例不起作用。由于一个bug(或预期的行为不确定)$CI\u COMMIT\u BRANCH
与$CI\u COMMIT\u标记一起使用时总是空的。请参阅:因此,如果使用规则,则只能单独使用$CI\u COMMIT\u标记。