2017-06-03 67 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中的更改,應該啓動另一個生成。任何其他想法? –