2017-04-10 3 views
3

Mit Bezug auf this question gibt es eine Möglichkeit, die äquivalenten Informationen aus der Verwendung der Multi-Branch-Pipeline zu erhalten? Speziell - die Liste der Commits seit dem letzten erfolgreichen Build.Jenkinsfile - Erhalte alle Änderungen zwischen Builds

Derzeit verwenden wir die folgende

def scmAction = build?.actions.find { action -> 
    action instanceof jenkins.scm.api.SCMRevisionAction 
} 
return scmAction?.revision?.hash 

aber dies gibt nur die letzte begehen, die die Build ausgelöst, wenn mehrere Commits geschoben wurden. Ich akzeptiere, dass der allererste Build eines neuen Zweiges ambiguous sein könnte, aber eine Liste der Commits zu erhalten, die den Build ausgelöst haben wenn möglich wäre sehr nützlich.

Antwort

3

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.

Verwandte Themen