如何使用Jenkinsfile更好地可视化大型构建步骤的工作?

时间:2017-05-21 14:57:02

标签: jenkins jenkins-pipeline

我有一个很长的构建步骤(需要几个小时)和一个Jenkins文件触发它。 (构建步骤由多个Makefile目标等组成。)

由于构建步骤完成了生成工件所需的所有内容,因此Jenkins管道可视化非常无用。

有没有一种方法可以更好地可视化构建步骤的内部结构,而无需将其移植/复制到Jenkins文件中?

2 个答案:

答案 0 :(得分:3)

您可以远离单个目标任务来构建所有内容(makemake all),而是专门针对Jenkinsfile中的不同构建任务。例如,我们假设您正在为不同的平台构建应用。您原来的Jenkins文件可能是......

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

触发了所有" makefile中的目标,可能会触发任务" iOS"," android"和" windowsphone"

相反,让Jenkinsfile单独定位这些make任务中的每一个。

例如:

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

通过将目标任务分成多个阶段,您最好在Jenkins UI中进行报告。

如果你想要非常勇敢,可以通过创建一个脚本来分解all正在做的事情并将其转换为两个地方(all目标和Jenkins文件)来避免硬编码进入詹金斯阶段。假设您的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"
在像这样的Jenkins文件中

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]}'
        }
    }
}

答案 1 :(得分:0)

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

关于步骤,JENKINS 33185(“在管道阶段内可视化并行步骤”)仍然打开

但是对于一个长时间运行的步骤,你所拥有的只是shell输出,当命令需要很长时间才能完成时,这没有用。