Ich habe eine Lösung gefunden, die bei uns zu funktionieren scheint. Es dreht sich um den currentBuild
Commit-Hash und dann den lastSuccessfulBuild
Commit-Hash. Zuerst schrieben wir eine Hilfsmethode für die Zeugung eines Commit-Code einer Jenkins Bauobjekt:
def commitHashForBuild(build) {
def scmAction = build?.actions.find { action -> action instanceof jenkins.scm.api.SCMRevisionAction }
return scmAction?.revision?.hash
}
dann verwenden, um den Hash-s‘lastSuccessfulBuild
zu erhalten:
def getLastSuccessfulCommit() {
def lastSuccessfulHash = null
def lastSuccessfulBuild = currentBuild.rawBuild.getPreviousSuccessfulBuild()
if (lastSuccessfulBuild) {
lastSuccessfulHash = commitHashForBuild(lastSuccessfulBuild)
}
return lastSuccessfulHash
}
schließlich diese beiden in einem sh
kombinieren Funktion die Liste der Commits
def lastSuccessfulCommit = getLastSuccessfulCommit()
def currentCommit = commitHashForBuild(currentBuild.rawBuild)
if (lastSuccessfulCommit) {
commits = sh(
script: "git rev-list $currentCommit \"^$lastSuccessfulCommit\"",
returnStdout: true
).split('\n')
println "Commits are: $commits"
}
bekommen Sie dann die commits
Array verwenden können verschiedene Dinge in Git als Build erfordert abzufragen. Z.B. Sie können diese Daten verwenden, um eine Liste aller geänderten Dateien seit dem letzten erfolgreichen Build zu erhalten.
Ich habe dies in eine vollständige example Jenkinsfile Gist setzen, um zu zeigen, wie es im Zusammenhang zusammenpasst.
Eine mögliche Verbesserung wäre die Verwendung einer Java/Groovy-nativen Git-Bibliothek anstelle des Ausschießens auf einen sh
-Schritt.