2015-10-29 27 views
2

當您設置Jenkins作業時,如果最新版本比前一版本更差,各種測試結果插件將顯示迴歸。Jenkins,如何檢查其他工作的迴歸

我們在Jenkins的許多項目上都有很多工作,並且我們希望避免設置「每個分支的工作」。因此,目前我們正在使用參數化版本來構建使用單個作業的不同開發分支。

但是這意味着當我建立一個新的分支時,任何迴歸都是針對以前的版本進行衡量的,這可能是針對不同的分支。我真正想要的是測量功能分支中的迴歸與最新版本的主分支分支。

我認爲我們應該建立一個單獨的'主'構建旁邊的參數化'分支'構建。但我仍然無法看出我如何比較工作之間的結果。有沒有可以幫助的插件?

UPDATE

我已經開始在腳本控制檯試驗,看看我是否可以寫一個生成後腳本...我設法得到主分支的最新版本在我的參數的工作......我不能解決如何從構建對象獲取測試結果的問題。

我需要的數據是JSON提供
http://<jenkins server>/job/<job name>/<build number>/testReport/api/json?pretty=true

...如果我可以直接去找這個數據結構,這將是偉大的!

我試過使用JsonSlurper通過HTTP加載json,但我得到403,我猜是因爲我的腳本沒有auth會話。

我想我可以從磁盤加載xml測試結果並將它們解析到我的腳本中,當詹金斯已經做到這一點時,它似乎有點愚蠢。

回答

4

我最終設法實現我想要的一切,在Groovy Postbuild Plugin

使用Groovy腳本我做了很多使用腳本控制檯http://<jenkins>/script,也是Jenkins API class docs都得心應手探索。

每個人的使用都會有所不同,因爲您必須深入瞭解構建插件以獲取所需的信息,但以下是我的代碼的一些可能幫助。

先拿到構建你想要的:

def getProject(projectName) { 
    // in a postbuild action use `manager.hudson` 
    // in the script web console use `Jenkins.instance` 
    def project = manager.hudson.getItemByFullName(projectName) 
    if (!project) { 
     throw new RuntimeException("Project not found: $projectName") 
    } 
    project 
} 

// CloudBees folder plugin is supported, you can use natural paths: 
project = getProject('MyFolder/TestJob') 

build = project.getLastCompletedBuild() 

主要測試結果(JUnit的等)似乎是可直接在構建爲:

result = build.getTestResultAction() 
// eg 
failedTestNames = result.getFailedTests().collect{ test -> 
    test.getFullName() 
} 

爲了得到更加專業化的結果例如Violations插件或Cobertura代碼覆蓋率,您必須查找特定的構建操作。

// have a look what's available: 
build.getActions() 

你會看到的東西,如一個列表:

[[email protected], 
[email protected], 
[email protected], 
[email protected]4291d1a5] 

這些情況下,在@符號前面的部分是類的名字,所以我用,爲了使獲得此方法具體操作:

def final VIOLATIONS_ACTION = hudson.plugins.violations.ViolationsBuildAction 
def final COVERAGE_ACTION = hudson.plugins.cobertura.CoberturaBuildAction 

def getAction(build, actionCls) { 
    def action = build.getActions().findResult { act -> 
     actionCls.isInstance(act) ? act : null 
    } 
    if (!action) { 
     throw new RuntimeException("Action not found in ${build.getFullDisplayName()}: ${actionCls.getSimpleName()}") 
    } 
    action 
} 

violations = getAction(build, VIOLATIONS_ACTION) 

// you have to explore a bit more to find what you're interested in: 
pylint_count = violations?.getReport()?.getViolations()?."pylint" 

coverage = getAction(build, COVERAGE_ACTION)?.getResults() 
// if you println it looks like a map but it's really an Enum of Ratio objects 
// convert to something nicer to work with: 
coverage_map = coverage.collectEntries { key, val -> [key.name(), val.getPercentageFloat()] } 

有了這些積木我能夠把它一起比較了兩個「無關」的結果建立工作一個生成後腳本,然後使用Groovy的Postbuil d插件的輔助方法來設置構建狀態。

希望這可以幫助別人。

相關問題