是否可以在 TeamCity 中禁用构建队列?如果一项作业已经在运行,我不希望另一个作业排队(例如,如果由触发器启动)。我已经进行了一些搜索,但没有找到防止排队的方法。
2 回答
如果每个只有一个构建配置,您可以在同一个代理上运行它们,这样只有一个可以同时运行。但是,构建 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
}
确保构建设置为仅在gate上运行,并且构建将删除该文件(如果存在)。让我们称之为构建解锁。
酷,现在我们可以运行lock来写入文件,并且unlock来删除它。如果你运行lock两次而不运行unlock,第一次运行lock将通过,第二次运行失败。好的。
但这对我们有什么帮助?假设您的构建是一个名为work的单一构建配置。在工作上设置完成构建触发器,以便它在锁定成功后运行。同样,在解锁时设置完成构建触发器,以便它在工作完成后运行,无论它是通过还是失败。即使您提交了错误的代码,我们也希望解锁构建。
如果您的构建是一组构建配置,则您的构建内部需要通过快照依赖项连接,而不是完成构建触发器。假设您的构建是两种构建配置:work-A和work-B。您想先运行work-A,然后在完成后运行work-B。像往常一样设置从工作 B到工作 A的快照依赖项。然后,在解锁时设置一个完成构建触发器,当锁定通过时触发。将快照依赖项从解锁设置为工作-B, 设置为“即使依赖失败也运行构建。这是构建图,其中向下的箭头是完成构建触发器,向上的箭头是快照依赖项:
+----+
|lock|
+----+ +------+
| |work-A|
| +------+
| ^
| |
| |
\ +------+
\ |work-B|
\ +------+
\ ^
\ |
v |
+------+
|unlock|
+------+
现在,当您在lock上点击“运行”时,它将锁定构建,触发您的构建配置,然后解锁构建。多次点击“运行”,看看work-A和work-B是如何排队的。
但这只是一组构建配置。你有两个。所以以这种方式设置它们,确保它们查看相同的文件,并且都设置为仅在网关代理上运行。
耶!我们完成了!但是等等,为什么work-A和work-B需要通过快照依赖关系连接?好吧,假设构建如下:
+----+
|lock|
+----+
|
|
v
+------+
|work-A|
+------+
|
|
v
+------+
|work-B|
+------+
|
|
v
+------+
|unlock|
+------+
现在,如果work-A失败了怎么办?work-B不会运行,因此也不会unlock。
注意:理论上,您可以按如下方式运行构建:
+----+
|lock|
+----+ +------+
\ |work-A|
\ +------+
\ ^
\ |
v |
+------+
|work-B|
+------+
|
|
v
+------+
|unlock|
+------+
这应该可以,但我还没有测试过,所以我不能给你所有的设置。
我找不到动态禁用触发器或根据另一个状态有条件地运行一个构建的方法。
如果这两个作业彼此无关,也许您可以将它们配置为在不同的代理上运行?这样他们就可以在不相互干扰的情况下运行。