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

Posted

技术标签:

【中文标题】GitLab CI - 添加标签时避免构建【英文标题】:GitLab CI - avoid build when adding tag 【发布时间】:2020-06-06 15:23:57 【问题描述】:

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

git tag -a "xyz"

然后推送标签;这会触发各种管道。我想排除其中一些管道运行。

我正在尝试对来自this 等问题的想法进行变体;该问题仅使用,我想排除,所以我正在尝试除外。那里的答案有两种变体,一种带有 refs 一种没有。

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


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

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

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

    使用 git tag 应用的 Git 标记 用于确定哪些跑步者选择工作的 Gitlab CI 标签 提交的 ref 标识符用于通过 REST API 触发管道。这通常是一个分支名称,但也可以是一个 git 标签。

我有兴趣控制在第一种情况下会发生什么。到目前为止,从 cmets 看来,“除了:-tags”与我的情况无关,那么有没有可行的方法?

【问题讨论】:

Per docs.gitlab.com/ee/ci/yaml/#onlyexcept-basic 这指的是 git 标签。您还可以在该页面上查看有关 refs 策略的信息。请注意,标记提交将有两个构建;一个用于提交,一个用于标记。 谢谢@jonrsharpe。我同意这就是文档所说的“标签”的含义。有什么方法可以防止 git 标签导致这些构建? 您是在本地使用git tag -a TAG,然后是git push origin TAG?或者git tag 命令是您的.gitlab-ci.yml 工作的一部分? @Nicolas Pepinster - 在本地运行并推送,补充说明 【参考方案1】:

(注意:这是一个格式化的评论而不是一个答案)

为了调试触发管道的条件:

gitlab's doc 提到了运行 CI 作业时设置的几个变量,其中:

CI_COMMIT_REF_NAME : 为其构建项目的分支或标签名称 CI_COMMIT_BRANCH :提交分支名称。仅在构建分支时出现。 CI_COMMIT_TAG :提交标签名称。仅在构建标签时出现。

让您的构建作业输出其中一些变量(例如:echo "triggered by ref : " $CI_COMMIT_REF_NAME)以查看触发您的作业的原因。

【讨论】:

【参考方案2】:

Except tags 正是您想要跳过构建标签时应该使用的。

你一定要了解commit vs branches vs tags

为了说明将标记提交推送到 gitlab 时会发生什么,我做了如下操作:

    创建了.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,灵感来自 this article

【讨论】:

【参考方案3】:

看起来 GitLab 建议使用 rules 而不是 except 根据 the documentation

only 和 except 没有被积极开发。规则是 控制何时向管道添加作业的首选关键字。

原来如此

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

【讨论】:

@diegosaw,谢谢。我们仍在 v12 上,文档说:“注意:规则语法现在是设置作业策略的首选方法。只有和除外是弃用的候选者,将来可能会被删除。”很高兴你引起了我的注意。【参考方案4】:

我也遇到了同样的情况,我的解决办法是这样的:

之前::

之后:

两个阶段都在我的 .gitlab-ci.yml 文件中配置,名称不同 “Dev-UnitTests”,它只在有人提交到存储库时执行,对分支“test”的tags没有影响 p>

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   
...

【讨论】:

以上是关于GitLab CI - 添加标签时避免构建的主要内容,如果未能解决你的问题,请参考以下文章

在 GitLab 中创建标签时查找源分支(使用 gitlab-ci.yml)

避免代码merge后无法构建发布问题解决方案(GItlabCI + Jenkins)

了解 Gitlab CI 标签

gitlab - 作曲家包的 ci

Gitlab-CI 中存在已删除的标签

如何使用标签 API 在 Gitlab CI 中创建标签?