Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/jenkins/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Jenkins文件更好地可视化大型构建步骤的工作?_Jenkins_Jenkins Pipeline - Fatal编程技术网

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

如何使用Jenkins文件更好地可视化大型构建步骤的工作?,jenkins,jenkins-pipeline,Jenkins,Jenkins Pipeline,我有一个相当长的构建步骤(需要几个小时)和一个触发它的Jenkins文件。(构建步骤包括多个Makefile目标等) 由于构建步骤完成了生成工件所需的一切,因此Jenkins管道可视化是非常无用的 有没有一种方法可以让我更好地可视化构建步骤的内部结构,而不必将其移植/复制到Jenkins文件中?没有:有一种方法 关于步骤,仍然有(“在管道阶段中可视化并行步骤”)未解决 但是对于一个长时间运行的步骤,您所拥有的只是shell输出,当一个命令需要很长时间才能完成时,这并没有多大帮助。您可以从单个目标

我有一个相当长的构建步骤(需要几个小时)和一个触发它的Jenkins文件。(构建步骤包括多个Makefile目标等)

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

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

没有:有一种方法

关于步骤,仍然有(“在管道阶段中可视化并行步骤”)未解决


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

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

node('builder') {
  stage('build') {
    sh "make"
  }
}
这会触发makefile中的“all”目标,这可能会触发任务“iOS”、“android”和“windowsphone”

相反,让您的Jenkins文件针对这些任务中的每一个单独执行任务

例:

通过将目标任务分为这些多个阶段,您应该在Jenkins UI中更好地进行报告

如果你真的想变得勇敢,你可以通过创建一个脚本来分解
all
正在做的事情并将其转化为jenkins阶段,从而避免在两个地方(
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"
在这样的文件中:

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]}'
        }
    }
}
node(){
##通常不需要。只需设置一个简单的makefile
sh“echo”all:images发布干净的报告“>Makefile”
##所需逻辑的开始
def makeTasks=sh(脚本:“if[-z$(make-rpn | grep.DEFAULT|u GOAL”)];然后DEFAULTTARGET=all;否则DEFAULTTARGET=$(make-rpn | grep.DEFAULT|GOAL“| sed”s/*=[:space:][]/“| tr d”[:space:]”;fi make-rpn | sed-n'-n-n-e/^$/^/{n;}grep“$DEFAULTTARGET:”:::::[:sed:][:space,returnStdout:true)
def tasks=makeTasks.split('\n')
对于(int i=0;i
机票链接到Blue Ocean(我也可以访问),但我不确定Blue Ocean能提供什么帮助。关于shell输出。我有很多。如果我能解析它并从概述中解析的输出步骤生成,那就太好了。但是我还没看到我会怎么做。@ JE42也许是通过一个插件或者最近的一个插件,但是它可能不能很好地使用流水线。@ JE42或者提到了,但是这将被设置为一个单独的工作,这不是你的问题似乎要考虑的。不幸的是,这三个插件似乎都无法根据控制台输出生成管道步骤。@JE42确切地说,我没有找到一种适合作为管道步骤的方法
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]}'
        }
    }
}