最后成功构建的commitId返回库的commitId而不是当前作业

时间:2017-04-28 10:08:52

标签: git jenkins groovy

我正在构建一个库函数来获取Jenkins上一次成功构建的commit_id(以确定自提交以来已更改文件的列表)。

def getLastSuccessfulSHA1() { 
  def b = currentBuild.rawBuild.getPreviousSuccessfulBuild()
  if(b == null) {
    return ""
  }
  return b.getAction(hudson.plugins.git.util.BuildData.class).getLastBuiltRevision().getSha1String()

}

上面的代码在一个单独的git repo中,让我们称它为“库”。使用Manage Jenkins -> Configure System -> Global Pipeline Libraries

将此存储库加载到Jenkins中

当我创建新的Pipeline作业并执行以下代码时:

def b = currentBuild.rawBuild.getPreviousSuccessfulBuild()
echo b.getAction(hudson.plugins.git.util.BuildData.class).getLastBuiltRevision().getSha1String()

我得到以下结果:

Started by user Doedens, Harm
Loading library pipeline_utils@master
> git rev-parse --is-inside-work-tree # timeout=10
Setting origin to git@git:foo/jenkins-pipelines.git
> git config remote.origin.url git@git:foo/jenkins-pipelines.git # timeout=10
Fetching origin...
Fetching upstream changes from origin
> git --version # timeout=10
> git fetch --tags --progress origin +refs/heads/*:refs/remotes/origin/*
> git rev-parse master^{commit} # timeout=10
> git rev-parse origin/master^{commit} # timeout=10
> git rev-parse --is-inside-work-tree # timeout=10
Fetching changes from the remote Git repository
> git config remote.origin.url git@git:foo/jenkins-pipelines.git # timeout=10
Fetching upstream changes from git@git:foo/jenkins-pipelines.git
> git --version # timeout=10
> git fetch --tags --progress git@git:foo/jenkins-pipelines.git +refs/heads/*:refs/remotes/origin/*
Checking out Revision 00ea6f0fa0eaed45f06cdb695b955e22b96b4e25 (master)
> git config core.sparsecheckout # timeout=10
> git checkout -f 00ea6f0fa0eaed45f06cdb695b955e22b96b4e25
> git rev-list 00ea6f0fa0eaed45f06cdb695b955e22b96b4e25 # timeout=10
[Pipeline] echo
00ea6f0fa0eaed45f06cdb695b955e22b96b4e25
[Pipeline] End of Pipeline
Finished: SUCCESS

这很奇怪,因为它产生的commit_id来自utils git repo而不是与作业关联的Git repo。事实上我还没有在工作中配置Git仓库......

编辑:解释/简化问题

3 个答案:

答案 0 :(得分:0)

我在linux中有一个类似的脚本SH来获取GIT中的最后一次提交。

这是代码

git log --pretty="%h/%ad - %s. By %cn" --no-merges --since="$DATE" >> //logs/historic_git.log

答案 1 :(得分:0)

here getAction方法所述:

  

获取指定类型的操作(要查找的第一个实例)   为这个版本做出了贡献。

因为Jenkins加载一个库作为此构建的第一个Action,所以将返回该Action以及相应的详细信息。如果你想修改你对你感兴趣的Git仓库,你可以像这样过滤那个Action:

def b = currentBuild.rawBuild.getPreviousSuccessfulBuild()
def actions = b.getActions(hudson.plugins.git.util.BuildData.class)
for(action in actions) {
    if(action.getRemoteUrls().contains('git@git:foo.git')) {
        return action.getLastBuiltRevision().getSha1String()
    }
}

答案 2 :(得分:0)

需要将toString()添加到Harm Doedens提案中才能起作用

def b = currentBuild.rawBuild.getPreviousSuccessfulBuild()
def actions = b.getActions(hudson.plugins.git.util.BuildData.class)
for(action in actions) {
    if(action.getRemoteUrls().toString().contains('git@git:foo.git')) {
        return action.getLastBuiltRevision().getSha1String()
    }
}