如何通过CruiseControl.NET发布ClickOnce应用程序?

时间:2008-08-15 17:08:20

标签: msbuild clickonce cruisecontrol.net publish

我在开发服务器上设置了CruiseControl.NET 1.4版。每当开发人员检查代码时,它都会进行编译。

现在我们可以开始向测试人员提供应用程序了。我们想使用ClickOnce来分发应用程序,其想法是当测试人员测试应用程序时,他们拥有最新版本。

我找不到使用CruiseControl.NET实现这一目标的方法。我们正在使用MSBUILD来执行构建。

5 个答案:

答案 0 :(得分:22)

我们已经做到了,可以给你一些启动的指示。

你应该注意的两件事:

  • MSBuild可以为您生成必要的部署文件。
  • MSBuild不会将文件部署到FTP或UNC共享。你需要一个单独的步骤。

要使用MSBuild生成ClickOnce清单,以下是您需要发出的命令:

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

这将告诉MSBuild构建项目并在 bin \ Release \ YourProject.publish 目录中生成ClickOnce部署文件。

剩下的就是将这些文件复制到FTP / UNC共享/任何地方,并且你已经完成了设置。

您可以使用这些MSBuild参数告诉CruiseControl.NET。

然后,您需要CruiseControl.NET构建任务来获取生成的部署文件并将其复制到FTP或UNC共享。我们使用自定义的小型C#控制台程序,但您可以轻松使用Powershell脚本。

答案 1 :(得分:12)

感谢所有帮助。我们实施的最终解决方案从每个答案中都有所帮助。

我们发现使用简单的批处理文件处理多个环境更容易。我并不是说这是最好的方法,但是对于我们给定的方案和要求,这很有效。使用您的项目名称补充“项目”,并使用您的环境名称(开发,测试,阶段,生产等)补充“环境”。

这是我们的“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,因为我们的所有用户都在网络上,我们只是给他们一个桌面上清单文件的快捷方式,他们可以点击并始终运行正确的可执行文件,其版本号为CruiseControl的。

这是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开发人员想要的那样工作,但确实有效。如果您需要在昨天使用它,它可能是您正在寻找的解决方案。祝你好运!

答案 2 :(得分: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>

希望这有帮助

答案 3 :(得分:0)

只要能够在CCNET.config中传递$ {CCNetLabel},msbuild任务就会有很大改进。

答案 4 :(得分:-1)

您想在msbuild中使用ClickOnce清单生成任务。这个过程有点长,所以我只想指出几个链接。以下是reference on msdnsample article,希望能帮助您入门。