感謝您的建議。我選擇編寫一套自定義目標以與我的MSBuild腳本一起使用,該腳本在遠程xml「清單」文件中維護程序集元數據。當創建一個新的TeamCity項目時,我的構建腳本調用一個Init目標,該目標從未填充的模板創建一個新的清單文件。
<Copy SourceFiles="@(ManifestTemplate)" DestinationFiles="@(ManifestTemplate->'$(ManifestFile)')" Condition="!Exists('$(ManifestFile)')" />
我正在使用MSBuild Extentions包從清單文件中讀取版本信息等屬性。
<MSBuild.ExtensionPack.Xml.XmlFile TaskAction="ReadElementText" File="$(ManifestFile)" XPath="/Package/Version/Major">
<Output PropertyName="PackageVersionMajor" TaskParameter="Value"/>
</MSBuild.ExtensionPack.Xml.XmlFile>
我有我的TeamCity構建配置分離CI,測試,次要版本和主要版本與不同的事件觸發每個。從我的項目構建腳本相應的目標,我添加了一個新的目標,以DependsOnTargets
屬性來調用自定義目標更新相應的版本號,並將其保存到清單文件。
<Target Name="Test" DependsOnTargets="IntializeBuildProject;Build-UpdateVersion-Build">
<MSBuild Projects="$(SolutionFile)" Targets="Rebuild" Properties="Configuration=$(Configuration)" />
<TeamCitySetBuildNumber BuildNumber="$(PackageVersion)" />
在自定義的目標代碼來處理的版本更新:
<MSBuild.ExtensionPack.Science.Maths TaskAction="Add" Numbers="$(PackageVersionBuild);1">
<Output PropertyName="PackageVersionBuild" TaskParameter="Result"/>
</MSBuild.ExtensionPack.Science.Maths>
<MSBuild.ExtensionPack.Xml.XmlFile TaskAction="UpdateElement" File="$(ManifestFile)" XPath="/Package/Version/Build" InnerText="$(PackageVersionBuild)"/>
該文件處理的版本,從而忽略了TeamCity的版本號等元數據的持久性。由於XML元數據文件是集中式的,我可以使用這些值填充我的Nuspec,AssemblyInfo和WiX安裝程序元數據,並通過服務消息將版本和其他相關信息傳回給TeamCity。
我添加了一個簡單的MVC Web界面,允許我的團隊遠程編輯文件內容,如果包詳細信息發生變化。現在我們只有一個地方可以更新版權信息和給定構建項目的任何其他元數據。我也可以讓非開發人員訪問MVC網站來更新品牌信息,而不允許他們訪問我的TeamCity構建配置。
除了用於向TeamCity中繼版本的服務消息外,這裏與TeamCity結合的非常少。我喜歡將自定義目標中的功能和從TeamCity中刪除的構建腳本轉移到另一個構建管理解決方案。出於這個原因,我不打算花時間去構建一個TeamCity插件,但可能會有一個博客系列即將推出。
我很樂意爲任何感興趣的人提供更多的代碼和進一步的解釋。
感謝您的回覆。這可以在具有相關工件的相同構建配置中正常工作。我在這裏有三種獨立的構建配置,它們有三套不同的步驟。我需要能夠跨配置持久保留版本號,而不是構建步驟。 –
爲了進一步闡明,CI構建將發生在vcs commit上,並且應該推出版本2.19.123。次要版本構建將手動運行,並應該刪除版本2.20.0。主要發佈版本也將手動運行,並且應該推出版本3.0.0。爲了實現所有這些,必須有一箇中心位置,該版本可以存儲並在後續構建中引用。 –
@DaveBaxter - 你還沒有明白我的答案。我不是在談論相同的構建配置。我正在通過配置進行交談。請嘗試再次閱讀。 – manojlds