[英]Jenkins Git Plugin: How to build specific tag?
我在获取 Jenkins 以构建指定标签时遇到问题。 该标签是参数化构建的一部分,但我不知道如何将其传递给 git 插件以仅构建该标签。 这已经占用了我一天的 3 个小时,我已经在 Stack Overflow 上向大师们认输了。
我能够通过使用“branches to build”参数来做到这一点:
Branch Specifier (blank for default): tags/[tag-name]
将[tag-name]替换为标记的名称。
使用Jenkins CI v.1.555,Git Client插件v.1.6.4和Git插件2.0.4,这些答案都不适合我。
我想要为一个特定的,固定的(即非参数化)标签构建一个Git存储库。 我不得不拼凑出各种答案的解决方案以及Thilo引用的“构建Git标签”博客文章 。
git push --tags
将标记git push --tags
远程存储库 +refs/tags/*:refs/remotes/origin/tags/*
*/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。
难道你不能告诉Jenkins从Ref名称构建? 如果是的话,那就是
refs/tags/tag-name
从我看到的关于Jenkins和Hudson的所有问题,我建议切换到TeamCity。 我没有必要编辑任何配置文件以使TeamCity工作。
我做了类似这样的事情并且有效:
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)
如果您正在使用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
}
}
我将Advanced-> Refspec字段设置为refs/tags/[your tag name]
。 这似乎比Refspec的其他各种建议更简单,但它对我来说效果很好。
更新23/7/2014 - 实际上,经过进一步的测试,结果证明这没有按预期工作。 似乎HEAD版本仍在检查中。 请将此撤消作为已接受的答案。 我最终得到了一个有效的解决方案,在这个帖子 (3月30日)中关注了来自gotgenes的帖子。 在那篇关于不必要的构建触发的帖子中提到的问题对我来说不是问题,因为我的工作是从上游工作触发而不是从轮询SCM触发。
更新APR-2018 - 注释中注明这对一个人有用,并且同意Jenkins文档。
在最新的Jenkins(1.639及以上)中,您可以:
通过设置Refspec和Branch Specifier,我能够让Jenkins构建一个标签, 详见本博文 。
我还必须设置存储库名称(在我的情况下为“origin”),以便我可以在Refspec中引用它(否则它显然会使用随机生成的名称)。
我最后做的是:
jenkins-target
,并让jenkins跟踪它 jenkins-target
上的任何分支或标记合并 jenkins-target
分支创建一个标签 我不确定这是否适用于所有人,我的项目非常小,没有太多的标签和东西,但它很容易做,不必乱搞refspecs和参数和东西:-)
您甚至可以使用通配符构建标记类型,例如1.2.3-alpha43
:
Refspec: +refs/tags/*:refs/remotes/origin/tags/*
分支说明符: origin/tags/1.2.3-alpha*
您还可以勾选“ 将更改推送到GitHub时构建 ”以触发推送,但您必须向webhook添加“创建”操作
因为我没有看到在Jenkins中使用“使用参数构建”选项的答案,所以在这里加上我的两分钱。
在这里,我使用Jenkins CI浏览器控制台进行项目starwars_api,我能够使用值refs / tags / tag-name直接构建“使用参数构建”
我找到了这个问题的最佳解决方案,您应该使用 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>'
],
],
])
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.