Jenkins在同一次提交中推送新标签时不会触发构建。

4

如果有新的标签被推送到远程仓库,我希望能够触发Jenkins构建。我看过很多相关文章,但是没有一篇对我有效。

当我推送一个包含新提交的标签时,我的构建可以成功地触发,但是如果我在旧提交上推送一个新标签,则不会触发构建。

我已经在Jenkins中使用git插件进行了配置,并添加了Refscpec值为+refs/tags/*:refs/remotes/origin/tags/*以及分支限定符为*/tags/*

现在如果运行:

git push origin master
git tag release-v1
git push origin release-v1

构建已成功触发用于发布版本的标签release-v1 但现在,如果我执行以下操作:
git push origin release-v2

构建未触发。

这意味着Jenkins一直在寻找提交ID,如果有一个新的提交ID与标签相关联,它将构建作业。 但我希望Jenkins作业在我想要发布已经提交的代码以用于另一个特性时运行,而不是等待新的标签名称。


新标签是否在同一次提交中? - evolutionxbox
@evolutionxbox 是的,它在同一个提交上。 - jass
1
在一个类似的问题中,我展示了如何在存在标签时运行构建,但代码可以轻松地进行调整,只有当存在特定模式的标签时才运行。尽管如此,没有必要在相同的提交上重新运行构建,除非构建脚本已更改。 - evolutionxbox
1
@evolutionxbox 实际上我有一个理由在同一次提交上运行构建。我想将我的代码合并到主分支,标记为“beta-release-x”,并部署beta流水线。一旦beta测试完成,我想将相同的代码标记为“production-release-x”,并从同一Jenkins作业部署生产流水线。 - jass
1个回答

1

我曾经遇到同样的问题,并为此创建了一个解决方法。我决定使用后缀 _uat、_prod 等进行标记,这帮助我实现了目标。您还需要两个 Jenkins 作业来完成此操作。其中一个将在条件匹配时触发另一个。

步骤1
git tag -a release-v1_uat -m "提交信息"
git push origin release-v1_uat

创建两个 Jenkins 作业

作业1
定义存储库
在“高级”部分的“Refspec”字段中输入:
+refs/tags/_uat:refs/remotes/origin/tags/_uat

在“要构建的分支”部分中:
**/tags/*_uat

构建触发器
CHECK-> GitHub 钩子触发 GITScm 轮询

构建步骤
ExecuteShell
TAG=$(git describe --tags --abbrev=0)
echo $TAG
echo $TAG > /tmp/tagname
result=echo $TAG | sed 's/.*\(....\)/\1/'
if [[ $result == _uat ]]; then echo yes; else (exit 1); fi

点击“执行shell”下方的“高级”
将退出代码设置为不稳定的构建(这将防止作业从任何其他标签触发)
在框中输入1

后置构建操作
勾选:构建后删除工作空间

作业2(您的主要作业)
进入“在构建其他项目之后构建”
在框中提及作业1名称并选择“仅在构建稳定时触发”

不要忘记通过在作业1中生成的cat /tmp/tagname命令从文件中获取标签值

总有改进的空间,请分享您是否有更好的解决方法/解决方案。


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