web-dev-qa-db-ja.com

特定のJenkinsジョブが同時に実行されるのを防ぐ方法は?

共有リソース(データベース)を使用するジョブがいくつかあります。これにより、ジョブが同時にトリガーされる(まれな)イベントでビルドが失敗することがあります。

たとえば、ジョブAからEが与えられた場合、AとCを指定する方法はありますか同時に実行されることはありません

前述のリソース以外に、ビルドは互いに独立しています(たとえば、アップストリーム/ダウンストリームの関係ではありません)。

「強引な」方法では、エグゼキューターの数を1つに制限しますが、ほとんどのジョブを同時に実行でき、ビルドサーバーにコンピューティングリソースが不足していない場合、明らかに理想的ではありません。

60
Jonik

現在、これを行うには2つの方法があります。

  • Throttle Concurrent Builds プラグインを使用します。
  • エグゼキュータが1つしかないスレーブで実行するようにこれらのジョブを設定します。
39
sti

Locks and Latchesプラグイン here が役立つはずです。

この質問はおそらく Hudsonで特定のカテゴリのジョブの1つだけが一度に実行されるようにする方法は?

14
pwan

それは古い質問ですが、特にJenkinsでアプリケーションテストを実行する場合、トピックは依然として関連する可能性があります。

Lockable Resources Plugin を使用すると、ビルドで使用できるロック可能なリソースを定義できます。ビルドにリソースが必要な場合は、ロックがかかります。 2番目のビルドで同じリソース(既にロックされている)が必要な場合、リソースが解放されるまでキューに入れられます。

ドキュメントでは、ロック可能なリソースの例としてコンピューターまたはプリンターを使用していますが、上記のデータベースの例も同様に機能するはずです。

2012年からの回答で言及されている Locks and Latches Plugin とは反対に、このパッケージは現在維持されているようです(現在〜2016)。

4

External Resource Dispatcher Jenkinsプラグインをご覧ください。これは2012年11月に最初に公開されました。この(比較的)新しいプラグインは、このユースケースを正確にカバーしているようです。

2
Marnix Klooster

N.B.スレーブ/ノードに物理ハードウェアや仮想ハードウェアは必要ありません。マスターサーバーで実行される「スレーブ」を設定できます。

Jenkinsの管理>ノードの管理>新しいノード

それぞれ独自のルートディレクトリを持つ「ダムスレーブ」を作成します。

いくつかのスレーブを作成し、サーバーの起動時にそれらを実行すると、基本的にエグゼキューターのプールが作成されます。

あなたが言うかもしれない...

db-あなたのケースでは唯一のエグゼキューター。コンパイル-ハードウェアまたはCPUの数に応じて制限します。スクリプト-Jenkinsが得意とする小さな仕事すべてに多くのエグゼキューターがいます。

0
teknopaul

古い質問と、これがアプリケーションで機能するかどうかは、アプリケーションの詳細について言及していなかったためわかりません。ただし、これを処理する方法をRailsアプリケーションテストスイートに追加しました。

アプリケーションのデータベース構成(database.yml)はソースリポジトリにありません。代わりに、/var/lib/configs/uniquing_database.yml VMでJenkinsインスタンスを実行します。

ビルドプロセスの手順の1つでは、この構成ファイルをプロジェクトワークスペースにコピーします。

cp /var/lib/jenkins/configs/myapp_unique_database.yml config/database.yml

そして、その設定は、Jenkinsによって環境に公開されたワークスペースとビルド番号の情報を考慮して、そのジョブとその特定の実行のために一意の名前のデータベースを作成します。

test:
  adapter: postgresql
  encoding: unicode
  Host: 127.0.0.1
  port: 5432
  database: myapp_test<%= ENV['JOB_NAME'].split('/').last %><%= ENV['BUILD_NUMBER'] %>

ビルドの残りの部分は、別個のデータベースで実行されていることを知らず、気にせずに続行します。最後に、ビルドの最後に、そのデータベースを必ず削除して、ファイルシステムを汚染する多数のテストデータベースがないようにします。

Rails_ENV=test bundle exec rake db:drop
0
Yoopergeek