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

时间:2012-04-17 17:17:37

标签: git jenkins

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

11 个答案:

答案 0 :(得分:190)

我能够通过使用"分支来构建"参数:

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

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

答案 1 :(得分:73)

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

我想为一个特定的,固定的(即非参数化)标签构建一个Git存储库。我不得不拼凑出各种答案的解决方案以及"build a Git tag" blog post cited by Thilo

  1. 确保使用git push --tags
  2. 将标记推送到远程存储库
  3. 在您的工作的“Git存储库”部分中,在“源代码管理”标题下,单击“高级”。
  4. 在Refspec字段中,添加以下文字:+refs/tags/*:refs/remotes/origin/tags/*
  5. 在“要构建的分支”,“分支说明符”下,添加*/tags/<TAG_TO_BUILD>(将<TAG_TO_BUILD>替换为您的实际标记名称)。
  6. 为我添加Refspec证明是至关重要的。虽然看起来git存储库在我将其留空时默认获取所有远程信息,但Git插件仍然完全无法找到我的标签。只有当我在Refspec字段中明确指定“获取远程标签”时,Git插件才能从我的标签中识别和构建。

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

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

答案 2 :(得分:15)

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

refs/tags/tag-name

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

答案 3 :(得分:8)

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

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

更新APR-2018 - 请注意,这对一个人有用,并且同意Jenkins的文档。

答案 4 :(得分:8)

我做了类似的事情并且有效:

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

enter image description here

詹金斯日志证实它是从标签获取来源

查看修订版0b4d6e810546663e931cccb45640583b596c24b9(v0.9.5.2)

答案 5 :(得分:8)

如果您正在使用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
  }
}

答案 6 :(得分:7)

在最新的詹金斯(1.639及以上)中你可以:

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

答案 7 :(得分:3)

我可以通过将Refspec和Branch Specifier设置为detailed in this blog post来让Jenkins构建标记。

我还必须设置存储库名称(在我的情况下为“origin”),以便我可以在Refspec中引用它(否则它显然会使用随机生成的名称)。

答案 8 :(得分:2)

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

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

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

您还可以在将更改推送到GitHub &#34;时勾选&#34; 构建触发推送,但您必须将&#34;创建&#34; 操作添加到webhook

答案 9 :(得分:1)

我最终做的是:

  • 创建了一个新分支jenkins-target,并让jenkins跟踪
  • 从我想要构建的分支或标记合并到jenkins-target
  • 一旦构建工作,测试传递等,只需从jenkins-target分支创建一个标记

我不确定这是否适用于所有人,我的项目非常小,没有太多的标签和东西,但它很容易做到,不必乱用refspecs和参数和东西: - )

答案 10 :(得分:0)

在这里加两分钱,因为我在詹金斯没有看到使用选项“ Build with parameters”的答案。

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

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

build with ref tag name