ジェンキンス&ビットバケット; 同じブランチに対して新しいコミットが行われた場合、以前のビルドをキャンセルしますか?


7

Jenkinsは、Bitbucketのリポジトリにコミットされたときにユニットテストを実行しています。これは、Bitbucketプラグインによって、つまりBitbucket Webhookを介して制御されます。

現在、ブランチAに対してコミットが行われると、ユニットテストが始まります。そのジョブの実行中に2番目のコミットがブランチAに対して行われた場合、2番目の単体テストが開始されるため、同じブランチに2つの単体テストがありますが、コードは少し異なります。

私たちが好む動作は、最初のコミットのテストが2番目のテストの開始時に中止されるため、最新の単体テストのみが実行されることです。これは達成できますか?

明確にするために; 多くのブランチがあるため、同時ビルドを防止したり、次の開始時に最後のビルドをキャンセルしたりすることはできません。どの方法を使用する場合でも、一般的にジョブがすでに実行されているかどうかではなく、ブランチがすでに実行されているかどうかを具体的に確認する必要がありますランニング。

Gitのトリガーコントロールはいくつか見ましたが、Bitbucketは見ていません。また、ジョブが既に実行されているかどうかを確認し、実行されている場合はキャンセルするスクリプトも見つけましたが、前述のとおり、これは私たちの使用例には適していません。何か不足していますか?


Bitbucket Branch Sourceプラグインを使用すると、Bitbucketプロジェクト内のリポジトリのすべてのブランチとPRに独自のJenkinsジョブがあり、そこからより最近のビルドが実行されているかどうかを簡単に確認できるため、これははるかに簡単になります。その場合は中止します。
jayhendren 2017

何か解決策を見つけましたか?特にbitbucketについては?
user43968

回答:


3

注:この回答は、カスタムソリューションの構築に関する私の背景に基づいています。構成のみのソリューションではなく、可能な場合は明らかに望ましいです。しかし、それは別の方法で検討する必要があるかもしれません。

単体テストジョブを実行するスクリプトに、ブランチごとの実行状態を維持するように教えることができます。

スクリプトが起動されると、その呼び出しパラメーターからブランチ名を取得する必要があります。次に、ブランチの永続化された状態を取得します。

状態が見つからないか、状態がにnot running設定されるrunning + job ID場合は、単体テストを実行してから状態をに設定not running(または削除)します。

状態がrunning + job ID別のユニットテストがすでに実行中であり、対応するジョブID があることを意味します。次に、スクリプトは(正常に?)既に実行中のジョブをIDで終了し、その場所に移動して、状態をに更新しrunning + new job IDます。

しかし、IMHOが進行中のジョブ(完了に非常に近い可能性があります)を終了することは理想的ではありません-絶えずジョブを殺したり、新しいジョブを起動したりするための余地があり、自分の順番で、後続のジョブによって殺されます-すべて実際に完了せずにそのうちの。

代わりに、ロジックを次のように変更します。

  • 進行中のジョブをそのままにして、代わりに永続化された状態で記録するa pending job ID(一意の値、送信された最新の保留中のジョブを反映するために上書きされるか、またはすべての保留中のジョブのリスト、送信時間でソート)
  • 進行中のジョブが完了するpending job IDと、値をチェックし、存在する場合は最新のジョブ(または最も古いジョブ、またはリストを使用している場合は他の選択ロジックに従う)を起動します。

このアプローチは、単体テストのリソースの浪費を回避し、複数のリソースが制限されている場合でも簡単に調整できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.