【问题标题】:Release Management - Build Fails when I set 'Build Configurations' in Build Definition发布管理 - 当我在构建定义中设置“构建配置”时构建失败
【发布时间】:2016-02-26 15:53:00
【问题描述】:

我希望我能很好地解释这一点。我正在尝试使用 Web.Config 转换来跨各种平台维护我的连接字符串中的数据源。我让它工作到 web.release.config 通过构建过程更新(即它在测试时更改为测试服务器,然后在开发时更改为开发服务器) - 但是我无法让这个 web.release.config 到实际更新 web.config。

我已经按照几个教程来学习这个词,并且我(我想我)已经将问题归结为构建定义 --> 过程 --> 2. 构建 --> 配置。所有教程都说将“任何 CPU / 版本”放在那里...但是当我这样做时,我的构建失败,说明它无法在构建文件夹中找到 _PublishedSites 文件夹(或者部署用户无权访问 - 但是我认为它是前者,因为对于失败的构建,此 _PublishedSites 文件夹不存在。

但是,如果我只是删除构建配置中的值,那么它构建时不会出现错误,但只有 web.release.config 文件会使用变量进行更新。

有没有其他人解决过这个问题...我想我可以只更新 web.config 而不是 web.release.config - 但是我不想在调试和构建之间切换时必须在连接字符串之间切换。

-- *********** 为明确我的问题而编辑 ***********

为了澄清我想要做什么 - 我已经设置了 web.release.config 与以下内容:

  <connectionStrings>
    <add name="IRISConnectionString"
         connectionString="Data Source=__ConnString__; Initial Catalog=..."
         providerName="System.Data.SqlClient"
         xdt:Transform="SetAttributes" xdt:Locator="Match(name)" />
  </connectionStrings>

因此,在最初构建项目时 - web.config 会使用上述内容进行更新 - 包括数据源的标记化占位符。这意味着当 web.config 到达 RM(发布管理)时,新的 web.config 将拥有

Data Source=__ConnString__

替换为来自 RM 组件的变量 - e.i.测试阶段的测试服务器和开发阶段的开发服务器等。

我的构建定义配置为构建到放置文件夹,并且在流程区域下我有以下设置:

但是,当我尝试通过 RM 构建时,我得到了错误: 这是真的,因为构建还没有创建 _PublishedWebsites 文件夹。这似乎与 Build Definition 2, Build --> 2, Configurations = Any CPU/Release 中的值有关,因为如果我把它拿出来 - 它会构建但 web.config 会未使用来自 web.release.config 的标记化信息进行更新。

我希望这有助于更好地说明我的问题...我在网上找到了一些似乎可行但无法解决问题的示例!

【问题讨论】:

  • 您使用的是 TFS 发布管理还是仅使用 TFS 构建?
  • TFS MS 发布管理 - 因此构建在发布管理中进行控制。
  • 构建应该触发 TFS 发布管理(不是其他方式);在发布到各个阶段时,您应该应用不同的配置文件。
  • 是的,我认为这意味着工作的方式是 web.release.config 文件包含令牌值(两边都有双下划线)。因此,在构建项目时,web.config 中的连接字符串将替换为 release.config 值 - 令牌值。因此,当 web.config 到达 RM 时,它包含标记化的占位符。然后,当 RM 选择它时,它会应用组件中的变量并完成工作。这在理论上都是有道理的,但在应用到实践时却遇到了这个奇怪的错误。

标签: tfs release-management ms-release-management web.config-transform


【解决方案1】:

Web.config 转换并不能真正与发布管理范例结合使用。

问题很简单:Web.config 转换发生在构建时,基于您构建的配置。这意味着您必须为每个配置构建才能触发转换。

对于发布管理的运作方式,这是一种根本不兼容的方法。 RM 基于一个构建,然后您通过环境管道发布(和测试!)。这意味着您只有一次机会执行配置转换。

基于代理的 RM 功能基于配置文件标记化和标记替换的思想。我成功的做法是使用配置转换来插入令牌,然后使用 RM 在每个环境中替换它们。

所以,假设您的 web.config 看起来像这样:

&lt;connectionString name="myApp" value="SomeLocalConnectionString"&gt;

您设置了一个配置转换以将SomeLocalConnectionString 替换为令牌

&lt;connectionString name="myApp" value="__ConnectionString__"&gt;

然后,当您配置您的版本时,您可以使用 RM 组件的配置变量部分来指定它应该在 web.config 文件中查找并找到 ConnectionString 令牌。对于您使用该组件的发布模板中的每个阶段,您都可以指定一个具体值,然后在实际发布过程中设置该值。

【讨论】:

  • 感谢丹尼尔提供的详细信息...这将是我最初的方法,直到有人说我应该考虑这样做:
  • (抱歉 - 提前进入)...blogs.msdn.com/b/alming/archive/2015/01/19/…
  • 这个想法是发布管理将处理来自 Web.Release.Config 的连接字符串,并且您的 web.config 保留原样用于调试。
  • 所以我认为它充分利用了您上面提到的功能,以至于构建应该更改 web.config 以便为其赋予标记化值 ConStr 所以当它到达 RM 时,它处于您上面提到的状态......然后 RM 将使用此标记来应用组件范围内的变量。
  • 查看我的博文here,了解如何实现 Daniel 描述的结果的具体建议。
【解决方案2】:

转换确实与 rm 一起工作。它为什么如此重要 ?假设您有一个带有跟踪标签的 qa web.config ,您希望将其从生产中完全删除,因为您希望减少冗长。您不能使用占位符来删除整个标签或添加它们,转换是唯一可以为您执行此操作的技术,以防您不想自己为 Visual Studio 编写插件......

但是 rm 发布模板中存在一些与转换相关的错误,我不得不自己调查这个问题,因为没有人知道在那里做什么。

确实将配置设置为发布是关闭rm,请确保您的发布模板已更新并且仅是-ReleaseTfvcTemplate.12.xaml。

ms 构建参数- /p:PublishProfile=YourPublishProfileName /p:DeployOnBuild=true /p:UseWPP_CopyWebApplication=true /p:OutputPath=bin\Release (设置为输出路径未设置错误) 设置发布配置文件以在 rm 干预之前为两种配置构建两个构建,因为 /p:UseWPP_CopyWebApplication=true 与事物的顺序混淆。

根据需要将构建部分(构建定义中的第 2 号)设置为尽可能多的配置 任意 CPU|QA、任意 CPU|发布

您可以构建 1 个 .csproj ,使用 2 个或更多配置没问题。

在要发布的配置中(构建定义中的第 6 节)仅设置链中的最后一个配置 (Any CPU|Release),如果您不这样做,RM 将无缘无故地发布两次相同的构建(如果您有 3 次) 3种配置等)

确保使用有效签入到 TFS 发布配置文件(右键单击网站 - 发布,设置您想要的发布设置,即预编译\编译\发出调试等)发布配置文件应该使用一个单词名称(否则它将通过一个例外您使用多个发布配置文件),这非常棒,因为在发布配置文件中您可以做任何您想要的发布,甚至保持与以前已经存在的预编译站点的兼容性手动部署,如果你喜欢,包括 pdb 等(非常强大的选项)。

就是这样,您可以对 Windows 服务 (app.config) 使用几乎相同的配置,使用慢 cheetah 和 msbuild 参数,例如: /p:OutputPath=bin\Release /p:DebugSymbols=true

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-07
    • 1970-01-01
    • 2012-11-07
    • 1970-01-01
    • 1970-01-01
    • 2014-03-21
    • 2015-04-24
    • 1970-01-01
    相关资源
    最近更新 更多