【问题标题】:Jenkins Git Plugin: How to build specific tag?Jenkins Git 插件:如何构建特定标签?
【发布时间】:2012-04-29 01:38:18
【问题描述】:

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

【问题讨论】:

  • 您的意思是这与stackoverflow.com/questions/7157170/… 不同? (google.com/… 的第三个结果)
  • “这花了我一天的 3 个小时” - 我不是那么懒惰,以至于我一天中的 3 个小时没有包括我在 google 上可以找到的每个链接 :)
  • @mpontillo - 该链接现在正在被占用。
  • 感谢@Tydaeus - 我无法编辑它,所以我删除了带有参考的原始评论,其中指出在 git 中的标记无法扩展,建议使用其他选项,例如“执行外壳”任务来编写脚本来检查所需的标签/修订。

标签: git jenkins


【解决方案1】:

我找到了解决这个问题的最佳方法, 您应该使用 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>'
                                ],
                        ],
                ])
            }
        }

【讨论】:

    【解决方案2】:

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

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

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

    build with ref tag name

    【讨论】:

      【解决方案3】:

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

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

      UPDATE APR-2018 - 请注意在 cmets 中这对一个人有效,并同意 Jenkins 文档。

      【讨论】:

      • 只是想指出,在这个答案发布四年后,使用 refs/tags/&lt;tagname&gt; 是 Jenkins 文档 应该使用的,它对我来说工作正常。也许该插件在最初发布时有问题,但是......截至 2018 年 4 月,这正确答案。
      • 更新我之前的评论:实际上,我发现我可以省略refs/tags 前缀而只使用&lt;tagname&gt;。 YMMV,但是...对于我的目的来说它工作得很好。
      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        我做了这样的事情并且成功了:

        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)

        【讨论】:

        • 这非常适合构建所有标签,谢谢!添加refspec 是点击高级按钮的诀窍。
        【解决方案6】:

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

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

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

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

        【讨论】:

          【解决方案7】:

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

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

          【讨论】:

          • 确实,只需输入标签名称也对我有用。尽管 git 插件中的文档仍然明确说明这样做不应该起作用: ": 这不起作用,因为标签不会被识别为标签。使用 refs/tags/ 代替。”
          • 这在 Jenkins 1.532.3 中对我有用,我只是在分支中指定了标签版本(例如 1.0.1)来构建字段。
          【解决方案8】:

          我最后做的是:

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

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

          【讨论】:

          • 我喜欢这种非常简单的方法。
          【解决方案9】:

          使用 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. 在您工作的“Git 存储库”部分的“源代码管理”标题下,单击“高级”。
          3. 在 Refspec 字段中,添加以下文本:+refs/tags/*:refs/remotes/origin/tags/*
          4. 在“要构建的分支”、“分支说明符”下,输入 */tags/&lt;TAG_TO_BUILD&gt;(将 &lt;TAG_TO_BUILD&gt; 替换为您的实际标签名称)。

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

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

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

          【讨论】:

          • 要“添加以下文本”到 refspec ... 如果您的 refspec 以前是 +refs/heads/*:refs/remotes/origin/*,现在将是 +refs/heads/*:refs/remotes/origin/* +refs/tags/*:refs/remotes/origin/tags/*。 (我没有经常使用 refspecs,所以需要进行一些实验才能了解到这个字段是用空格分隔的。)
          • 此解决方案的额外 +1。之前的解决方案对我也不起作用。
          【解决方案10】:

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

          refs/tags/tag-name
          

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

          【讨论】:

          • 其实你不是第一个推荐团队城市的人。真的那么好了吗?我可能会检查一下。
          • @monkjack 我在我的一个 repo 上尝试了相同的语法并且它有效。你能列出你当前的标签吗?你确定你已经用git push --tags专门将该标签推送到远程仓库吗?
          • 越来越近了。我没有将标签推到远程,但现在我是。我现在可以通过使用 refs/tags/harpercollins-1.0.16 让 jenkins 构建,但是无论我在那里放什么,它总是坚持构建 head。我已经确认遥控器有标签(可以在 gitweb 中看到它)并且对该标签进行快照确认所有内容都正确。
          • TeamCity 是专有的,几乎没用。
          • 哦,是的,从免费工具切换到商业工具是正确的选择!当 jetbrains 重新发明轮子并创建新的 bug 跟踪器时,你会建议其他人从 bugzilla 切换到那个吗?
          【解决方案11】:

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

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

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

          【讨论】:

          • 我不知道为什么这里没有更多的 +1。 erics-notes 的博客条目令人困惑。这很简单,效果很好。谢谢!
          • 对我来说效果很好。谢谢。我的参数被命名为 RELEASE_TAG,所以我使用 tags/${RELEASE_TAG} 作为分支说明符的值。
          • 无法让它工作。由于某种原因无法签出标签。我得到:'错误:找不到要构建的任何修订。验证此作业的存储库和分支配置。我指定tags/3.0.1,我也试过*/tags/3.0.1 我验证了tag确实存在。
          • 当我尝试执行此答案中的建议时,存储库的每次轮询都会触发构建。 git 轮询日志会不断显示“Last Built Revision”是标签的版本,而“Latest remote head revision is”是最新的HEAD 的版本。 git 插件的逻辑似乎比较了这两个版本,在我的存储库中,它们总是不相等,因此总是会触发新的构建。
          • 这肯定是正确的答案,它对我有用,而且非常简单。虽然我不投票回购,所以我想仍然存在这个问题。
          【解决方案12】:

          通过将 Refspec 和 Branch Specifier 设置为 detailed in this blog post,我能够让 Jenkins 构建标签。

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-08-15
            • 2017-12-25
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-06-07
            • 2016-06-24
            相关资源
            最近更新 更多