queue - 禁用 TeamCity 构建队列

标签 queue teamcity

是否可以禁用 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

对于 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
}

并确保build设置为仅在门代理上运行。所以这个构建只有在它从未运行过的情况下才会成功。还没有用。我们称之为构建锁。使用以下内容进行新的构建配置:
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
}

确保将build设置为仅在门上运行,并且该构建将删除该文件(如果存在)。让我们调用构建解锁。

酷,现在我们可以运行 lock 来写入文件,和 unlock 来删除它。如果你运行 lock 两次而没有运行 unlock,那么第一次运行 lock 会通过,第二次会失败。好的。

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

如果您的构建是一组构建配置,则您的构建内部需要通过快照依赖项进行连接,而不是完成构建触发器。假设您的构建是两个构建配置:work-A 和 work-B。您想先运行工作-A,然后在完成后运行工作-B。像往常一样设置从 work-B 到 work-A 的快照依赖项。然后,在解锁时设置完成构建触发器,在锁定通过时触发。将一个快照依赖从unlock设置为work-B,设置为“run build even if dependency has failed。这是构建图,向下箭头是完成构建触发器,向上箭头是快照依赖:
+----+                           
|lock|                           
+----+  +------+                 
  |     |work-A|                 
  |     +------+                 
  |        ^                     
  |        |                     
  |        |                      
   \   +------+                  
    \  |work-B|                  
     \ +------+                  
      \   ^                      
       \  |                      
        v |                      
       +------+                  
       |unlock|                  
       +------+                  

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

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

好极了!我们完成了!但是等等,为什么 work-A 和 work-B 需要通过快照依赖连接?好吧,假设构建如下:
+----+
|lock|
+----+
   |
   |
   v
+------+ 
|work-A|
+------+
   |
   |
   v             
+------+
|work-B|
+------+
   |
   |
   v
+------+
|unlock|
+------+

现在,如果工作 A 失败了怎么办? work-B 不会运行,因此也不会解锁。

注意:理论上,您可以按如下方式运行构建:
+----+        
|lock|        
+----+  +------+
   \    |work-A|
    \   +------+
     \     ^
      \    |
       v   |
      +------+
      |work-B|
      +------+
         |    
         |    
         v   
      +------+
      |unlock|
      +------+

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

关于queue - 禁用 TeamCity 构建队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13980006/

相关文章:

grails - Grails JMS队列注释失败,带有最终参数

Android 上的 Java : Does adding item to ConcurrentLinkedQueue copy it

java - 理解同步和实现队列

java - Teamcity - 内部版本号 - 传递到 ant 脚本

java - TeamCity:此处不允许使用脚本元素 jsp:declaration、jsp:expression、jsp:scriptlet

android - 在 TeamCity 上使用 kotlin 编译 android 项目失败

c++ - 实现队列的有效方法是什么?

c# - 是否有像 Queue 这样的 C# 类实现 IAsyncEnumerable?

c# - TeamCity 代码覆盖率意外结果

java - Spring 配置更改触发 TeamCity 构建?