Jenkins Git插件:如何构建特定标签?


120

我在让Jenkins构建指定标签方面遇到问题。该标签是参数化构建的一部分,但我不知道如何将其传递给git插件以仅构建该标签。我每天花了3个小时,在堆栈溢出时我输给了大师。


您的意思是这不同于stackoverflow.com/questions/7157170/…吗?(google.com/…的第三结果)
VonC 2012年

1
“这一天已经花了3个小时”-我不是很懒,一天的3个小时并未包含我在Google上可以找到的所有链接:)
sksamuel 2012年

1
您确定要这样吗?您是否意识到git中的标签无法缩放?也许您可以只使用“执行外壳”任务来编写脚本来签出您真正想要的标签/修订版?
mpontillo

Answers:


222

我可以通过使用“分支生成”参数来做到这一点:

Branch Specifier (blank for default): tags/[tag-name]

用标签名称替换[tag-name]。


5
我不知道为什么这里没有更多的+1。带有erics-notes的博客条目令人困惑。这很简单,效果很好。谢谢!
Cody S

3
对我来说很棒。谢谢。我的参数名为RELEASE_TAG,所以我使用了tag / $ {RELEASE_TAG}作为Branch Specifier的值。
韦斯利·沃马克2014年

3
无法使它正常工作。由于某种原因,无法签出标签。我得到:'错误:找不到要构建的任何修订。验证此作业的存储库和分支配置。我指定标签/3.0.1,我也尝试过* / tags / 3.0.1,我确认标签确实存在。
lostintranslation 2014年

1
当我尝试执行此答案中建议的操作时,每次对存储库的轮询都会触发构建。git polling日志将连续显示“ Last Built Revision”是标签的修订版,而“ Latest remote head版本是”最新的修订版HEAD。git插件的逻辑似乎可以比较这两个修订版,这在我的存储库中总是不相等的,因此总是触发新的构建。
2014年

这肯定是正确的答案,它对我有用,而且非常简单。不过,我不轮询该回购协议,因此我认为仍然存在该问题。
杰里米(Jeremy)2016年

76

使用Jenkins CI v.1.555,Git Client插件v.1.6.4和Git插件2.0.4,这些答案对我来说都不足够。

我想要一份为一个特定的,固定的(即非参数化的)标签为一个Git存储库构建的工作。我不得不从各种答案以及Thilo引用“ build a Git tag”博客文章中找到 一个解决方案。

  1. 确保使用以下命令将标签推送到远程存储库 git push --tags
  2. 在作业的“ Git存储库”部分中的“源代码管理”标题下,单击“高级”。
  3. 在“ Refspec”字段中,添加以下文本: +refs/tags/*:refs/remotes/origin/tags/*
  4. 在“要创建的分支”,“分支说明符”下,放置*/tags/<TAG_TO_BUILD>(替换<TAG_TO_BUILD>为您的实际标签名称)。

对我来说,添加Refspec至关重要。尽管当我将其保留为空白时,默认情况下git存储库似乎正在获取所有远程信息,但是Git插件仍然会完全找不到我的标签。只有当我在refspec字段中明确指定“获取远程标签”时,Git插件才能识别并根据我的标签进行构建。

