2017-05-21 49 views
2

我有一個很長的構建步驟(它需要幾個小時)和一個Jenkinsfile觸發它。 (構建步驟由多個Makefile目標等組成)如何更好地使用Jenkinsfile可視化大型構建步驟的工作?

由於構建步驟完成生成工件所需的所有工作,因此Jenkins管道可視化非常無用。

有沒有辦法讓我更好地將構建步驟的內部可視化,而無需將其移植到/複製到Jenkinsfile?

回答

0

不是真的:有一個similar issue for long-running stages

關於步驟,有JENKINS 33185(「可視化流水線級內並行步驟」)仍然打開

但對於一個單一的長時間運行的一步,你已經是殼輸出,這是不是當有幫助一個命令需要很長時間才能完成。

+0

票鏈接藍海(我也可以使用),但我不確定藍色海洋如何提供幫助。關於貝殼產量。我有很多。如果我可以解析它並從概述中的解析輸出步驟生成,那將是非常好的。但我還沒有看到我會如何做到這一點。 – JE42

+0

@ JE42也許通過像https://wiki.jenkins-ci.org/display/JENKINS/Log+Parser+Plugin或更近的插件https://wiki.jenkins-ci.org/display/JENKINS/Console+解析器+插件,但它可能無法與管道良好配合。 – VonC

+0

@ JE42也許http://stackoverflow.com/q/36304131/6309是一種可能的選擇? – VonC

3

您可以遠離單個目標任務來構建所有內容(makemake all),而是專門針對Jenkins文件中的不同構建任務。例如,假設您正在爲不同平臺構建應用程序。您原來Jenkinsfile可能是......

node('builder') { 
    stage('build') { 
    sh "make" 
    } 
} 

這是觸發了「所有」的目標在你的makefile,這可能觸發的任務「的iOS」,「機器人」和「WindowsPhone的」

相反,讓你的Jenkinsfile單獨執行這些任務中的每一個。

例:

node('builder') { 
    stage('build iOS') { 
    sh "make iOS" 
    } 
    stage('build android') { 
    sh "make android" 
    } 
    stage('build windows phone') { 
    sh "make windowsphone" 
    } 
} 

通過你的目標任務拆分成這些多階段,你最好在你的詹金斯UI報告。

如果你想成爲真正的勇敢,你能避免創建一個腳本拆開什麼all在做,把它變成詹金斯階段在兩個地方(在all目標,以及Jenkinsfile)硬編碼此。假設你all或默認的任務僅僅是一個的其他任務列表,你可以使用以下的bash:

if [[ -z $(make -rpn | grep ".DEFAULT_GOAL") ]]; then 
    DEFAULTTARGET=all 
else 
    DEFAULTTARGET=$(make -rpn | grep ".DEFAULT_GOAL" | sed "s/.*=[[:space:]]*//" | tr -d "[:space:]") 
fi 

make -rpn | sed -n -e "/^$/ { n ; /^[^ ]*:/p ; }" | grep "$DEFAULTTARGET:" | sed "s/.*:[[:space:]]*//" | tr " " "\n" 

在Jenkinsfile像這樣:

node() { 
    ## NOT NORMALLY REQUIRED. Just sets up a simple makefile 
    sh "echo 'all: images release clean report' > Makefile " 
    ## Start of required logic 
    def makeTasks = sh(script: 'if [[ -z $(make -rpn | grep ".DEFAULT_GOAL") ]]; then  DEFAULTTARGET=all; else  DEFAULTTARGET=$(make -rpn | grep ".DEFAULT_GOAL" | sed "s/.*=[[:space:]]*//" | tr -d "[:space:]"); fi; make -rpn | sed -n -e "/^$/ { n ; /^[^ ]*:/p ; }" | grep "$DEFAULTTARGET:" | sed "s/.*:[[:space:]]*//" | tr " " "\n"', returnStdout: true) 
    def tasks = makeTasks.split('\n') 
    for(int i = 0; i < tasks.size(); i++){ 
     stage(tasks[i]) { 
      echo tasks[i] 
      // This will fail with the bogus makefile defined above, but would work with a real one. 
      // sh 'make ${tasks[i]}' 
     } 
    } 
} 
相關問題