2008-08-15 104 views
24

我在我的開發服務器上設置了CruiseControl.NET 1.4版本。每當開發人員檢查代碼時,它都會進行編譯。如何通過CruiseControl.NET發佈ClickOnce應用程序?

現在我們正在一個地方,我們可以開始將我們的應用程序提供給測試人員。我們希望使用ClickOnce來分發應用程序,其想法是當測試人員測試應用程序時,他們擁有最新版本。

我找不到一種方法使CruiseControl.NET發生這種情況。我們使用MSBUILD來執行構建。

回答

12

感謝所有幫助。我們實施的最終解決方案需要從每個答案中取出一點。

我們發現使用簡單的批處理文件可以更輕鬆地處理使用多個環境的工作。我並不是建議這是做到這一點的最佳方式,但對於我們的特定場景和要求,這種方式運行良好。用你的項目名稱和「Environment」補充你的環境名稱(dev,test,stage,production,等等)。

這是我們的「ccnet.config」文件的任務區域。

<!-- override settings --> 
<exec> 
    <executable>F:\Source\Project\Environment\CruiseControl\CopySettings.bat</executable> 
</exec> 

<!-- compile --> 
<msbuild> 
    <executable>C:\WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.exe</executable> 
    <workingDirectory>F:\Source\Project\Environment\</workingDirectory> 
    <projectFile>Project.sln</projectFile> 
    <buildArgs>/noconsolelogger /p:Configuration=Debug /v:diag</buildArgs> 
    <targets>Rebuild</targets> 
    <timeout>0</timeout> 
    <logger>ThoughtWorks.CruiseControl.MsBuild.XmlLogger,ThoughtWorks.CruiseControl.MsBuild.dll</logger> 
</msbuild> 

<!-- clickonce publish --> 
<exec> 
    <executable>F:\Source\Project\Environment\CruiseControl\Publish.bat</executable> 
</exec> 

你會注意到的第一件事就是CopySettings.bat運行。這會複製環境的特定設置,例如數據庫連接。

接下來,運行標準MSBUILD任務。任何編譯錯誤都會在這裏被捕獲並按正常方式處理

要執行的最後一件事是Publish.bat。這實際上是從命令行再次執行MSBUILD「重建」,CruiseControl中的參數會自動傳入並構建。接下來,MSBUILD被稱爲「發佈」目標。在發佈重建時發佈完全相同的參數。這使內部版本號保持同步。此外,我們的可執行文件命名不同(即 - ProjectDev和ProjectTest)。我們最終得到不同的版本號和名稱,這使ClickOnce可以做到這一點。

Publish.bat的最後部分將實際文件複製到新家中。我們不使用publish.htm,因爲我們所有的用戶都在網絡上,我們只是給他們在桌面上的清單文件的快捷方式,他們可以點擊並始終運行正確的可執行文件,版本號綁定在巡航控制。

下面是CopySettings.bat

XCOPY "F:\Source\Project\Environment\CruiseControl\Project\app.config" "F:\Source\Project\Environment\Project" /Y /I /R 
XCOPY "F:\Source\Project\Environment\CruiseControl\Project\My Project\Settings.Designer.vb" "F:\Source\Project\Environment\Project\My Project" /Y /I /R 
XCOPY "F:\Source\Project\Environment\CruiseControl\Project\My Project\Settings.settings" "F:\Source\Project\Environment\Project\My Project" /Y /I /R 

最後,這裏是Publish.bat

C:\WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.exe /target:rebuild "F:\Source\Project\Environment\Project\Project.vbproj" /property:ApplicationRevision=%CCNetLabel% /property:AssemblyName="ProjectEnvironment" /property:PublishUrl="\\Server\bin\Project\Environment\\" 
C:\WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.exe /target:publish "F:\Source\Project\Environment\Project\Project.vbproj" /property:ApplicationVersion="1.0.0.%CCNetLabel%" /property:AssemblyVersion="1.0.0.%CCNetLabel%" /property:AssemblyName="ProjectEnvironment" 

XCOPY "F:\Source\Project\Environment\Project\bin\Debug\app.publish" "F:\Binary\Project\Environment" /Y /I 
XCOPY "F:\Source\Project\Environment\Project\bin\Debug\app.publish\Application Files" "F:\Binary\Project\Environment\Application Files" /Y /I /S 

就像我說的,它可能沒有這樣做的CruiseControl和MSBUILD開發商本來打算事情的方式工作,但它確實有效。如果你昨天需要這個工作,這可能是你正在尋找的解決方案。祝你好運!

-1

您想在msbuild中使用ClickOnce清單生成任務。這個過程有點冗長,所以我只是想指出一些鏈接。這裏是reference on msdnsample article希望能讓你開始。

22

我們已經完成了這項工作,並且可以爲您提供一些指導。

兩件事情你應該知道的:

  • 的MSBuild可以生成必要的部署文件給你。
  • MSBuild不會將文件部署到FTP或UNC共享。你需要一個單獨的步驟。

要使用的MSBuild生成的ClickOnce體現,這裏就是你需要發出命令:

msbuild /target:publish /p:Configuration=Release /p:Platform=AnyCPU; "c:\yourProject.csproj" 

會告訴的MSBuild建設項目和生成ClickOnce部署文件料箱內\ Release \ YourProject.publish目錄。

剩下的就是將這些文件複製到FTP/UNC共享/任何地方,然後你就完成了設置。

你可以告訴CruiseControl.NET使用這些MSBuild參數來構建。

然後,您需要一個CruiseControl.NET構建任務來生成部署文件並將其複製到FTP或UNC共享中。我們爲此使用了一個自定義的小型C#控制檯程序,但您可以輕鬆使用Powershell腳本。

+0

我只想指出,這有點過時。假設你的帖子是正確的,MSBuild已經更新,支持部署到UNC股票,我現在在很多活躍的項目中都這樣做。 – 2015-06-16 14:24:20

4

我記得去年爲我正在研究的ClickOnce項目做了這個。我記得它讓我永遠想弄清楚,但在這裏。我想要我的腳本要做的是生成一個不同的安裝程序,指向我們的開發環境和一個不同的安裝程序。不僅如此,我還需要它注入正確的版本信息,以便現有客戶端「意識到」存在一個新版本,它是clickOnce的全部要點。 在這個腳本中,你必須用你自己的服務器名稱等替換。技巧是保存publish.htm和project.publish文件,並根據CC.NET提供給你的版本注入新的版本號。

這裏是我的構建腳本看起來像:

<target name="deployProd"> 
    <exec program="<framework_dir>\msbuild.exe" commandline="<project>/<project>.csproj /property:Configuration=PublishProd /property:ApplicationVersion=${build.label}.*;PublishUrl=\\<prod_location>\binups$\;InstallUrl=\\<prod_location>\binups$\;UpdateUrl=\\<prod_location>\binups$\;BootstrapperComponentsUrl=\\<prod_location>\prereqs$\ /target:publish"/> 

    <copy todir="<project>\bin\PublishProd\<project>.publish"> 

    <fileset basedir="."> 
     <include name="publish.htm"/> 
    </fileset> 

    <filterchain> 
     <replacetokens> 
     <token key="CURRENT_VERSION" value="${build.label}"/> 
     </replacetokens> 
    </filterchain> 
    </copy> 

</target> 

希望這有助於

0

只要能夠通過CCNET.config msbuild任務中的$ {CCNetLabel}就會有很大的改進。

相關問題