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