TeamCityのビルドでキューイングを無効にすることは可能ですか?ジョブがすでに実行されている場合、別のジョブをキューに入れたくありません(たとえば、トリガーによって開始された場合)。私はいくつかの検索を行いましたが、キューイングを防ぐ方法がわかりません。
2 に答える
それぞれが1つのビルド構成しかない場合は、同じエージェントで実行できるため、同時に実行できるのは1つだけです。ただし、ビルド2は、ビルド1の終了後に実行されますが、これは望ましくありません。
これが私がこの問題を解決した方法です。ちょっと醜いですが、シンプルで、多くのビルド構成に一般化されています。
特定のサーバーを選択します。このサーバーはビルドが実行されるかどうかを決定するため、これをゲートサーバーと呼びます。現在存在していないファイルの場所が必要であり、他のプログラムによって作成されることもありません。たとえば、「/ teamcity/.lock」と言います。
次の内容でビルド構成を作成します。
lockFileLocation="/teamcity/.lock"
if [ -f $lockFileLocation ];
then
echo "oops, we're already running a build."
exit 1
else
echo "No build is running. Let's lock it up!"
touch $lockFileLocation
fi
Powershellの場合、これは次のとおりです。
$lockFileLocation = "C:\teamcity\lock"
if(Test-Path $lockFileLocation)
{
echo "oops, we're already running a build."
exit 1
}
else
{
echo "No build is running. Let's lock it up!"
echo "lock'd!" > $lockFileLocation
}
また、ビルドがゲートエージェントでのみ実行されるように設定されていることを確認してください。したがって、このビルドは、実行されたことがない場合にのみ成功します。まだ役に立ちません。このビルドロックと呼びましょう。次の内容で新しいビルド構成を作成します。
lockFileLocation="/teamcity/.lock"
if [ -f $lockFileLocation ];
then
echo "Build's over. You don't have to do home, but you can't stay here"
rm $lockFileLocation
else
echo "No build is running. How did we get here?"
exit 1
fi
Powershellの場合:
$lockFileLocation = "C:\teamcity\lock"
if(Test-Path $lockFileLocation)
{
echo "Build's over. You don't have to do home, but you can't stay here"
rm "$lockFileLocation"
}
else
{
echo "No build is running. How did we get here?"
exit 1
}
ビルドがゲートでのみ実行されるように設定されていることを確認してください。ビルドが存在する場合は、ファイルが削除されます。ビルドロック解除と呼びましょう。
これで、ロックを実行してファイルを書き込み、ロックを解除してファイルを削除できます。ロック解除を実行せずにロックを2回実行すると、最初のロックの実行は成功し、2回目の実行は失敗します。良い。
しかし、これはどのように役立ちますか?ビルドがworkと呼ばれる単一のビルド構成であるとしましょう。ロックが成功した後に実行されるように、作業に終了ビルドトリガーを設定します。同様に、ロック解除時に終了ビルドトリガーを設定して、作業が成功したか失敗したかに関係なく、作業の終了後に実行されるようにします。悪いコードをコミットした場合でも、ビルドのロックを解除したいと思います。
ビルドがビルド構成のセットである場合、ビルドは、ビルドトリガーを終了するのではなく、スナップショットの依存関係を介して内部的に接続する必要があります。ビルドがwork-Aとwork-Bの2つのビルド構成であるとします。最初にwork-Aを実行し、次にそれが完了したら、work-Bを実行します。通常どおり、スナップショットの依存関係をwork-Bからwork-Aに設定します。次に、ロックが通過したときにトリガーされるロック解除時にビルド終了トリガーを設定します。ロック解除からwork-Bへのスナップショットの依存関係を設定します、「依存関係が失敗した場合でもビルドを実行する」に設定します。ビルドの図を次に示します。下向き矢印はビルドの終了トリガーであり、上向き矢印はスナップショットの依存関係です。
+----+
|lock|
+----+ +------+
| |work-A|
| +------+
| ^
| |
| |
\ +------+
\ |work-B|
\ +------+
\ ^
\ |
v |
+------+
|unlock|
+------+
これで、ロックで「実行」を押すと、ビルドがロックされ、ビルド構成がトリガーされてから、ビルドのロックが解除されます。何度も「実行」を押して、work-Aもwork-Bもキューに入れられないことを確認してください。
しかし、それはビルド構成の1つのセットにすぎません。2つあります。したがって、両方をこのように設定し、同じファイルを参照し、両方がゲートエージェントでのみ実行されるように設定されていることを確認します。
わーい!終わったね!しかし、待ってください。なぜwork-Aとwork-Bをスナップショットの依存関係を介して接続する必要があるのでしょうか。さて、ビルドが次のようになっているとしましょう:
+----+
|lock|
+----+
|
|
v
+------+
|work-A|
+------+
|
|
v
+------+
|work-B|
+------+
|
|
v
+------+
|unlock|
+------+
では、work-Aが失敗した場合はどうなりますか?work-Bは実行されないため、どちらもロックを解除しません。
注:理論的には、次のようにビルドを実行できます。
+----+
|lock|
+----+ +------+
\ |work-A|
\ +------+
\ ^
\ |
v |
+------+
|work-B|
+------+
|
|
v
+------+
|unlock|
+------+
これは機能するはずですが、私はそれをテストしていないので、すべての設定を提供することはできません。
トリガーを動的に無効にしたり、別のビルドのステータスに基づいて1つのビルドを条件付きで実行したりする方法が見つかりません。
これらの2つのジョブが互いに関連していない場合は、別々のエージェントで実行するように構成できますか?そうすれば、お互いに干渉することなく走ることができます。