注意:質問は、「スクリプト化された」パイプライン形式と呼ばれる古いものに基づいています。 「宣言パイプライン」を使用する場合、並列ブロックをステージブロック内にネストできます( 宣言パイプライン1.2の並列ステージ を参照)。
Jenkinsのワークフロー/パイプラインプラグイン、特にESPでどのように並列ステップが機能するのか疑問に思っています。それらをビルドステージとどのように組み合わせるか。私は一般的なパターンについて知っています:
parallel(firstTask: {
// Do some stuff
}, secondTask: {
// Do some other stuff in parallel
})
ただし、いくつかのステージを(複数のエグゼキューターが存在する同じノードで)並行して実行したいので、次のようなステージを追加しようとしました。
stage 'A'
// Do some preparation stuff
parallel(firstTask: {
stage 'B1'
// Do some stuff
}, secondTask: {
stage 'B2'
// Do some other stuff in parallel
})
stage 'C'
// Finalizing stuff
これは期待どおりに機能しません。 「do stuff」タスクは並列で実行されますが、並列ステージはすぐに終了し、それらに含まれるべきものは組み込まれません。結果として、ステージビューには正しい結果が表示されず、ログもリンクされません。
異なるステージを並行して構築できますか、または「並行」ステップは単一のステージ内でのみ使用することを意図していますか?
非推奨の非ブロックスコープstage
(元の質問のように)をparallel
内に配置することはできません。
JENKINS-26107 の時点で、stage
はブロック引数を取ります。 parallel
をstage
の中に入れたり、stage
をparallel
の中に入れたり、stage
をstage
の中に入れたりすることができます。すべてのネスト;特に
stage
ネスティングを示します。parallel
ブランチを表示しますが、現在は表示しません。JENKINS-27394 は、実装されている場合、任意にネストされたstage
sを表示します。
その構文は非推奨になりました。このエラーが発生します:
org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
WorkflowScript: 14: Expected a stage @ line 14, column 9.
parallel firstTask: {
^
WorkflowScript: 14: Stage does not have a name @ line 14, column 9.
parallel secondTask: {
^
2 errors
次のようなことを行う必要があります。
stage("Parallel") {
steps {
parallel (
"firstTask" : {
//do some stuff
},
"secondTask" : {
// Do some other stuff in parallel
}
)
}
}
ここにノードの使用を追加して、複数のビルドサーバー/ VMにジョブを分散するために:
pipeline {
stages {
stage("Work 1"){
steps{
parallel ( "Build common Library":
{
node('<Label>'){
/// your stuff
}
},
"Build Utilities" : {
node('<Label>'){
/// your stuff
}
}
)
}
}
すべてのVMには、プールとして使用するラベルを付ける必要があります。
私は次のパイプラインをテストしましたが、動作します
parallel firstBranch: {
stage ('Starting Test')
{
build job: 'test1', parameters: [string(name: 'Environment', value: "$env.Environment")]
}
}, secondBranch: {
stage ('Starting Test2')
{
build job: 'test2', parameters: [string(name: 'Environment', value: "$env.Environment")]
}
}
「trigger-test」という名前のこのジョブは、「Environment」という名前のパラメーターを1つ受け入れます
ジョブ 'test1'および 'test2'は単純なジョブです。
「test1」の例
実行時に、両方のステージが同時に実行されているのを見ることができます
これは現在公式に実装されていると思います: https://jenkins.io/blog/2017/09/25/declarative-1/
@Quartzが述べたように、次のようなことができます
stage('Tests') {
parallel(
'Unit Tests': {
container('node') {
sh("npm test --cat=unit")
}
},
'API Tests': {
container('node') {
sh("npm test --cat=acceptance")
}
}
)
}