2010-10-27 81 views
5

我一直對我的持續集成項目,這是獲得TeamCity建立我的應用程序時,自動更改所有組件的版本號,然後創建一個安裝程序的下一步。需要的TeamCity +維克斯+的MSBuild工作流程的建議

首先給出一些背景:

我一直在運行TeamCity的成功,在過去的幾個月裏,和它建立我的配置和運行我的NUnit和NCover測試就好了。

我花了一點時間研究安裝程序 - 我一直恨InstallShield和從未考慮過爲我的當前應用程序。我喜歡NSIS,但碰巧遇到了WiX。我對MS Installer體系結構沒有任何深入的瞭解,我知道這對於複雜的項目很危險,所以在某些時候我需要了解更多。然而,在涉及SO問題,搜索網頁和閱讀博客幾天後,我有一個成功構建,安裝,運行應用程序並清除所有內容的WiX項目。大!

我也想有TeamCity的構建配置自動更新所有的我的程序集的版本號。我可以通過在我的開發機器上安裝MSBuild Community Tasks並創建一個使用BeforeBuild目標和FileUpdate任務來更改版本號的部署配置來模擬此功能。這工作正常,除了在我的開發機器上,我沒有build_vcs_number_1環境變量來替代。

所以這就是現在的我 - 我需要做的TeamCity更新,而它確實有build_vcs_number_1環境變量,我無法弄清楚如何在維克斯的MSBuild社區任務獲得。

一個職位,我讀推薦的MSBuild的目標檢查到SVN文件夾。我有這樣的事情的/ EXTLIB文件夾,所以我的TeamCity VCS結算規則是這個樣子:

+:tags/2010-10-15=>src 
+:extlib=>extlib 

我如何從一個環境變量EXTLIB?當我運行構建時,TeamCity抱怨(並正確如此)以至於找不到c:\wix30\MSBuildCommunityTasks。實際的文件夾是C:\TeamCity\buildAgent\work\3e073d2b74226378\extlib\wix30\MSBuildCommunityTasks。該文件夾是自動生成的,因爲我正在執行服務器端檢出,所以必須有一些TeamCity設置的可用於獲取正確路徑的環境變量。

我應該注意的一件事是,我已經進入了構建配置 - >屬性和環境變量,並找到了所有現有變量的直觀下拉列表,並沒有看到任何聽起來像變量指向工作路徑。

我能想到的一種可能的解決方法是隻在生成服務器上安裝MSBuild社區任務,然後我可以創建一個可由<WixToolPath>訪問的系統環境變量。

有沒有人有其他建議?

+0

我只是想知道你是否仍然以這種方式工作。我曾經在創建這個問題的同一時間做類似的事情,但後來Git和NuGet,我慢慢遷移到使用NuGet作爲我的主要依賴管理方式。 TeamCity當然現在有一個AssemblyInfo補丁程序,並且在下一個版本中,它使它能夠完成MSBuild社區任務所能做的一切。 – 2015-06-24 10:22:54

+0

我仍然以這種方式工作,對我來說它仍然是一個很好的解決方案,但隨着我獲得更多帶寬,我一定會考慮更改。我想離開MSBuild社區任務,因爲我必須修改每個新程序集,這很不方便。 – Dave 2015-06-24 12:11:50

回答

1

我可以看到一些優點,試圖在SVN中的msbuild社區任務(以減少生成機器的要求),但我個人只是將它們安裝在服務器上。重要部分:更新您的構建服務器的文檔,以列出安裝該文件作爲先決條件。對我而言,我在幾個項目中的基本上每個msbuild中使用社區任務,並使用部署腳本,因此將它們全部保留在SVN中有點多餘。我也在生成服務器上安裝了WiX。

我做類似的東西,而不是建立之前的目標,我有一個MSBuild項目文件大致是這樣的:

<Target Name="Build"> 
    <CallTarget Targets="UpdateVersionNumbers"/> 
    <MSBuild Projects="Project.sln" Targets="Build"/> 
</Target> 

我UpdateVersionNumbers目標抓住SVN修訂,然後使用正則表達式和FileUpdate任務將版本號的第四部分更改爲SVN修訂版。

