我有一个很长的构建步骤(需要几个小时)和一个Jenkins文件触发它。 (构建步骤由多个Makefile目标等组成。)
由于构建步骤完成了生成工件所需的所有内容,因此Jenkins管道可视化非常无用。
有没有一种方法可以更好地可视化构建步骤的内部结构,而无需将其移植/复制到Jenkins文件中?
答案 0 :(得分:3)
您可以远离单个目标任务来构建所有内容(make
或make 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输出,当命令需要很长时间才能完成时,这没有用。