如何通过 CruiseControl.NET 发布 ClickOnce 应用程序?
-
08-06-2019 - |
题
我在我的开发服务器上设置了 CruiseControl.NET 1.4 版。每当开发人员签入代码时,就会进行编译。
现在我们可以开始将应用程序提供给测试人员了。我们希望使用 ClickOnce 来分发应用程序,其想法是当测试人员去测试应用程序时,他们拥有最新的版本。
我找不到使用 CruiseControl.NET 实现这一点的方法。我们使用 MSBUILD 来执行构建。
解决方案 2
感谢您的所有帮助。我们实施的最终解决方案借鉴了每个答案的一些内容。
我们发现使用简单的批处理文件可以更轻松地处理多个环境。我并不是说这是最好的方法,但对于我们给定的场景和要求,这效果很好。在“Project”中添加您的项目名称,在“Environment”中添加您的环境名称(开发、测试、阶段、生产等)。
这是“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。发布重建时会提供完全相同的参数。这可以保持内部版本号同步。此外,我们的可执行文件的命名不同(即- 项目开发和项目测试)。我们最终得到了不同的版本号和名称,这使得 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 开发人员预期的方式完成,但它确实有效。如果您昨天需要让它正常工作,这可能就是您正在寻找的解决方案。祝你好运!
其他提示
我们已经做到了这一点,并且可以为您提供一些入门指南。
您应该注意两件事:
- MSBuild 可以为您生成必要的部署文件。
- MSBuild 不会将文件部署到 FTP 或 UNC 共享。为此,您需要一个单独的步骤。
要使用 MSBuild 生成 ClickOnce 清单,您需要发出以下命令:
msbuild /target:publish /p:Configuration=Release /p:Platform=AnyCPU; "c:\yourProject.csproj"
这将告诉 MSBuild 构建您的项目并在 bin elease\YourProject.publish 目录。
剩下的就是将这些文件复制到 FTP/UNC 共享/任何位置,然后一切就完成了。
您可以告诉 CruiseControl.NET 使用这些 MSBuild 参数进行构建。
然后,您将需要 CruiseControl.NET 构建任务来获取生成的部署文件并将它们复制到 FTP 或 UNC 共享。为此,我们使用自定义的小型 C# 控制台程序,但您也可以轻松使用 Powershell 脚本。
我记得去年我为我正在从事的 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>
希望这可以帮助
只要能够在 CCNET.config msbuild 任务中传递 ${CCNetLabel} 就将是一个很大的改进。