【发布时间】:2017-05-22 06:08:12
【问题描述】:
我有一个相当长的构建步骤(需要几个小时)和一个触发它的 Jenkinsfile。 (构建步骤由多个 Makefile 目标等组成。)
由于构建步骤完成了生成工件所需的所有操作,因此 Jenkins 流水线可视化非常无用。
有没有一种方法可以更好地可视化构建步骤的内部结构,而无需将其移植/复制到 Jenkinsfile 中?
【问题讨论】:
我有一个相当长的构建步骤(需要几个小时)和一个触发它的 Jenkinsfile。 (构建步骤由多个 Makefile 目标等组成。)
由于构建步骤完成了生成工件所需的所有操作,因此 Jenkins 流水线可视化非常无用。
有没有一种方法可以更好地可视化构建步骤的内部结构,而无需将其移植/复制到 Jenkinsfile 中?
【问题讨论】:
您可以从单个目标任务转移到构建所有内容(make 或 make 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]}'
}
}
}
【讨论】:
不是真的:有一个similar issue for long-running stages。
关于步骤,JENKINS 33185(“可视化管道阶段内的并行步骤”)仍然打开
但是对于一个长时间运行的步骤,您所拥有的只是 shell 输出,当命令需要很长时间才能完成时,这并没有多大帮助。
【讨论】: