背景:パイプライン(以前のワークフロー)を最適化する方法に関するソリューションを探しています。
現在、それぞれ4つのエグゼキュータを使用して、2つのビルダーに分散されたいくつかの並列デプロイメントとテストを静かに実行しています。
パイプラインはGitプッシュによってトリガーされるため、後続のプッシュは複数のビルドをトリガーします。ステージの同時実行性を実験しました。1つのオプションは、後続のビルドによってステップを適切にブロックしますが、その特定のステージが完了すると開始されます。
質問:
これがベストプラクティスかどうかはわかりませんが、前のビルドが完了するまで、新しいビルドを実行しない方がよいように思われます。 (私たちがそれにリソースをコミットしたという事実からの理由であり、それが最新かつ最大のコミットでなくても、それは終了することを許可されるべきです)。
Q1:これはベストプラクティスでもありますか?
Q2:前のトリガービルドを実行したまま、新しいトリガービルドをプリエンプトするにはどうすればよいですか? (このジョブのビルドを繰り返して、新しいジョブを停止することを想像できます...)。
最初のステージの構成を参照してください[1]
[1]最初の段階。
stage name: 'Checkout and build WAR'
node {
def mvnHome = tool 'Maven 3.2.x'
checkout([$class : 'GitSCM',
poll : true,
branches : [[name: '*/master']],
doGenerateSubmoduleConfigurations: false,
extensions : [[$class : 'RelativeTargetDirectory',
relativeTargetDir: 'checkout-directory']],
submoduleCfg : [],
userRemoteConfigs : [[url: 'https://some.repo/repo.git']]])
// Archive the cloned repo.
stash name: 'src', includes: 'checkout-directory/war/src/, checkout-directory/war/pom.xml'
// Run without tests, do the unit and integration tests in a separate stage.
sh "${mvnHome}/bin/mvn -f checkout-directory clean install -DskipTests"
// Archive the application build.
stash name: 'war', includes: 'checkout-directory/war/target/*.war'
}
ジョブのconfiguration
から、次の設定を行うことができます。
設定されている場合、新しくスケジュールされたビルドは、実際にビルドされる前にこの秒数待機します。これは次の場合に役立ちます。
- 複数のCVS変更通知電子メールを1つに折りたたむ(一部のCVS変更ログ電子メール生成スクリプトは、コミットがディレクトリにまたがる場合、複数の電子メールをすばやく連続して生成します)。
- コーディングスタイルが、いくつかのcvs/svn操作で1つの論理的な変更をコミットするようなものである場合、より長いクワイエット期間を設定すると、Jenkinsがそれを時期尚早に構築して失敗を報告するのを防ぐことができます。
- スロットリングビルド。 Jenkinsのインストールがビジーでビルドが多すぎる場合は、クワイエット期間を長く設定すると、ビルドの数を減らすことができます。
プロジェクトレベルで明示的に設定されていない場合は、システム全体のデフォルト値が使用されます。
はどうかと言うと jenkins-pipeline
DSL this article 質問に答えてください:
デフォルトでは、パイプラインビルドは同時に実行できます。 stageコマンドを使用すると、ビルドの特定のセクションを、制限された同時実行性によって制約されている(または後で制約されていない)ものとしてマークできます。このような抑制された段階に入るときは、常に新しいビルドが優先されます。古いビルドは、事前に設定されている場合、単に早期に終了します。
プロパティを介してジョブ構成を使用するのが最もクリーンな方法のようです。