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

mon*_*ack 114 git jenkins

我在让Jenkins构建指定标签时遇到问题.标签是参数化构建的一部分,但我不知道如何将其传递给git插件以构建该标记.这已经花了我3个小时的时间,我已经在堆栈溢出时承认了失败的主人.

Emm*_*ler 204

我能够通过使用"branches to build"参数来做到这一点:

Branch Specifier (blank for default): tags/[tag-name]
Run Code Online (Sandbox Code Playgroud)

将[tag-name]替换为标记的名称.

  • 我不知道为什么这个没有更多+ 1s.这个erics-notes博客条目令人困惑.这很简单,效果很好.谢谢! (5认同)
  • 对我来说很棒.谢谢.我的参数名为RELEASE_TAG,因此我使用tags/$ {RELEASE_TAG}作为Branch Specifier的值. (3认同)
  • 无法让这个工作.由于某种原因无法签出标签.我得到:'错误:找不到任何修改版本.验证此作业的存储库和分支配置.我指定了tags/3.0.1,我也试过*/tags/3.0.1我验证了标签确实存在. (3认同)

got*_*nes 75

使用Jenkins CI v.1.555,Git Client插件v.1.6.4和Git插件2.0.4,这些答案都不适合我.

我想要为一个特定的,固定的(即非参数化)标签构建一个Git存储库.我不得不拼凑出各种答案的解决方案以及Thilo引用"构建Git标签"博客文章 .

  1. 确保将标签推送到远程存储库 git push --tags
  2. 在您的工作的"Git存储库"部分中,在"源代码管理"标题下,单击"高级".
  3. 在Refspec的字段中,添加以下文本: +refs/tags/*:refs/remotes/origin/tags/*
  4. 在"Branches to build","Branch specifier"下,put */tags/<TAG_TO_BUILD>(替换<TAG_TO_BUILD>为您的实际标记名称).

为我添加Refspec证明是至关重要的.虽然看起来git存储库在我将其留空时默认获取所有远程信息,但Git插件仍然完全无法找到我的标签.只有当我在Refspec字段中明确指定"获取远程标签"时,Git插件才能从我的标签中识别和构建.

更新2014-5-7:不幸的是,这个解决方案确实带来了Jenkins CI(v.1.555)和Git存储库推送通知机制(Stash Webhook到Jenkins)的不良副作用:任何时候存储库上的任何分支都会更新在推送中,标签构建作业也将再次触发.这导致一遍又一遍地重复相同标签作业的大量不必要的重建.我尝试使用和不使用"强制轮询使用工作区"选项配置作业,它似乎没有任何效果.我可以阻止Jenkins为标记作业进行不必要的构建的唯一方法是清除Refspec字段(即删除+refs/tags/*:refs/remotes/origin/tags/*).

如果有人找到更优雅的解决方案,请通过更新编辑此答案.我怀疑,例如,如果refspec具体+refs/tags/<TAG TO BUILD>:refs/remotes/origin/tags/<TAG TO BUILD>而不是星号全能,那么这可能不会发生.但是现在,这个解决方案对我们有用,我们只需在作业成功后删除额外的Refspec.

  • 要将"以下文本"添加到refspec ...如果你的refspec之前是`+ refs/heads/*:refs/remotes/origin/*`它现在将是`+ refs/heads/*:refs/remotes/origin/*+ refs/tags/*:refs/remotes/origin/tags/*`.(我没有多次使用refspecs,所以需要进行一些实验才能知道这个字段是以空格分隔的.) (3认同)

And*_*ell 15

难道你不能告诉Jenkins从Ref名称构建?如果是的话,那就是

refs/tags/tag-name
Run Code Online (Sandbox Code Playgroud)

从我看到的关于Jenkins和Hudson的所有问题,我建议切换到TeamCity.我没有必要编辑任何配置文件以使TeamCity工作.

  • TeamCity是专有的,几乎没用. (6认同)
  • 越来越近.我没有把标签推到远程,但现在我.我现在可以通过使用refs/tags/harpercollins-1.0.16来建立jenkins,但无论我放在那里,它始终坚持建立头部.我已经确认遥控器有标签(可以在gitweb中看到它),并且对该标签进行快照确认一切正常. (4认同)
  • 哦,是的,从免费工具切换到商业是正确的选择!当jetbrains重新发明轮子并创建新的bug跟踪器时,你会建议其他人从bugzilla切换到那个吗? (2认同)

Neb*_*ebu 9

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

更新23/7/2014 - 实际上,经过进一步的测试,结果证明这没有按预期工作.似乎HEAD版本仍在检查中.请将此撤消作为已接受的答案.我最终得到了一个有效的解决方案,在这个帖子(3月30日)中关注了来自gotgenes的帖子.在那篇关于不必要的构建触发的帖子中提到的问题对我来说不是问题,因为我的工作是从上游工作触发而不是从轮询SCM触发.

更新APR-2018 - 注释中注明这对一个人有用,并且同意Jenkins文档.


小智 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
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

Jenkins日志证实它正在从标签中获取源代码

0b4d6e810546663e931cccb45640583b596c24b9签出修订版(v0.9.5.2)


Vin*_*bbe 9

如果您正在使用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
  }
}
Run Code Online (Sandbox Code Playgroud)


m1l*_*1ld 8

在最新的Jenkins(1.639及以上)中,您可以:

  1. 只需在"要构建的分支"字段中指定标记的名称.
  2. 在参数化构建中,您可以在同一字段"Branches to build"中使用参数作为变量,即$ {Branch_to_build}.
  3. 你可以安装Git参数插件,它将通过列出所有可用的分支和标签为你提供功能.