2017-06-03 116 views
1

这里的情况是:在混帐回购我有3个文件夹: 一个 乙 Ç 如果更改了A或C制成,建设必须启动。在其他情况下,如果对B进行了更改,则不应启动。如何使用TeamCity VCS触发器实现此类行为?的TeamCity - 如何结合VCS触发器

回答

-1

我没有找到方法来“防止从特定文件夹中发生更改时开始构建”。 Build将开始。但是,如果检测到B文件夹中的更改,我决定制定解决方法并跳过下一步的实际执行。下面是脚本,它为我提供了环境变量,可以优雅地避免下一个构建步骤的执行。

这个脚本是基于TeamCity的环境变量

%system.teamcity.build.changedFiles.file%

重要:不使用 - :B(在我的情况 - :LISP)触发规则,否则您将无法从脚本中检测到此文件夹中的更改。

脚本:

#!/bin/bash   
 

 
listFiles=$(echo %system.teamcity.build.changedFiles.file%) 
 
echo "List files from $listFiles" 
 
echo "--------------------------" 
 
cat $listFiles 
 
echo "--------------------------" 
 
lispFound=$(cat $listFiles | grep -c '^src\/lisp\/*.') 
 
echo "LISP CHANGES WERE DETECTED: $lispFound time(s)" 
 
echo "##teamcity[setParameter name='env.LISP_CHANGES_DETECTED' value ='$lispFound']"

结果,在%env.LISP_CHANGES_DETECTED%,其中已更改的文件数量将可在任何下一步。在我的情况下,下一步是Ant,并且可以在任何目标中检测是否应该回应“无所事事”并出去。下面是执行日志的exmple:

enter image description here

改进: 如这里所描述Can I cancel a TeamCity build from my msbuild script?

执行可以优雅地从一脚本停止,你将需要添加的呼叫取消执行:

curl -v -u user:password --request POST "http://teamcity:8111/app/rest/builds/<buildLocator>" --data "<buildCancelRequest comment='' readdIntoQueue='false' />" --header "Content-Type: application/xml"

1

您应该为该VCS根配置VCS触发器规则。 添加VCS触发as usual,然后添加这规则:

-:B/** 

这将触发对您的VCS根一切,除了文件夹。 或者你可以采取不同的方式,只为改变一个Ç文件夹触发构建:

+:A/** 
+:C/** 

,将工作,因为

当进入规则,请注意,一旦输入任何“+” 规则,TeamCity将删除默认的“包含全部”设置。要包含所有文件到 ,请使用“+:”。规则。

+0

这样的配置是否意味着如果在B和A中进行更改,它将不会被触发?实际上,我需要以某种方式配置,比如说规则,“如果B中有变化 - 不启动构建,无论发生什么变化在其他文件夹中“。 –

+0

如果在** A ** *和** ** B **中都发生变化,则Teamcity将触发构建。这是正确的,就像** A **包含一些源信息,应该构建,跳过它将是不正确的。 无论如何,你可以做的是: 1.按用户过滤:如果文件夹** B **将仅由bot用户修改,则可以像这样跳过它: - :user = bot-user ; root = VcsRootName:B/** 2.按评论过滤正则表达式: - :comment =自动生成,跳过构建:B/** – grundic

+0

没有这样的选项,不同的用户,不同的评论,但只有在文件夹B中没有更改。对于文件夹B中的更改,应该启动另一个生成。任何其他想法? –

相关问题