2013-10-18 70 views
1

我正在使用TeamCity觸發器構建一切,只要在分支上提交了svn。一旦成功,它會發送一封電子郵件通知,其中包含導致此構建被觸發的VCS更改。從TeamCity的角度來看,這很好。使用NAnt從TeamCity獲取VCS更改

現在團隊中有多個成員沒有TC權限,無法設置通知。有了這個,我決定使用NAnt的<mail>發送此通知以及使用"${environment::get-variable('BUILD_NUMBER')}"的內部版本號。這在teamcity內正常工作。但是,我還需要發送觸發構建該電子郵件通知消息的更改。

目前的TeamCity格式化VSC變爲像這樣的電子郵件:

 Changes included (1 change). 
    Change 10433 by John Doe (4 files): Issue#245 - Issue description 

我期待生成的TeamCity使用南特同樣的變化。 TeamCity使用build_changes bean在common.flt文件中定義了此格式。

**Changes included (${changesLink}) 
    Change ${mod.displayVersion} ${pers} by ${mod.userName} (${modLink}): 
      <i>${description?trim}</i>** 

我該如何在我的NAnt消息中使用它?由於TeamCity已經知道什麼樣的svn更改觸發了構建,因此獲得此更改並將其添加到電子郵件的NANT郵件中會更好。有沒有簡單的方法來做到這一點?

回答

4

我從來沒有用過惡性但可以提供其他兩種解決方案...

1)創建一個電子郵件的郵件列表,並添加所有,它需要對列表中的人。

然後創建一個teamcity用戶,用它的電子郵件發送到郵件列表併爲該用戶設置所需的通知。

對此的限制是你必須創建一個用戶每個郵件列表,可以吃掉許可證。

2)您可以使用TeamCity REST API從正在運行的構建中獲取該信息。使用%teamcity.build.id%這將返回構建標識並執行以下查詢:

/httpAuth/app/rest/changes?build=id:%teamcity.build.id% 

將返回所有這些都會喜歡的變化爲構建:

<changes count="3"> 
    <change href="/httpAuth/app/rest/changes/id:217404" id="217404" version="b6b97a0d7789d97df6df908ab582ebb723235f43" webLink="http://teamcity.my-domain.com/viewModification.html?modId=217404&personal=false"/> 
    <change href="/httpAuth/app/rest/changes/id:217403" id="217403" version="064ecef5552ec2fb7875d7c26fe54cdf94b67bec" webLink="http://teamcity.my-domain.com/viewModification.html?modId=217403&personal=false"/> 
    <change href="/httpAuth/app/rest/changes/id:217402" id="217402" version="9bc3a34c952059bbfc7bebeb79ba5a3c894ef555" webLink="http://teamcity.my-domain.com/viewModification.html?modId=217402&personal=false"/> 
</changes> 

然後通過href網址結果每個循環的<change>元素。這回是這樣的:

<change date="20130918T133404-0600" username="welsh" href="/httpAuth/app/rest/changes/id:217397" id="217397" version="51e925e354a83deccde881b30a76974b2ff745f4" webLink="http://teamcity.my-domain.com/viewModification.html?modId=217397&personal=false"> 
    <comment> 
    My comments are here 
    </comment> 
    <files> 
    <file before-revision="[email protected]" after-revision="[email protected]" file="grails-app/views/layouts/global.gsp" relative-file="grails-app/views/layouts/global.gsp"/> 
    </files> 
    <user href="/httpAuth/app/rest/users/id:1" id="1" name="Welsh" username="welsh"/> 
</change> 

並用它來建立你的電子郵件輸入電子郵件地址是誰更多的工作,以創建初期,但你的電子郵件誰上更自由誰在沒有吃起來許可證。

+0

謝謝。我以前從未使用過TeamCity的RestAPI。基於你的解決方案,我可以得到teamcity.build.id,因爲這是xml格式,所以我決定在內部執行一個以獲得計數和svn修訂版。如果計數大於0,那麼我會生成一個svn日誌,其中可以通過電子郵件的消息發送更改。現在完美運作。再次感謝。 – Geddon

+0

嘿威爾士。我知道你說你從來沒有使用NAnt,但這可能是一個TeamCity的事情..在Build Step TC配置設置,如果我使用'/ httpAuth/app/rest/changes?build = id:%teamcity。 build.id%',同時粘貼我的** Build文件內容**,它會返回'build.id',但是如果我在構建Nant文件中使用它** TeamCity **不會返回'build。id'。我更喜歡通過指定路徑而不是將其粘貼到** TeamCity **中來調用Nant文件。你知道這是爲什麼嗎? – Geddon

+0

如果TeamCity具有可見性,TeamCity會將'%teamcity.build.id%'替換爲實際的'build.id'。所以如果你在NAnt構建文件中只有這些文本,由於NAnt進程被分離出來,TC不知道替換它。但是,如果您使用TC Integrated NAnt runner,則應該可以使用選項'命令行參數:'並傳入'-D:arg.buildId =%teamcity.build.id%'。然後在你的NAnt腳本中使用'$ {arg.buildId}'。 – Welsh