最速のフィードバックを得るために、Jenkinsのジョブを並行して実行したい場合があります。 Jenkinsには、ジョブが終了したときに複数のダウンストリームジョブ(またはパイプラインを「分岐」)を開始する機能があります。ただし、Jenkinsには、その分岐のすべてのブランチの開始のみをダウンストリームジョブで成功させる(または分岐を「結合」して戻す)方法はないようです。
Jenkinsには「他のプロジェクトのビルド後にビルド」ボタンがありますが、「any上流のジョブが終了したときにこのジョブを開始」と解釈します(「allのときにこのジョブを開始アップストリームジョブが成功します」)。
これが私が話していることの視覚化です。私がやりたいことをするプラグインが存在するかどうか誰もが知っていますか?
2012年にこの質問を最初に投稿したとき、Jasonの回答(JoinおよびPromoted Buildプラグイン)が最高で、私が一緒に行った解決策でした。
ただし、dnozayの回答(Build Flowプラグイン)は、この質問の1年ほど後に人気を博しました。価値があることについては、今日この質問をする人がいたら、代わりにそれをお勧めします。
過去にこのシナリオに使用した2つのソリューションがあります。
"deploy"ジョブで Join Plugin を使用し、ターゲットジョブとして "promote"を指定します。結合されたジョブとして「機能テスト」と「パフォーマンステスト」を指定し、ビルド後、何らかの方法でそれらを開始する必要があります。 Parameterized Trigger Plugin はこれに適しています。
「デプロイ」ジョブで Promoted Builds Plugin を使用し、ダウンストリームジョブが完了したときに機能するプロモーションを指定し、機能およびパフォーマンステストジョブを指定します。プロモーションアクションの一部として、「プロモーション」ジョブをトリガーします。あなたはまだ「デプロイ」から2つのテストジョブを開始する必要があります
これらの両方のソリューションには重大な側面があります。指紋を正しく使用する必要があります。ここに私が見つけたものがあります:
パイプラインプラグイン (以前の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 を使用することもできます。それは単に素晴らしいです-しかし、それは非推奨です(開発凍結)。
次のジョブを作成します。
アップストリーム(ここではbuild
)で一意のアーティファクトを作成します。例:
echo ${BUILD_TAG} > build.tag
build.tag
アーティファクトをアーカイブします。
build.tag
ファイルをコピーして指紋を記録する場合、親を追跡できます。promotion
ジョブが成功したときに昇格するように構成します。PARENT_JOB_NAME
およびPARENT_BUILD_NUMBER
を使用しますArtifactプラグインのコピー を使用して、アップストリームbuild
ジョブからアーティファクトをコピーします
${PARENT_JOB_NAME}
${PARENT_BUILD_NUMBER}
build.tag
指紋を記録します。それは重要です。
上と同じようにして、アップストリームとダウンストリームの関係を確立します。ビルド手順は必要ありません。 「ちょっと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)
幸運を。
Jenkins最近 発表済み ワークフローのファーストクラスサポート。
Multijobプラグイン は、そのシナリオで美しく機能します。また、単一の「親」ジョブで複数の「子」ジョブを開始したいが、それでも各子を手動で手動で実行できるようにする場合に便利です。これは、1〜n個のジョブを追加する「フェーズ」を作成することで機能します。ビルドはフェーズ全体が完了したときにのみ継続されるため、複数のジョブとしてのフェーズが完了すると、残りを実行する前にすべてが完了する必要があります。当然、フェーズ内で障害が発生した場合にビルドを続行するかどうかは構成可能です。
Jason&dnozayの回答で十分です。しかし、誰かが簡単な方法を探している場合は、単に JobFanIn plugin を使用してください。
ワークフロープラグインは パイプラインプラグイン と呼ばれ、ビルドフロープラグインに触発された元の質問に対する(現在の)推奨ソリューションであると思います。 GitHubには Getting Started Tutorial もあります。