web-dev-qa-db-ja.com

Jenkinsワークフロー/パイプラインと並行してステージを実行する

注意:質問は、「スクリプト化された」パイプライン形式と呼ばれる古いものに基づいています。 「宣言パイプライン」を使用する場合、並列ブロックをステージブロック内にネストできます( 宣言パイプライン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」タスクは並列で実行されますが、並列ステージはすぐに終了し、それらに含まれるべきものは組み込まれません。結果として、ステージビューには正しい結果が表示されず、ログもリンクされません。

異なるステージを並行して構築できますか、または「並行」ステップは単一のステージ内でのみ使用することを意図していますか?

41
ami

非推奨の非ブロックスコープstage(元の質問のように)をparallel内に配置することはできません。

JENKINS-26107 の時点で、stageはブロック引数を取ります。 parallelstageの中に入れたり、stageparallelの中に入れたり、stagestageの中に入れたりすることができます。すべてのネスト;特に

  • ビルトインパイプラインステップ(ビルドによって実行されるすべてのステップをリストする「ツリーテーブル」)は、任意のstageネスティングを示します。
  • Pipeline Stage Viewプラグイン は現在、ネスト構造に関係なく、開始した順番でステージの線形リストのみを表示します。
  • ブルーオーシャン は、トップレベルステージ、およびトップレベルステージ内のparallelブランチを表示しますが、現在は表示しません。

JENKINS-27394 は、実装されている場合、任意にネストされたstagesを表示します。

49
Jesse Glick

その構文は非推奨になりました。このエラーが発生します:

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には、プールとして使用するラベルを付ける必要があります。

15
PRF

私は次のパイプラインをテストしましたが、動作します

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」の例

  • 「環境」という名前の1つのパラメーター
  • パイプライン:echo "$ env.Environment-TEST1"

実行時に、両方のステージが同時に実行されているのを見ることができます

8
OlivierTerrien

これは現在公式に実装されていると思います: https://jenkins.io/blog/2017/09/25/declarative-1/

2
Quartz

@Quartzが述べたように、次のようなことができます

stage('Tests') {
    parallel(
        'Unit Tests': {
            container('node') {
                sh("npm test --cat=unit")
            }
        },
        'API Tests': {
            container('node') {
                sh("npm test --cat=acceptance")
            }
        }
    )
}
1
Anoop Philip