Jenkins:找到git commit的内部版本号

时间:2017-08-21 15:16:32

标签: jenkins jenkins-pipeline

每次提交我的git repo都会触发我的Jenkins管道的构建。

我想通过提交哈希来检索旧构建的buildNumber。我怎么能这样做?

我知道这些信息存在,因为我可以在UI中找到它。

我想要这个的一些背景: 当有人标记提交时,我想创建一个版本(通过标记泊坞窗图像)。每个构建都将推送包含构建号的图像。所以我想找出哪个构建号对应于该提交,以便找到我想要发布的图像。

5 个答案:

答案 0 :(得分:5)

安装Lucene插件 https://wiki.jenkins.io/display/JENKINS/Lucene-Search 并且您将能够通过默认的Jenkins搜索栏通过提交哈希进行搜索! (但是阅读插件文档,对于旧版本,您需要重建数据库)

如果您想以编程方式执行此操作,可以使用jenkins api,例如http://jenkinsapi.readthedocs.io/en/latest/using_jenkinsapi.html#example-5-getting-version-information-from-a-completed-build

修改示例中的函数不是为了获得最新的成功构建,而是为了获得所有构建并获取它们的git哈希值,然后过滤此集合。

答案 1 :(得分:1)

我根据@akostadinov的位戳了一下,发现内部编号和其他好东西,但没有找到GIT_COMMIT。

也许这对其他人有用,所以我想分享一下我发现的东西。

使用http://yourjenkins:8080/script打开管理脚本控制台,并亲自检查一下。

def job = hudson.model.Hudson.instance.getItem("Foo Project")
def builds = job.getBuilds()

def thisBuild = builds[0]
def fourBuildsAgo = builds[4] 

println('env' + builds[0].getEnvironment().keySet() )
println('each job has previous job e.g "' + thisBuild.getPreviousBuild() + '"')

fourBuildsAgo.getChangeSets().each {
  println('Num of commits in this build ' + (it.getLogs()).size() )

  it.getLogs().each {
     println('commit data : '  + it.getRevision() + ' ' + it.getAuthor() + ' ' + it.getMsg()) 
  }
}

我用这个GitChangeSet API来探讨groovy中的方法。

此代码将获取并显示4个构建之前的每个提交的提交哈希。您可以根据需要使用此文本设置currentBuild.description的格式,该文本将显示在状态页面上。

这导致输出(隐藏了实际的提交详细信息)

each job has previous job e.g "Foo Project #191"
Num of commits in this build 8
commit data : 288f0e7d3664045bcd0618aacf32841416519d92 user1 fixing the build  
commit data : b752ee12b3d804f9a674314bef4de5942d9e02f5 user2 Fix handling to the library foo
commit data : 9067fd040199abe32d75467734a7a4d0d9b6e8b2 user2 Implemented Foo Class
...
...
...

答案 2 :(得分:0)

如果要获取构建的提交ID,则可以使用groovy脚本,例如:

def job = hudson.model.Hudson.instance.getItem("My Job Name")
def builds = job.getBuilds()

然后对于您要克隆的每个git repo,您​​都可以通过以下方式进行修订

build.getEnvironment()["GIT_COMMIT"]
build.getEnvironment()["GIT_COMMIT_4"]

答案 3 :(得分:0)

build.actions.find { action -> action instanceof jenkins.scm.api.SCMRevisionAction }?.revision?.hash;

参考和信用:https://gist.github.com/ftclausen/8c46195ee56e48e4d01cbfab19c41fc0

答案 4 :(得分:-1)

如果我正确理解你的问题,那么你首先需要创建一个git钩子来触发新的构建。这部分在答案How do I react to new tags in git hooks?'中有所介绍,但如果您使用的是GitHub,BitBucket或Gitlab等,那么可能还有其他方法可以解决这个问题。

然后,当启动构建时,在Jenkins中存在作为变量“BUILD_NUMBER”提供的构建号。如果你想包含git标签名,那么你可以在脚本中使用它,那么似乎有几种方法:

通常,这些插件将创建一个可由脚本使用的环境变量。我没有提供更具体的例子,因为我不知道你的确切工具。