2017-04-10 77 views
3

參考this question有沒有辦法從使用多分支管道時獲取等效信息?特別是 - 自上次成功構建以來的提交列表。Jenkinsfile - 獲取內部版本之間的所有更改

目前,我們使用以下

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

但這只是返回最後一個提交觸發構建,如果多個提交被推。我接受,新分支的第一個版本可能是不明確的,但獲得觸發構建的提交列表(如果可能的話)將非常有用。

回答

3

我找到了一個解決方案,似乎爲我們工作。它圍繞着獲得散列currentBuild,然後是lastSuccessfulBuild提交散列。首先,我們寫了一個實用的方法用於獲取給定的詹金斯的提交哈希建對象:

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

然後用它來獲取lastSuccessfulBuild的哈希:

def getLastSuccessfulCommit() { 
    def lastSuccessfulHash = null 
    def lastSuccessfulBuild = currentBuild.rawBuild.getPreviousSuccessfulBuild() 
    if (lastSuccessfulBuild) { 
    lastSuccessfulHash = commitHashForBuild(lastSuccessfulBuild) 
    } 
    return lastSuccessfulHash 
} 

終於在一個sh結合這兩個函數來獲得的提交

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" 
    } 

列表,然後你可以使用commits陣列來查詢各種東西的Git作爲構建需要。例如。您可以使用此數據獲取自上次成功構建以來所有已更改文件的列表。

我已經把它放到了一個完整的example Jenkinsfile的要點,以顯示它如何適應上下文。

可能的改進是使用Java/Groovy原生Git庫,而不是將其移植到sh步驟。

相關問題