131

我在让 Jenkins 构建指定标签时遇到问题。该标签是参数化构建的一部分,但我不知道如何将其传递给 git 插件来构建该标签。这已经花了我一天 3 个小时的时间,我已经在 Stack Overflow 向大师们承认了失败。

4

12 回答 12

251

我可以通过使用“要构建的分支”参数来做到这一点:

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

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

于 2013-10-28T10:58:03.777 回答
77

使用 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. 在“要构建的分支”、“分支说明符”下,放置*/tags/<TAG_TO_BUILD>(替换<TAG_TO_BUILD>为您的实际标签名称)。

事实证明,为我添加 Refspec 至关重要。尽管当我将其留空时,似乎 git 存储库默认获取所有远程信息,但 Git 插件仍然无法找到我的标签。只有当我在 Refspec 字段中明确指定“获取远程标签”时,Git 插件才能识别并从我的标签构建。

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

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

于 2014-03-30T17:18:44.270 回答
16

你不能告诉 Jenkins 从 Ref 名称构建吗?如果是这样,那就是

refs/tags/tag-name

从我看到的关于 Jenkins 和 Hudson 的所有问题来看,我建议切换到 TeamCity。我无需编辑任何配置文件即可让 TeamCity 正常工作。

于 2012-04-17T17:34:07.627 回答
12

如果您正在使用 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
  }
}
于 2017-08-31T08:56:09.783 回答
10

我做了这样的事情并且它起作用了:

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)

于 2015-10-09T09:55:16.343 回答
9

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

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

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

于 2014-07-16T22:42:07.087 回答
9

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

  1. 只需在“要构建的分支”字段中指定标签名称。
  2. 在参数化构建中,您可以在同一字段“要构建的分支”(即 ${Branch_to_build})中使用参数作为变量。
  3. 你可以安装Git 参数插件,它会通过列出所有可用的分支和标签来为你提供功能。
于 2015-12-02T08:27:01.610 回答
3

我可以通过设置 Refspec 和 Branch Specifier 来让 Jenkins 构建标签,如本文所述。

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

于 2013-07-24T05:46:57.613 回答
2

我最后做的是:

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

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

于 2015-04-18T09:28:12.197 回答
2

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

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

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

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

于 2016-07-25T16:08:56.460 回答
1

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

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

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

使用 ref 标签名称构建

于 2019-07-02T19:45:36.693 回答
0

我找到了解决这个问题的最佳方法,你应该使用 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>'
                                ],
                        ],
                ])
            }
        }
于 2021-11-09T10:14:49.367 回答