我正在构建一个库函数来获取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
当我创建新的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仓库......
编辑:解释/简化问题
答案 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()
}
}