Gitlab CI条件语句不能按预期工作:AND和OR条件都不能工作

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}/ 但是不管你怎么安排,它总是把不同的语句看作是或。因此,我提出了以下声明,看看我是否能够正确地解决

对于Gitlab CI(Gitlab cloud)中的作业,我希望具备以下条件

  • 目标分支应为
    主分支
    生产分支
  • 提交应该有一个与之关联的标记,其模式为
    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 NAMECI\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标记。