Git描述标签在Jenkins管道构建上无法工作。

6

我看了这个问题,它有些类似但并不完全相同。那里的问题在于标签没有被正确推送。

我目前正在使用Jenkins来构建我的Python项目,使用setuptools_scm,它基本上使用git describe来获取一个(或多或少)合理的版本号,即使不在标签上。这个流程是像这样用JobDSL定义的:

import BuildProjects

BuildProjects.build_projects.each { def bproject ->
   multibranchPipelineJob("tool/${bproject}") {
      branchSources {
         branchSource {
            source {
               git {
                  id('tool_${bproject}')
                  remote("${BuildProjects.scmBaseLocation}/${bproject}.git")
                  credentialsId(BuildProjects.scmUser)
                  traits {
                     gitBranchDiscovery()
                     gitTagDiscovery()
                     cloneOptionTrait {
                        extension {
                           shallow(false)
                           noTags(false)
                           reference('grmblwrx')
                           timeout(1)
                        }
                     }
                  }
               }
            }
         }
      }

   }
}

一些配置数值来自于 BuildProjects。 运行 Jenkins 时,我发现它会获取标签:
 > git fetch --tags --progress -- ssh://git@git.my-company.net/tools.git +refs/heads/*:refs/remotes/origin/* # timeout=1

实际上,我可以在使用an时在我的Jenkinsfile中输出标签。

sh "git tag"

块级元素。但使用

sh "git describe --tags"

提供

fatal: No tags can describe '<Commit hash>'.
Try --always, or create some tags.

我在某处读到,这可能是由于稀疏检出引起的:标签和当前HEAD之间的提交可能已经丢失。仔细检查后,我在我的日志中发现

> git config core.sparsecheckout # timeout=10
> git checkout -f <Commit hash> # timeout=10

在上面展示的git fetch行之后,立即执行。看来我的JobDSL配置不被尊重。有什么想法吗?


我注意到你有“reference('grmblwrx')”,这是什么?另外,在克隆之前,你尝试过清理WS吗? - Yazeed Sabri
我从文档中了解到引用不能为空,但如果目录不存在,则不会使用它,因此我输入了一些无意义的单词。 - arne
3个回答

4

自2018年git插件3.4.0以来,Jenkins管道默认使用狭窄的refspec克隆,而不带标签。
这在{{link1:allegro/axion-release-plugin问题195}}中有所说明,并在{{link3:allegro/axion-release-plugin PR 198}}中进行了文档化

raster-foundry/raster-foundry PR 4233中所示,请检查您的checkout scm步骤及其cloneOptions:

node {
  try {
    // Checkout the proper revision into the workspace.
    stage('checkout') {
      checkout([
        $class: 'GitSCM',
        branches: scm.branches,
        extensions: scm.extensions + [[$class: 'CloneOption', noTags: false, reference: '', shallow: false]],
        userRemoteConfigs: scm.userRemoteConfigs
      ])
    }
    ...

尝试使用noTags: false, reference: '', shallow: false,查看问题是否仍然存在。

这基本上就是我在问题中使用的JobDSL,所以不,这行不通。 - arne
@arne 是的,我没有仔细阅读你的JobDSL中的cloneOptionTrait部分。 - VonC

3
自从我发布了我的问题以后,我们更新了 Jenkins 实例和一些插件,特别是 Git 插件。出于某种原因,现在它“只是工作了”。我无法通过大量的麻烦来重新创建旧设置,因此我不能轻易地弄清楚是什么导致了这个“修复”。

1

我在将Jenkins从2.176.2和git插件3.11.0更新到Jenkins 2.289.1和git插件4.7.2后遇到了同样的问题。

在“管理Jenkins->配置系统->Git插件”中,启用“检出期间保留第二次获取”的选项

enter image description here

这样做可以恢复旧版的git插件行为,"git describe"功能也会重新启用。

那没有帮助。 - OrangeDog

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接