Jenkins で逐次実行している処理に時間がかかっているとき、並列化するだけで手軽に高速化できる場合があります。
pipeline {
agent any
stages {
stage("parallel") {
parallel {
stage('job1') {
when {[]()
expression {
return job1.toBoolean()
}
}
steps {
build job: 'test-job1', parameters: [
[$class: 'StringParameterValue', name: "date", value: "$date"]
]
}
}
stage('job2') {
when {
expression {
return job2.toBoolean()
}
}
steps {
build job: 'test-job2', parameters: [
[$class: 'StringParameterValue', name: "date", value: "$date"]
]
}
}
stage('job3') {
when {
expression {
return job3.toBoolean()
}
}
steps {
build job: 'test-job3', parameters: [
[$class: 'StringParameterValue', name: "date", value: "$date"]
]
}
}
}
}
}
}
pipeline {
parameters {
string(name: "NAMES", description: "comma separated list")
}
stages {
stage("run") {
steps {
script {
def nameList = params.NAMES.split(",")
// { ブランチ名: {処理}} というmapを作る
def branches = nameList.collectEntries{ it ->
[it,
{
stage("run-${it}") {
// stepを実行する
withEnv([
"NAME=${it}",
]) {
sh '''
echo "Hello ${NAME}"
'''
}
// 子ジョブを実行する
build(job: "child", parameters: [string(name: 'NAME', value: it)])
}
}
]
}
println branches
// => [
// "foo": { stage("run-foo") { ... } },
// "bar": { stage("run-bar") { ... } },
// ]
parallel branches
// 同時実行数を制限したい場合は以下のようにする
// def MAX_CONCURRENT = 4
// (branches.keySet() as List).collate(MAX_CONCURRENT).each{
// parallel branches.subMap(it)
// }
}
}
}
}
}