web-dev-qa-db-ja.com

Jenkinsパイプラインを使用したマトリックス構成

Jenkins Pipelineプラグイン(別名Workflow)は、他のMultibranchプラグインで拡張して、ブランチを構築し、リクエストを自動的にプルすることができます。

複数の構成を実行する好ましい方法は何ですか?たとえば、Java 7およびJava 8でビルドします。これは、多くの場合、マトリックス構成と呼ばれます。 ..)またはバリアントを作成します。

私は試した:

  • それらを個別のstageステップとして連続して実行します。良いですが、必要以上に時間がかかります。
  • parallelステップ内で実行し、nodesを内部または外部に割り当てます。動作しますが、stageステップを並列で使用して、視覚化方法の既知の制限を使用することはできません。

これを行うための推奨される方法はありますか?

26
giorgiosironi

少なくとも BlueOcean UI には、安心感があるようです。ここに私が得たものがあります(tk-*ノードは並列ステップです):

enter image description here

1
StephenKing

TLDR: Jenkins.io は、ビルドごとにnodesを使用することを望んでいます。

Jenkins.io:パイプラインコーディングコンテキストでは、「ノード」は、エージェントで利用可能なエグゼキューターからのヘルプを参加させることにより、2つのことを行うステップです。

  1. Jenkinsビルドキューに追加することで、その中に含まれるステップを実行するようにスケジュールします(ノードでエグゼキュータースロットが空くとすぐに、適切なステップが実行されます)

  2. ステージ内のノードブロックはJenkinsに、その中のステップが十分にリソースを消費することを伝えるため、シェルスクリプトの構築や実行など、すべての重要な作業をノード内で行うことをお勧めしますスケジュールされ、エージェントプールにヘルプを要求し、必要な場合にのみワークスペースをロックします。

Vanilla Jenkins Nodeステージ内のブロックは次のようになります。

stage 'build' {
    node('Java7-build'){ ... }
    node('Java8-build'){ ... }
}

この概念をさらに拡張するために、Cloudbeesは Jenkinsとの並列処理および分散ビルド について書いています。 Cloudbeesのワークフローは次のようになります。

stage 'build' {
    parallel 'Java7-build':{
      node('mvn-Java7'){ ... }
    }, 'Java8-build':{
      node('mvn-Java8'){ ... }
    }
}

パイプラインのさまざまなビルドを視覚化するための要件はどちらのワークフローでも満たすことができますが、ベストプラクティスについてはJenkinsのドキュメントを信頼しています。


編集

視覚化に対処するために @ Stephen は見たいと思います、彼は正しいです-それは動作しません!この問題はJenkinsで提起されており、 ここに文書化されています 、「ラベル付きブロック」の使用を含む解決策は まだ進行中 :-(

Q:パイプラインのユーザーが並列ステップの内部にステージを置かないようにするドキュメントはありますか?

A:いいえ、これが行われた場合、これは誤った使用法と見なされます。ステージは、パイプラインの最上位の構造体としてのみ有効です。そのため、ラベル付きブロックが別の構造体として認識されるようになりました...そして、それによって、パイプライン内の並列ステップからステージを削除することを意味します。

並列ジョブでステージを使用しようとすると、悪い時間を過ごすことになります。

ERROR: The ‘stage’ step must not be used inside a ‘parallel’ block.
15
Stefan Crain

いくつかのプラットフォームで各コミットをテストするために、このベースのJenkinsfileスケルトンを使用しました:

def test_platform(label, with_stages = false)
{
    node(label)
    {
        // Checkout
        if (with_stages) stage label + ' Checkout'
        ...

        // Build
        if (with_stages) stage label + ' Build'
        ...

        // Tests
        if (with_stages) stage label + ' Tests'
        ...
    }
}

/*
parallel ( failFast: false,
    Windows: { test_platform("Windows") },
    Linux:   { test_platform("Linux")   },
    Mac:     { test_platform("Mac")     },
)
*/

test_platform("Windows", true)
test_platform("Mac",     true)
test_platform("Linux",   true)

これにより、順次実行から並列実行への切り替えが比較的簡単になり、それぞれに長所と短所があります。

  • 並列実行ははるかに高速ですが、ステージのラベル付けは含まれていません
  • 順次実行ははるかに遅くなりますが、「Windows Checkout」、「Windows Build」、「Windows Tests」、「Mac Checkout」などのラベルが付いたステージのおかげで詳細なレポートを取得できます。

より良い解決策が見つかるまで、当面は順次実行を使用します。

2

@StephenKingが指摘したように、Blue Oceanは現在のステージビューよりも並列分岐をよりよく表示します。ステージビューの予定されているバージョンでは、すべてのブランチを表示できますが、ネスト構造は視覚的に示されません(構成を連続して実行した場合と同じように見えます)。

いずれにしても、より深い問題は、基本的にビルド全体の成功/失敗ステータスのみを取得し、 JENKINS-27395 および関連するリクエストの解決を保留することです。

2
Jesse Glick