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