更新2014年5月7日:不幸的是,这种解决方案也确实会带来詹金斯CI(v.1.555)和Git仓库推送通知机制点菜的不良副作用藏匿网络挂接詹金斯:任何时间任何对信息库分支更新一推,标签构建作业也会再次触发。这导致一遍又一遍地不必要地重建相同的标签作业。我尝试使用“不使用工作空间强制轮询”选项来配置作业,但似乎没有效果。我可以防止Jenkins对标记作业进行不必要的构建的唯一方法是清除Refspec字段(即,删除+refs/tags/*:refs/remotes/origin/tags/*)。

如果有人找到更优雅的解决方案,请编辑此答案并进行更新。我怀疑,例如,如果refspec特别是+refs/tags/<TAG TO BUILD>:refs/remotes/origin/tags/<TAG TO BUILD>而不是星号,则可能不会发生。但是,目前,此解决方案对我们有用,我们仅在工作成功后删除多余的Refspec。


4
要将“添加以下文本”添加到refspec ...如果您的refspec以前是+refs/heads/*:refs/remotes/origin/*,现在是+refs/heads/*:refs/remotes/origin/* +refs/tags/*:refs/remotes/origin/tags/*。(我没有使用refspec进行太多工作,因此花了一些实验才能知道该字段是由空格分隔的。)
漂流者

1
此解决方案的额外+1。先前的解决方案也不适合我。
whitespy9

16

您不能告诉詹金斯使用Ref名称进行构建吗?如果是这样的话

refs/tags/tag-name

从我看到的有关詹金斯和哈德森的所有问题中,我建议改用TeamCity。我无需编辑任何配置文件即可使TeamCity正常工作。


您并不是第一个建议团队城市的人。真的好多了吗?我可能会检查一下。
sksamuel

1
@monkjack我在我的一个repo上尝试了相同的语法,并且有效。您可以列出当前标签吗?您确定使用git push --tags
Andrew T Finnell

4
越来越近。我没有将标签推送到远程,但现在是。我现在可以使用refs / tags / harpercollins-1.0.16来让jenkins进行构建,但是无论我在其中放什么东西,它总是坚持构建头。我已经确认遥控器具有标签(可以在gitweb中看到它),并且对该标签进行快照可以确认其中的所有内容正确无误。
sksamuel

6
TeamCity是专有的,几乎没有用。
s语2015年

2
哦,是的,从免费工具转换为商业工具是正确的选择!当jetbrains重新发明轮子并创建新的bug跟踪器时,您会建议其他人从bugzilla切换到那个吗?
m1ld

11

如果您使用的是Jenkins管道并想签出特定标签(例如TAG,构建的参数),则可以执行以下操作:

stage('Checkout') {
  steps {
    checkout scm: [$class: 'GitSCM', userRemoteConfigs: [[url: 'YOUR_GIT_REPO_URL.git', credentialsId: 'YOUR_GIT_CREDENTIALS_ID' ]], branches: [[name: 'refs/tags/${TAG}']]], poll: false
  }
}

9

在最新的Jenkins(1.639及更高版本)中,您可以:

  1. 只需在“要创建的分支”字段中指定标签名称。
  2. 在参数化的构建中,您可以将参数用作变量“构建的分支”,即$ {Branch_to_build}。
  3. 您可以安装Git Parameter Plugin,它将通过列出所有可用的分支和标签为您提供功能。

1
实际上,只需输入标签名称对我也有效。尽管git插件中有关此文档的文档仍然明确指出这样做不起作用:“ <tagName>:这不起作用,因为该标签将不会被识别为标签。请改为使用refs / tags / <tagName>。”
Zitrax '16

这在Jenkins 1.532.3中为我工作,我只是1.0.1在要构建字段的分支中指定了标记版本(例如)。
安德烈(Andre)

9

我做了这样的事情,它的工作:

Source Code Management

 Git    
    Repositories    


 Advance

Name: ref
Refspec : +refs/tags/*:refs/remotes/origin/tags/* 

 Branches to build  
 Branch Specifier (blank for 'any') : v0.9.5.2

在此处输入图片说明

Jenkins日志确认它正在从标记获取源

检出修订0b4d6e810546663e931cccb45640583b596c24b9(v0.9.5.2)


这非常适合构建所有标签,谢谢!refspec通过单击“高级”按钮来添加技巧。
styfle

9

我将Advanced-> Refspec字段设置为refs/tags/[your tag name]。这似乎比Refspec的其他各种建议要简单,但对我来说效果很好。

更新23/7/2014-实际上,在进一步测试之后,事实证明这没有按预期进行。似乎HEAD版本仍在被检出。请撤消此操作,将其作为接受的答案。通过跟踪该线程中getgenes的帖子,我最终获得了一个可行的解决方案(3月30日)。对于我来说,不必要触发构建的那篇文章中提到的问题对我来说不是问题,因为我的工作是从上游工作而不是从轮询SCM触发的。

2018年4月更新 -在注释中指出这确实适用于一个人,并同意Jenkins文档。


只是想指出,在发布此答案四年后refs/tags/<tagname>,Jenkins文档应该使用“使用”,它对我来说很好。也许该插件在原始帖子发布时是有问题的,但是...截至2018年4月,这正确的答案。
evadeflow

更新我之前的评论:实际上,我发现我可以省略refs/tags前缀,而只需使用即可<tagname>。YMMV,但是...出于我的目的,它工作正常。
evadeflow

3

通过设置Refspec和Branch Specifier(如本博文中所述),我能够让Jenkins构建标签。

我还必须设置存储库名称(在本例中为“ origin”),以便可以在refspec中进行引用(否则,它将显然使用随机生成的名称)。


2

我最后所做的是:

  • 创建了一个新分支jenkins-target,并让詹金斯进行了跟踪
  • 从我要构建的任何分支或标签合并到 jenkins-target
  • 一旦构建工作,测试通过等,只需在jenkins-target分支中创建标签

我不确定这是否对每个人都适用,我的项目很小,没有太多的标签和内容,但是这很容易做到,不必弄乱refspec和参数以及内容:-)


我喜欢这种非常简单的方法。
zochhuana

2

您甚至可以1.2.3-alpha43使用通配符构建标记类型,例如:

参考规格: +refs/tags/*:refs/remotes/origin/tags/*

分支说明符: origin/tags/1.2.3-alpha*

您还可以勾选“ 将更改推送到GitHub时生成 ”以触发推送,但是您必须在webhook中添加“创建”操作


1

因为在Jenkins中没有看到使用选项“使用参数构建”的答案,所以在这里加两分钱。

在这里,我在项目starwars_api中使用Jenkins CI浏览器控制台,并且能够直接使用带有参数refs / tags / tag-name的 “使用参数构建”进行构建

  1. 选择“使用参数构建”选项。
  2. 在框中将值添加为“ refs / tags / tag_142”(在我的示例中,tag_name = tag_142)

用ref标签名构建

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.