共有リソース(データベース)を使用するジョブがいくつかあります。これにより、ジョブが同時にトリガーされる(まれな)イベントでビルドが失敗することがあります。
たとえば、ジョブAからEが与えられた場合、AとCを指定する方法はありますか同時に実行されることはありません?
前述のリソース以外に、ビルドは互いに独立しています(たとえば、アップストリーム/ダウンストリームの関係ではありません)。
「強引な」方法では、エグゼキューターの数を1つに制限しますが、ほとんどのジョブを同時に実行でき、ビルドサーバーにコンピューティングリソースが不足していない場合、明らかに理想的ではありません。
現在、これを行うには2つの方法があります。
Locks and Latchesプラグイン here が役立つはずです。
それは古い質問ですが、特にJenkinsでアプリケーションテストを実行する場合、トピックは依然として関連する可能性があります。
Lockable Resources Plugin を使用すると、ビルドで使用できるロック可能なリソースを定義できます。ビルドにリソースが必要な場合は、ロックがかかります。 2番目のビルドで同じリソース(既にロックされている)が必要な場合、リソースが解放されるまでキューに入れられます。
ドキュメントでは、ロック可能なリソースの例としてコンピューターまたはプリンターを使用していますが、上記のデータベースの例も同様に機能するはずです。
2012年からの回答で言及されている Locks and Latches Plugin とは反対に、このパッケージは現在維持されているようです(現在〜2016)。
External Resource Dispatcher Jenkinsプラグインをご覧ください。これは2012年11月に最初に公開されました。この(比較的)新しいプラグインは、このユースケースを正確にカバーしているようです。
N.B.スレーブ/ノードに物理ハードウェアや仮想ハードウェアは必要ありません。マスターサーバーで実行される「スレーブ」を設定できます。
Jenkinsの管理>ノードの管理>新しいノード
それぞれ独自のルートディレクトリを持つ「ダムスレーブ」を作成します。
いくつかのスレーブを作成し、サーバーの起動時にそれらを実行すると、基本的にエグゼキューターのプールが作成されます。
あなたが言うかもしれない...
db-あなたのケースでは唯一のエグゼキューター。コンパイル-ハードウェアまたはCPUの数に応じて制限します。スクリプト-Jenkinsが得意とする小さな仕事すべてに多くのエグゼキューターがいます。
古い質問と、これがアプリケーションで機能するかどうかは、アプリケーションの詳細について言及していなかったためわかりません。ただし、これを処理する方法を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