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

24

我在我的开发服务器上安装了CruiseControl.NET Version 1.4。每当开发人员提交代码时,都会进行编译。

现在我们已经可以开始将应用程序提供给测试人员了。 我们想使用ClickOnce来分发应用程序,这样当测试人员测试应用程序时,他们就会拥有最新的构建版本。

我找不到一种方法来实现使用CruiseControl.NET进行分发。我们正在使用MSBUILD进行构建。

5个回答

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共享/其他地方,然后您就可以开始了。

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

接下来,您需要一个CruiseControl.NET构建任务来获取生成的部署文件并将其复制到FTP或UNC共享。我们使用一个自定义的小型C#控制台程序来完成此操作,但您也可以轻松地使用PowerShell脚本。


我只想指出这篇文章有点过时了。假设你的帖子是正确的,MSBuild已经更新支持部署到UNC共享,我现在在许多活跃项目中都在使用它。 - SomeInternetGuy
谢谢,詹姆斯。是的,这个问题最初是在2008年回答的,当时所有这些都很新鲜和有吸引力;7年后可能已经不再相关了。 - Judah Gabriel Himango

12

感谢所有的帮助。我们最终实现的解决方案汲取了每个答案的一点。

我们发现使用简单批处理文件来处理多个环境更容易。我并不是在建议这是做这件事情最好的方式,但对于我们的特定情景和需求,这种方法非常有效。请将“项目”替换为您的项目名称,“环境”替换为您的环境名称(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“rebuild”,并自动传递来自CruiseControl的参数进行构建。 接下来,为“publish”目标调用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开发人员预期的工作方式,但它确实有效。如果你需要立即让它运行,那么它可能是你要寻找的解决方案。祝好运!

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},就会有很大的改进。


-1

您想在msbuild中使用ClickOnce清单生成任务。这个过程有点冗长,所以我只是给您指出一些链接。这里是MSDN上的参考和一个示例文章,希望能帮助您入门。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接