我正在尝试编写一个Jenkinsfile
并行执行一系列步骤。目标是有两个agents
(又名。nodes
)。一个应该做一个Windows构建,另一个应该是Linux构建。但是,我不希望这种情况顺序发生,而是并行发生。我正在尝试查找Pipeline - Parallel execution of tasks中描述的parallel
指令的文档。
我在Jenkins上发现了一个parallel
一个,但似乎文档被破坏了:https://jenkins.io/doc/pipeline/steps/workflow-cps/
parallel: Execute in parallel
org.kohsuke.stapler.NoStaplerConstructorException:
There’s no @DataBoundConstructor on any constructor of class
org.jenkinsci.plugins.workflow.cps.steps.ParallelStep
我应该如何设置一个可以在两个不同代理(一个linux,一个窗口)上并行执行一系列构建步骤的Jenkins文件?
特别是,我应该使用基于声明或基于脚本的管道DSL吗?
答案 0 :(得分:10)
您可以使用声明式或基于脚本来执行并行工作。可以在此处找到基于脚本的并行文档:https://jenkins.io/doc/book/pipeline/jenkinsfile/#advanced-scripted-pipeline
他们给出了以下例子......
stage('Build') {
/* .. snip .. */
}
stage('Test') {
parallel linux: {
node('linux') {
checkout scm
try {
unstash 'app'
sh 'make check'
}
finally {
junit '**/target/*.xml'
}
}
},
windows: {
node('windows') {
/* .. snip .. */
}
}
}
对于声明,我相信你会这样做:
stage('Build') {
steps {
parallel (
"Windows" : {
echo 'done'
},
"Linux" : {
echo 'done'
}
)
}
}
答案 1 :(得分:2)
Declarative Matrix是用于运行并行任务的一项出色功能。它允许您为矩阵指令中定义的每个配置执行定义的阶段(包括后构建操作),而无需重复代码。
示例:
pipeline {
agent none
stages {
stage('Test') {
matrix {
agent {
label "${PLATFORM}-agent"
}
axes {
axis {
name 'PLATFORM'
values 'linux', 'windows'
}
}
stages {
stage('Test') {
steps {
echo "Do Test for ${PLATFORM}"
}
}
}
post {
always {
junit "**/TEST-*.xml"
}
}
}
}
}
}
詹金斯blog post语录:
在没有矩阵的情况下创建的等效管道将很容易 倍,并且难以理解和维护。