有人有一个Jenkins Pipeline脚本,可以填充所有的变化,因为以前的成功构建在一个变量?我正在使用git和多分支管道作业。
我设法拼凑了一些东西。我很确定你可以更好地迭代数组但我现在得到的是:
node('Android') {
passedBuilds = []
lastSuccessfulBuild(passedBuilds, currentBuild);
def changeLog = getChangeLog(passedBuilds)
echo "changeLog ${changeLog}"
}
def lastSuccessfulBuild(passedBuilds, build) {
if ((build != null) && (build.result != 'SUCCESS')) {
passedBuilds.add(build)
lastSuccessfulBuild(passedBuilds, build.getPreviousBuild())
}
}
@NonCPS
def getChangeLog(passedBuilds) {
def log = ""
for (int x = 0; x < passedBuilds.size(); x++) {
def currentBuild = passedBuilds[x];
def changeLogSets = currentBuild.rawBuild.changeSets
for (int i = 0; i < changeLogSets.size(); i++) {
def entries = changeLogSets[i].items
for (int j = 0; j < entries.length; j++) {
def entry = entries[j]
log += "* ${entry.msg} by ${entry.author} n"
}
}
}
return log;
}
根据CaptRespect的回答,我编写了以下脚本用于声明性管道:
def changes = "Changes:n"
build = currentBuild
while(build != null && build.result != 'SUCCESS') {
changes += "In ${build.id}:n"
for (changeLog in build.changeSets) {
for(entry in changeLog.items) {
for(file in entry.affectedFiles) {
changes += "* ${file.path}n"
}
}
}
build = build.previousBuild
}
echo changes
这在stage->when->expression
部件中非常有用,仅当某些文件被更改时才运行阶段。虽然我还没有到那部分,但我很想从这里创建一个共享库,并使它有可能传递一些globbing模式来检查。
编辑:顺便检查一下文档,如果你想深入研究一下。您应该能够将所有object.getSomeProperty()
调用转换为entry.someProperty
。
为了将更改作为字符串列表返回,而不仅仅是打印它们,您可以使用这个函数(基于@andsens的答案):
def getChangesSinceLastSuccessfulBuild() {
def changes = []
def build = currentBuild
while (build != null && build.result != 'SUCCESS') {
changes += (build.changeSets.collect { changeSet ->
(changeSet.items.collect { item ->
(item.affectedFiles.collect { affectedFile ->
affectedFile.path
}).flatten()
}).flatten()
}).flatten()
build = build.previousBuild
}
return changes.unique()
}
我是这样用的:
def listFilesForBuild(build) {
def files = []
currentBuild.changeSets.each {
it.items.each {
it.affectedFiles.each {
files << it.path
}
}
}
files
}
def filesSinceLastPass() {
def files = []
def build = currentBuild
while(build.result != 'SUCCESS') {
files += listFilesForBuild(build)
build = build.getPreviousBuild()
}
return files.unique()
}
def files = filesSinceLastPass()
有自上次成功以来的变化插件可以帮助你。
对于使用Accurev的人来说,这里是对andsens答案的改编。andsens的答案不能使用,因为Accurev插件没有实现getAffectedFiles。扩展ChangeLogSet的AccurevTransaction的文档。入门课程可以在这里找到。
import hudson.plugins.accurev.*
def changes = "Changes: n"
build = currentBuild
// Go through the previous builds and get changes until the
// last successful build is found.
while (build != null && build.result != 'SUCCESS') {
changes += "Build ${build.id}:n"
for (changeLog in build.changeSets) {
for (AccurevTransaction entry in changeLog.items) {
changes += "n Issue: " + entry.getIssueNum()
changes += "n Change Type: " + entry.getAction()
changes += "n Change Message: " + entry.getMsg()
changes += "n Author: " + entry.getAuthor()
changes += "n Date: " + entry.getDate()
changes += "n Files: "
for (path in entry.getAffectedPaths()) {
changes += "n " + path;
}
changes += "n"
}
}
build = build.previousBuild
}
echo changes
writeFile file: "changeLog.txt", text: changes