禁用TeamCity构建排队

时间:2012-12-20 20:30:16

标签: queue teamcity

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

2 个答案:

答案 0 :(得分:1)

如果每个只有一个构建配置,您可以在同一个代理上运行它们,这样只有一个可以同时运行。但是,构建2将在构建1完成后运行,这是您不想要的。

以下是我解决这个问题的方法。它有点难看,但它很简单,并且可以概括为许多构建配置:

选择特定服务器。由于此服务器将确定是否运行构建,因此我们将其称为 gate 服务器。我们需要一个现在不存在的文件位置,也不会被任何其他程序创建。比方说,例如,`/teccity/.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
}

确保将构建设置为仅在 gate 代理上运行。所以这个构建只有在没有运行的情况下才会成功。还没用。我们称这个构建。使用以下内容创建新的构建配置:

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 两次,则第一次运行 lock 将通过,第二次运行将失败。好的。

但这对我们有什么帮助?假设您的构建是一个名为 work 的构建配置。在 work 上设置完成构建触发器,以便在 lock 成功后运行。同样,在 unlock 上设置完成构建触发器,使其在工作完成后运行,是否通过。即使您提交了错误的代码,我们也希望解锁构建。

如果您的构建是一组构建配置,则内部构建需要通过快照依赖关系连接,而不是完成构建触发器。假设您的构建是两个构建配置: work-A work-B 。您希望首先运行 work-A ,然后在完成后运行 work-B 。像往常一样,将 work-B 的快照依赖关系设置为 work-A 。然后,在 lock 上设置完成构建触发器,该触发器在 lock 通过时触发。设置从解锁 work-B 的快照依赖关系,设置为“即使依赖关系失败也运行构建。这是构建的图形,其中向下箭头是完成构建触发器,向上箭头是快照依赖项:

+----+                           
|lock|                           
+----+  +------+                 
  |     |work-A|                 
  |     +------+                 
  |        ^                     
  |        |                     
  |        |                      
   \   +------+                  
    \  |work-B|                  
     \ +------+                  
      \   ^                      
       \  |                      
        v |                      
       +------+                  
       |unlock|                  
       +------+                  

现在,当您在 lock 上点击“run”时,它将锁定构建,触发构建配置,然后解锁构建。点击“运行”很多次,看看 work-A work-B 是如何排队的。

但这只是一组构建配置。你有两个。因此,以这种方式设置它们,确保它们查看相同的文件,并且都设置为仅在 gate 代理上运行。

耶!我们完成了!但是等等,为什么 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 :(得分:0)

我无法找到一种方法来动态禁用触发器或根据另一个构建器的状态有条件地运行一个构建。

如果这两个作业彼此无关,也许您可​​以将它们配置为在不同的代理上运行?这样他们就可以在不互相干扰的情况下奔跑。