web-dev-qa-db-ja.com

複数の同時アップストリームジョブが成功した後にJenkinsジョブを開始するにはどうすればよいですか?

最速のフィードバックを得るために、Jenkinsのジョブを並行して実行したい場合があります。 Jenkinsには、ジョブが終了したときに複数のダウンストリームジョブ(またはパイプラインを「分岐」)を開始する機能があります。ただし、Jenkinsには、その分岐のすべてのブランチの開始のみをダウンストリームジョブで成功させる(または分岐を「結合」して戻す)方法はないようです。

Jenkinsには「他のプロジェクトのビルド後にビルド」ボタンがありますが、「any上流のジョブが終了したときにこのジョブを開始」と解釈します(「allのときにこのジョブを開始アップストリームジョブが成功します」)。

これが私が話していることの視覚化です。私がやりたいことをするプラグインが存在するかどうか誰もが知っていますか? Build Pipeline


編集:

2012年にこの質問を最初に投稿したとき、Jasonの回答(JoinおよびPromoted Buildプラグイン)が最高で、私が一緒に行った解決策でした。

ただし、dnozayの回答(Build Flowプラグイン)は、この質問の1年ほど後に人気を博しました。価値があることについては、今日この質問をする人がいたら、代わりにそれをお勧めします。

70
Jay Spang

過去にこのシナリオに使用した2つのソリューションがあります。

  1. "deploy"ジョブで Join Plugin を使用し、ターゲットジョブとして "promote"を指定します。結合されたジョブとして「機能テスト」と「パフォーマンステスト」を指定し、ビルド後、何らかの方法でそれらを開始する必要があります。 Parameterized Trigger Plugin はこれに適しています。

  2. 「デプロイ」ジョブで Promoted Builds Plugin を使用し、ダウンストリームジョブが完了したときに機能するプロモーションを指定し、機能およびパフォーマンステストジョブを指定します。プロモーションアクションの一部として、「プロモーション」ジョブをトリガーします。あなたはまだ「デプロイ」から2つのテストジョブを開始する必要があります

これらの両方のソリューションには重大な側面があります。指紋を正しく使用する必要があります。ここに私が見つけたものがあります:

  1. 「ビルド」ジョブは、新しいフィンガープリントファイルを作成する必要があります。言い換えれば、ジェンキンスが最初の仕事から生まれたと考えているファイルをフィンガープリントする必要があります。これを確認するには、ジョブの「指紋を見る」リンクを再確認してください。
  2. すべてのダウンストリームリンクジョブ(この場合、「展開」、「機能テスト」、および「パフォーマンステスト」)は、この同じファイルを取得してフィンガープリントする必要があります。 Copy Artifactsプラグインは、この種のものに最適です。
  3. 一部のプラグインでは、フィンガープリントとダウンストリームジョブの開始順序を変更できることに注意してください。この場合、フィンガープリントのオリジネーションが適切に設定されるように、ダウンストリームジョブが同じファイルをフィンガープリントする前にフィンガープリントを行わなければなりません。
27
Jason Swager

パイプラインプラグイン

パイプラインプラグイン (以前のworkflow-plugin)を使用できます。

多くの例 が付属しており、この tutorial に従うことができます。

例えば.

// build
stage 'build'
...

// deploy
stage 'deploy'
...

// run tests in parallel
stage 'test'
parallel 'functional': {
  ...
}, 'performance': {
  ...
}

// promote artifacts
stage 'promote'
...

ビルドフロープラグイン

Build Flow Plugin を使用することもできます。それは単に素晴らしいです-しかし、それは非推奨です(開発凍結)。

ジョブを設定する

次のジョブを作成します。

  • 建てる
  • 配備する
  • 性能試験
  • 機能テスト
  • 昇進

アップストリームのセットアップ

  1. アップストリーム(ここではbuild)で一意のアーティファクトを作成します。例:

    echo ${BUILD_TAG} > build.tag
    
  2. build.tagアーティファクトをアーカイブします。

  3. ファイルの使用状況を追跡するために指紋を記録します。いずれかのジョブが同じbuild.tagファイルをコピーして指紋を記録する場合、親を追跡できます。
  4. promotionジョブが成功したときに昇格するように構成します。

ダウンストリームジョブのセットアップ

  1. 2つのパラメーターPARENT_JOB_NAMEおよびPARENT_BUILD_NUMBERを使用します
  2. Artifactプラグインのコピー を使用して、アップストリームbuildジョブからアーティファクトをコピーします

    • プロジェクト名= ${PARENT_JOB_NAME}
    • どのビルド= ${PARENT_BUILD_NUMBER}
    • コピーするアーティファクト= build.tag
  3. 指紋を記録します。それは重要です。

ダウンストリームプロモーションジョブのセットアップ

上と同じようにして、アップストリームとダウンストリームの関係を確立します。ビルド手順は必要ありません。 「ちょっとQA、あなたの番です」のような追加のビルド後アクションを実行できます。

ビルドフロージョブを作成する

// start with the build
parent = build("build")
parent_job_name = parent.environment["JOB_NAME"]
parent_build_number = parent.environment["BUILD_NUMBER"]

// then deploy
build("deploy")

// then your qualifying tests
parallel (
    { build("functional tests",
          PARENT_BUILD_NUMBER: parent_build_number,
          PARENT_JOB_NAME: parent_job_name) },
    { build("performance tests",
          PARENT_BUILD_NUMBER: parent_build_number,
          PARENT_JOB_NAME: parent_job_name) }
)

// if nothing failed till now...
build("promotion",
    PARENT_BUILD_NUMBER: parent_build_number,
    PARENT_JOB_NAME: parent_job_name)

// knock yourself out...
build("more expensive QA tests",
    PARENT_BUILD_NUMBER: parent_build_number,
    PARENT_JOB_NAME: parent_job_name)

幸運を。

30
dnozay

Jenkins最近 発表済み ワークフローのファーストクラスサポート。

11
Andrew Gray

Multijobプラグイン は、そのシナリオで美しく機能します。また、単一の「親」ジョブで複数の「子」ジョブを開始したいが、それでも各子を手動で手動で実行できるようにする場合に便利です。これは、1〜n個のジョブを追加する「フェーズ」を作成することで機能します。ビルドはフェーズ全体が完了したときにのみ継続されるため、複数のジョブとしてのフェーズが完了すると、残りを実行する前にすべてが完了する必要があります。当然、フェーズ内で障害が発生した場合にビルドを続行するかどうかは構成可能です。

8
tbradt

Jason&dnozayの回答で十分です。しかし、誰かが簡単な方法を探している場合は、単に JobFanIn plugin を使用してください。

3
Yogesh

ワークフロープラグインは パイプラインプラグイン と呼ばれ、ビルドフロープラグインに触発された元の質問に対する(現在の)推奨ソリューションであると思います。 GitHubには Getting Started Tutorial もあります。

2
geipel