使用 JGit 在 Jenkins 管道中获取 git 提交 SHA

get git commit SHA within Jenkins pipeline with JGit

我有一个带有 Github 组织插件的 Jenkins,它可以扫描我的组织并构建组织内具有 Jenkinsfile 的所有存储库的所有 branches/PRs。

效果很好,但我想为每个构建检索提交 SHA,以便使用分支名称和提交 SHA 标记 Docker 图像。

获取分支名称对 env.BRANCH_NAME 非常有用,但是我找不到任何方法来获取提交 SHA。

问题是我们正在使用 JGit,所以我无法使用 git log 来检索它。

我尝试使用 sh 'printenv' 查看 ENV 中包含的内容,但那里没有任何用处。

我还尝试了以下方法:

def checkoutResults = checkout scm
echo 'checkout results: ' + checkoutResults

但这会产生以下结果:

checkout results: [:]

尽管我无法从我的管道中获取修订版,但 Jenkins 可以正常使用,正如我在日志中看到的那样:

...
Obtained Jenkinsfile from 98062e5f651ca698f4303c3bb8d20665ce491294
...
Checking out Revision 98062e5f651ca698f4303c3bb8d20665ce491294 (docker)

我是运行以下版本:

在此特定情况下,如果能帮助检索提交的 SHA/修订版,我们将不胜感激。

我创建了一个小 groovy 函数

def getCommitSha(){
    return sh(returnStdout: true, script: 'git rev-parse HEAD')
}

您可以将它添加到您的管道中,或者如果您正在使用它,则将其添加到您的共享库中(如果不是,现在是开始的好时机......:-))

git 插件直到 3.3.2 版本才包含 the fix。您至少需要更新到 git 插件 3.3.2。

截至 2017 年 11 月 23 日的当前 git 插件版本是 3.6.4。它包括对多分支管道的重要添加和更改。

还有一个 known bug in the reporting of NAME and EMAIL values which has a regression test 确认该错误会影响所有实现(git 和 jgit)。如果需要,您可以将该回归测试用作使用这些值的示例。

如果您无法从 git 插件 3.3.0 更新到 3.3.2,您可以使用管道脚本中的 JGit 类 来执行相同类型的查询在问题的另一个答案中提供了命令行 git。我从来没有做过,但我相信这是可能的。