【问题标题】:How can I better visualize the work of a large build step using a Jenkinsfile?如何使用 Jenkinsfile 更好地可视化大型构建步骤的工作?
【发布时间】:2017-05-22 06:08:12
【问题描述】:

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

由于构建步骤完成了生成工件所需的所有操作,因此 Jenkins 流水线可视化非常无用。

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

【问题讨论】:

    标签: jenkins jenkins-pipeline


    【解决方案1】:

    您可以从单个目标任务转移到构建所有内容(makemake all),而是专门针对 Jenkinsfile 中的不同构建任务。例如,假设您正在为不同平台构建应用程序。您原来的 Jenkinsfile 可能是...

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

    它触发了你的makefile中的“all”目标,它可能触发了“iOS”、“android”和“windowsphone”任务

    相反,让您的 Jenkinsfile 分别针对这些任务中的每一项。

    例如:

    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 目标和 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]}'
            }
        }
    }
    

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 门票链接到蓝海(我也可以访问),但我不确定蓝海如何提供帮助。关于外壳输出。我有很多。如果我可以解析它并从概述中的解析输出步骤生成,那就太好了。但我还没有看到我会如何做到这一点。
      • @JE42 也许通过像wiki.jenkins-ci.org/display/JENKINS/Log+Parser+Plugin 或最近的wiki.jenkins-ci.org/display/JENKINS/Console+Parser+Plugin 这样的插件,但它可能无法很好地与管道配合使用。
      • 很遗憾,这三个插件似乎都无法根据控制台输出生成管道步骤。
      • @JE42 确实,我没有找到适合作为管道步骤的方法
      猜你喜欢
      • 2021-07-01
      • 1970-01-01
      • 2017-03-31
      • 2011-09-03
      • 2018-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多