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)