2012-12-20 70 views
5

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

+0

禁用触发器? –

+0

通常不会有另一份工作在运行,触发器可以启动工作,但如果有工作,我不希望工作排队,这一切都发生在晚上。 – user1904898

+0

它是什么样的触发器? –

回答

1

如果每个只有一个构建配置,则可以在同一个代理上运行它们,这样只有一个可以同时运行。但是,build 2会在build 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 
} 

确保构建设置为仅在运行,并构建将删除,如果它的文件存在。我们打电话给build 解锁

很酷,现在我们可以运行来写这个文件,并且解锁来删除它。如果您运行两次没有运行解锁,第一次运行会通过,第二次将失败。尼斯。

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

如果您的构建是一组构建配置,则您的构建内部需要通过快照依赖关系进行连接,而不是完成构建触发器。假设您的构建是两种构建配置:工作-A工作-B。您首先要运行work-A,然后完成时,work-B。像往常一样设置快照相关性从work-Bwork-A。然后,在解锁上设置完成生成触发器,当锁定通过时触发。设置快照依赖从解锁工作-B,设置为“运行构建即使依赖失败这里的构建,其中向下的箭头是完成构建触发器的图,向上的箭头是快照的依赖。

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

现在,当你打“运行”,将锁定身材,触发生成配置,然后解锁版本。点击“运行”一堆倍,既没有看到如何工作 - Awork-B排队等候

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

耶!我们完成了!但是请等待,为什么工作-A工作-B需要通过快照依赖关系连接?好吧,让我们说构建如下:

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

现在,如果有什么工作-A失败? work-B不会运行,所以也不会解锁

注:从理论上说,可以按如下方式运行构建:

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

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

+0

谢谢你在这里所有的方向,我会试试这个,并会在这里回应我的结果。 – user1904898

0

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

如果这两个工作是彼此不相关的,也许你可以配置它们在不同的代理上运行?这样他们可以在不干扰彼此的情况下运行。

+0

这两个工作会互相干扰,所以我不能让他们一起跑。感谢您的关注。 – user1904898