然後我運行解決方案文件的正常版本,幷包含它構建.wixproj。很簡單,真的。


要回答你的一些其他問題,但:

  • 在指定的路徑,通常使用相對於您的解決方案(結帳DIR)的根路徑。因此,例如在這種情況下,您只需使用wix30\MSBuildCommunityTasks。 TeamCity以工作目錄作爲根目錄執行msbuild,最重要的是,你或其他開發者在哪裏做結賬並不重要 - 路徑都是相對的。
  • 您可以使用「構建參數」 - >「系統屬性」將teamcity中的參數傳遞給msbuild。因此,例如,添加一個名爲agentHome的屬性,其值爲%system.agent.home.dir%,然後您可以在您的msbuild文件中將其引用爲$(agentHome)。請注意,如果您還再次調用的MSBuild如我上面的例子中,你必須做的:

    <MSBuild Projects="Project.sln" Properties="agentHome=$(agentHome)" Targets="Build"/> 
    

    實際上傳遞變量到Project.sln。我認爲但我不確定在.sln文件上運行的msbuild也會將所有屬性傳遞給所有單個項目,因此您可以在生成事件之前實際訪問它。在安裝


附註(我最近通過你做了同樣的事情):我看中了維克斯3.0,雖然有相當的學習曲線,它工作得很好。我們開始了一個新的開發流程,並開始使用VS2010和.NET 4.那麼,WiX 3.0與VS2010不兼容,所以我們需要WiX 3.5(它仍然在測試版 - 儘管state of it seems much better now than it was a few months ago,但它們仍然滯後。有時是開源的本質)。我有一些pain getting WiX 3.0 and 3.5 to install together,但終於弄明白了。 (雖然在不兼容性,片狀測試版(從幾個月前開始)和整體進展緩慢之間)令我感到沮喪(這對WiX工作者來說沒有任何意義,但我只是想要一個安裝程序我不想讓這個參與進來。請注意,他們也非常的frustrated)。除此之外,我接下來需要的產品需要更復雜的安裝程序,而WiX的工作似乎太多了。我使用AdvancedInstaller構建了我的安裝程序,只花了幾天時間,到目前爲止一直運行良好(儘管我們現在只處於早期開發階段,但開始持續部署和測試)。 AI的定價是合理的(我們現在還在試用版),但我會在接下來的幾天內購買。

我很確定我花在學習AI上的時間比我花在學習WiX上的時間少得多,然後試圖讓它做我需要的一切。學習有關Windows Installer如何工作的SOMETHING有點不可避免,但您不必深入瞭解。

+0

引用此名稱感謝您的偉大的建議 - 我仍然重新閱讀一切,但它看起來很好。明天我可能會給你更多的問題。 :) – Dave 2010-10-27 04:58:13

+0

我有一個關於將WiX加入SVN的評論是,開發人員可以少安裝一個。目前,我有我的WiX項目作爲我的應用程序解決方案的一部分。我可以採用兩種方法,我猜 - 我可以*不*這樣做,並讓TeamCity構建應用程序,然後構建安裝程序(我認爲...)。如果我將WiX項目保留在解決方案中,則其他開發人員需要在他們的系統上安裝WiX,以便VS2008可以加載項目而不會出現令人討厭的錯誤。但他們至少不必安裝MSBuild社區任務。 – Dave 2010-10-27 05:02:46

+0

相對路徑似乎不適合我 - 我最終不得不將環境變量'WORK_FOLDER'設置爲'%system.teamcity.build.checkoutDir%'。我仍然沒有工作,但我越來越近了。我跳過一個障礙,只是碰到另一個障礙。 :) – Dave 2010-10-28 18:04:01

0

我恨它,當這種情況發生......鍵入一個長期的問題,只有找到的東西,後來我錯過分鐘。

我不知道這是它:

alt text

我想我現在的問題是 - 我能實際上我.wixproj使用%system.agent.work.dir%?我現在就試一試。

+0

重新審視這個,IIRC的答案是否定的 - 你設置的名稱,然後在**。csproj ** – Dave 2011-07-26 17:11:56