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

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

204559 次浏览

你不能告诉詹金斯从一个裁判的名字建立? 如果是这样,那么它是

refs/tags/tag-name

从我看到的所有关于 Jenkins 和 Hudson 的问题中,我建议转到 TeamCity。我不需要编辑任何配置文件就可以让 TeamCity 工作。

通过将 Refspec 和 Branch Specifier 设置为 在这篇博客文章中有详细描述,我可以让 Jenkins 构建一个标记。

我还必须设置 Repository Name (在我的示例中为“ source”) ,以便在 Refspec 中引用它(否则它显然会使用随机生成的名称)。

我可以通过使用“ Branch to build”参数来实现这一点:

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

用标签的名字替换[标签名]。

对我来说,使用 Jenkins CI v. 1.555、 Git Client plugin v. 1.6.4和 Git plugin 2.0。

我需要为一个特定的固定(即非参数化)标记构建一个 Git 存储库。我不得不用各种答案加上 “构建一个 Git 标签”的博客文章 提洛引用拼凑出一个解决方案。

  1. 确保使用 git push --tags将标记推送到远程存储库
  2. 在作业的“ Git Repository”部分的“ Source Code Management”标题下,单击“ Advanced”。
  3. 在 Refspec 的字段中,添加以下文本: +refs/tags/*:refs/remotes/origin/tags/*
  4. 在“ Branch to build”,“ Branch specfier”下面,放置 */tags/<TAG_TO_BUILD>(用您的实际标记名替换 <TAG_TO_BUILD>)。

添加 Refspec 对我来说是至关重要的。虽然当我将 Git 存储库保留为空白时,Git 存储库似乎在默认情况下获取所有远程信息,但是 Git 插件仍然会完全找不到我的标记。只有当我在 Refspec 字段中明确指定“ get the remote tag”时,Git 插件才能够识别和构建我的标记。

更新2014-5-7 : 不幸的是,这个解决方案确实给 Jenkins 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。

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

UPDATE 23/7/2014 -实际上,经过进一步的测试,结果表明这并没有像预期的那样工作。似乎 HEAD 版本仍在被检出。请将此作为已接受的答案撤消。我最终得到了一个工作的解决方案,遵循从 遗传基因在这个 线(3月30日)的职位。那篇文章中提到的不必要触发构建的问题对我来说不是问题,因为我的工作是从上游作业触发的,而不是从轮询 SCM 触发的。

更新 APR-2018 -在评论中注意,这确实适用于一个人,并且与 Jenkins 文档一致。

我最后做的是:

  • 建立了一个新的 jenkins-target分公司,让 Jenkins 去追踪
  • 从我想要构建到 jenkins-target上的任何分支或标记合并
  • 一旦构建工作,测试通过等,只需从 jenkins-target分支创建一个标记

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

我做过类似的事情,而且奏效了:

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修订版(0.9.5.2)

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

  1. 只需在“构建分支”字段中指定标记的名称。
  2. 在参数化构建中,您可以在相同的字段‘ Branch to build’中使用参数作为变量,即 ${ Branch _ to _ build }。
  3. 您可以安装 Git 参数插件,它将通过列出所有可用的分支和标记为您提供功能。

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

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

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

你也可以勾选“ 当更改被推送到 GitHub 时进行构建”来触发推动,但是你必须添加 “创造”动作到 webhook

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

我在这里补充一下,因为我还没有看到一个答案,使用选项“构建与参数”在詹金斯。

在这里,我使用 Jenkins CI 浏览器控制台的项目 starwar _ api,我能够直接构建“与参数构建”与价值 参考文献/标签/标签名

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

使用 ref 标记名构建

我找到了解决这个问题的最佳方案, 您应该使用 GitSCM 类而不是 git 类:

stages {
stage('SCM') {
steps {
script {
wrap([$class: 'BuildUser']) {
currentBuild.displayName = "#${BUILD_NUMBER} - ${env.BUILD_USER} --> Build from branch ${BRANCH}"
slackSend channel: "#jenkins-build", color: "#02fe21", message: "${JOB_NAME} started by ${env.BUILD_USER} : #${BUILD_NUMBER} --> Build from ${BRANCH} branch with ${TAG} TAG"
}
}
checkout(
changelog: false, poll: false, scm: [
$class           : 'GitSCM',
branches         : [
[name: "$BRANCH"],
],
userRemoteConfigs: [
[
url: "<YOUR-GIT-URL>/${REPOSITORY}.git", credentialsId: '<YOUR-CREDENTIAL>'
],
],
])
}
}

对于 git-tag“ v1.5.4” 我使用了 follow regex

: (. [ d ]{1,15}.)

Jenkis config