禁用TeamCity构建排队

use*_*898 6 queue teamcity

是否可以禁用TeamCity中的构建排队?如果作业已在运行,我不希望另一个作业排队(例如,如果由触发器启动).我做了一些搜索,但没有办法阻止排队.

zck*_*zck 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
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-Awork-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-Awork-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)

这应该可行,但我还没有测试过,所以我不能给你所有的设置。