GitLab CI - 避免在添加标签时构建

24
如何避免在添加git标签时触发GitLab CI流水线?我是在本地运行此命令(而不是在GitLab CI作业中)。

如何防止 gitlab ci pipeline 在添加 git 标签时被触发? 我正在本地运行此命令(而不是在 gitlab-ci 作业中)

git tag -a "xyz"

然后推送标签;这会触发各种流水线。我想排除一些这些流水线的运行。

我正在尝试根据此问题中提出的想法进行变化;那个问题使用了only,而我想要排除,所以我尝试使用except。那里的答案有两种变体,一种带有refs,一种没有。

build:  
  # ... my work here ...  
  except:
    - tags


build:  
  # ... my work here ...  
  except:
    refs:
      - tags

似乎都没有任何效果;我添加了一个标记,构建仍然会发生。

这里可能存在我的理解完全错误,因为单词“tags”有三种可能的含义,当阅读文档或示例时,我并不总是确定哪个含义适用:

  1. 使用git tag应用的Git标记
  2. 用于确定哪些运行程序选择作业的Gitlab CI标记
  3. 用于通过REST API触发管道的ref标识符。这通常是一个分支名称,但也可以是Git标记。

我对控制第一种情况的发生感兴趣。到目前为止,从评论中似乎清楚,“except:-tags”与我的情况无关,那么有没有可行的方法呢?


根据 https://docs.gitlab.com/ee/ci/yaml/#onlyexcept-basic ,这是指 Git 标签。您还可以在该页面上查看有关 refs 策略的信息。请注意,标记提交将有两个构建;一个用于提交,一个用于标记。 - jonrsharpe
感谢 @jonrsharpe。我同意文档所说的“标签”的含义。有没有办法防止由git标签引起的这些构建? - djna
你是在本地使用 git tag -a TAG 然后执行 git push origin TAG 吗?还是 git tag 命令是你的 .gitlab-ci.yml 作业的一部分? - Nicolas Pepinster
@Nicolas Pepinster - 本地运行和推送,添加了这个澄清。 - djna
5个回答

37

根据文档,GitLab建议使用rules代替except

onlyexcept不再被积极开发。 rules 是控制何时将作业添加到流水线的首选关键字。

因此,应为:

your_job:
  stage: your_stage
  script:
    - echo "Hello"
  rules:
    - if: $CI_COMMIT_TAG
      when: never 
    - when: always

1
@diegosaw,谢谢。我们仍在使用v12,文档中提到:“注意:规则语法现在是设置作业策略的首选方法。only和except可能会被弃用,并在未来被删除。”我很高兴你提醒了我。 - djna
请注意,如果您推送到已存在合并请求的分支,则可能会导致管道被执行两次。有关详细信息,请参见此处:https://docs.gitlab.com/ee/ci/jobs/job_control.html#avoid-duplicate-pipelines - Wolfram Rösler
顺便说一句,最后一条规则可以改成关于成功,而不是总是如此。 - undefined

33

Except tags 是你想要跳过标签构建时应该使用的选项。

你需要确保理解 commit vs branches vs tags

为了说明在将已打标签的提交推送到gitlab时会发生什么,我按照以下步骤进行:

  1. 创建带有以下内容的 .gitlab-ci.yml 文件:
tests_always_run:
    script:
      - echo I should always execute
tests_except_tags:
    script:
      - echo I skip tagged triggers
    except:
      - tags
  • 提交更改,打上标签,并使用--follow-tags推送以确保标签也被传播到服务器:
  • git add .gitlab-ci.yml
    git commit -m 'my great yml with except tags'
    git tag -a "abc" -m "Test tag"
    git push --follow-tags
    

    图示结果:标记的提交管道结果

    如果您要跳过所选提交的CI,则可以使用git push -o ci.skip,灵感来自此文章


    6
    为了调试触发流程的条件:
    在运行CI作业时,GitLab文档提到了几个已设置的变量:
    • CI_COMMIT_REF_NAME:构建项目的分支或标签名称
    • CI_COMMIT_BRANCH:提交分支名称。仅在构建分支时存在。
    • CI_COMMIT_TAG:提交标签名称。仅在构建标签时存在。
    让您的构建作业输出其中一些变量(例如:echo "triggered by ref : " $CI_COMMIT_REF_NAME),以查看是什么触发了您的作业。

    1
    我曾经遇到同样的情况,我的解决方案是这样的:
    之前: BEFORE 之后: AFTER 两个阶段都在我的.gitlab-ci.yml文件中配置,并且使用不同的名称。其中,“Dev-UnitTests”只有在有人提交到存储库时才会执行,在“标签”和“test”分支上没有影响。
    Dev-UnitTests:
      stage: pruebas 
      script:
        - mvn $MAVEN_CLI_OPTS test
      artifacts:
        when: always
        reports:
          junit: 
            - target/surefire-reports/*Test.xml
            - target/failsafe-reports/*Test.xml
          cobertura: target/site/jacoco/jacoco.xml
      tags:
        - shell 
      except: 
        - test 
        - tags   
    

    单元测试仅在合并到test分支时运行。

    Unit Tests:
      stage: pruebas 
      script:
        - mvn $MAVEN_CLI_OPTS test
      artifacts:
        when: always
        reports:
          junit: 
            - target/surefire-reports/*Test.xml
            - target/failsafe-reports/*Test.xml
          cobertura: target/site/jacoco/jacoco.xml
      tags:
        - shell 
      only: 
        - test
    

    当创建标签时,它不会再运行任何管道,希望这能帮到您。

    关键是:

    ...
     except:  
        - tags   
    ...
    

    1
    为了避免整个流程,使用“-o ci.skip”。
    git tag -a "v1.0.0" -m "Release version 1.0.0"
    git push origin "v1.0.0" -o ci.skip
    

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接