【问题标题】:Azure DevOps XML Transformation During Release Not Working发布期间的 Azure DevOps XML 转换不起作用
【发布时间】:2018-12-06 01:28:39
【问题描述】:

我想配置我们的管道以允许一个构建用于多个环境,而无需创建单独的构建。根据docs 的说法,这似乎是可能的,正如它所说:

  • 您可以使用此技术创建默认包并将其部署到多个阶段。

我将我的舞台命名为我的环境(预览版),并为该环境(web.preview.config)文件创建了一个 web.config 文件。我所有的环境配置文件都在与 Web.Config 文件相同的路径中。

日志说转换已完成:

2018-11-17T00:26:52.0383966Z [命令]D:\a_tasks\AzureRmWebAppDeployment_497d490f-eea7-4f2b-ab94-48d9c1acdcb1\3.4.13\ctt\ctt.exe s:D:\a_temp\temp_web_package_06284891598\48 \D_C\a\1\s\Microsoft.Xbox.Mvp\Microsoft.Xbox.Mvp.Api\obj\Preview\Package\PackageTmp\bin\Web.config t:D:\a_temp\temp_web_package_06958915987488234\Content\D_C\a \1\s\Microsoft.Xbox.Mvp\Microsoft.Xbox.Mvp.Api\obj\Preview\Package\PackageTmp\bin\Web.Release.config d:D:\a_temp\temp_web_package_06958915987488234\Content\D_C\a\1 \s\Microsoft.Xbox.Mvp\Microsoft.Xbox.Mvp.Api\obj\Preview\Package\PackageTmp\bin\Web.config pw i 2018-11-17T00:26:52.4335280Z [命令]D:\a_tasks\AzureRmWebAppDeployment_497d490f-eea7-4f2b-ab94-48d9c1acdcb1\3.4.13\ctt\ctt.exe s:D:\a_temp\temp_web_package_06954\AzureRmWebAppDeployment_497d490f-eea7-4f2b-ab94-48d9c1acdcb1\3.4.13\ctt\ctt.exe s:D:\a_temp\temp_web_package_06954891598C\74\ContentD2 a\1\s\Microsoft.Xbox.Mvp\Microsoft.Xbox.Mvp.Api\obj\Preview\Package\PackageTmp\bin\Web.config t:D:\a_temp\temp_web_package_06958915987488234\Content\D_C\a\1\ s\Microsoft.Xbox.Mvp\Microsoft.Xbox.Mvp.Api\obj\Preview\Package\PackageTmp\bin\Web.Preview.config d:D:\a_temp\temp_web_package_06958915987488234\Content\D_C\a\1\s\ Microsoft.Xbox.Mvp\Microsoft.Xbox.Mvp.Api\obj\Preview\Package\PackageTmp\bin\Web.config pw i 2018-11-17T00:26:52.5443873Z XML 转换成功应用

我可以看到它首先转换为发布,然后按照文档所述应用预览(发布然后环境)。但是,虽然它说 XML 转换已成功应用,但当我检查配置变量时,它们并没有改变。我可以使转换工作的唯一方法是在我对新构建进行排队时定义 buildConfiguration 变量,这会阻止我在不同的环境中使用相同的构建。

我在研究的时候,从这个link发现了这个:

Web.config在构建过程中被转换,如果你从“Build”生成部署包,然后在“Release”中部署,那么在部署之前不能转换。

但是文档说我可以在多个阶段使用一个默认包...这是否仍然意味着我必须为每个环境创建单独的构建?对于我想要解决的场景,我不应该考虑 XML 转换吗?

提前谢谢你!

++ 编辑:

发布设置:

发布步骤(我认为?我有一种强烈的感觉,这就是您正在寻找的......):

【问题讨论】:

  • 你如何检查你的配置变量?
  • 在 Azure 应用服务上,我可以从远程执行控制台查看当前变量。
  • 您描述的场景应该可以工作。基本上,您将基础 web.config 和所有 web.{stage}.config 文件从构建中包含到您的工件中,然后在发布期间应用转换。你能检查一下你的人工制品里面有什么,并可能包括你的发布步骤和设置的屏幕截图吗?
  • @JleruOHeP 我只是查看了我们的工件,但除了 setParameters.xml 之外,我没有看到任何与转换相关的东西,我什么也没做。我不确定我是否应该看到其他东西或者这是正确的。我可以附上我们发布步骤和设置的屏幕截图。谢谢!
  • 图像看起来不错,在您的人工制品(您的 .zip 文件)中应该至少有 3 个 xml:Web.config、Web.Release.config、Web.Preview.config。您能确认所有这些设置都正确吗?

标签: c# xml azure-devops azure-pipelines


【解决方案1】:

1) 确保您转换作品。测试一下 here.

2) 确保在您的 VS 项目中包含转换文件、Web.Preview.config,并复制到输出目录。

3) 在构建过程中禁用配置转换,您只需在构建任务的 MSBuild Arguments 部分添加参数 /p:TransformWebConfigEnabled=False。如果要在发布期间更新连接字符串,还需要添加 /p:AutoParameterizationWebConfigConnectionStrings=False。这将使用 Web.Preview.config 来“转换”web.config。

4) 仔细检查您在文件转换和变量替换选项下的 IIS Web App Deploy 任务发布中是否检查了 XML 转换。

【讨论】:

  • 关于在构建中禁用 Web 配置转换的内容对我很有帮助,但比我预期的要难找到。
  • 在项目文件中的转换文件上删除 DependentUpon 也可能有帮助
  • ... 和 /p:AutoParameterizationWebConfigConnectionStrings=False 也需要设置,以便 connectionStrings 部分得到转换
【解决方案2】:

我在 Internet 上找到的所有答案都不适用于我的构建和发布管道。我从发布管道获得的web.config 始终指向未转换的值。

拉了几个小时的头发后,我终于开始工作了。

关于我的设置的一些简短信息

我希望能够通过一个构建和一个发布管道在所有环境中进行部署。

我的设置:

  • 一个构建管道,用于构建我们所有的标准分支(test发布)。
  • 一个具有不同阶段的发布管道 取决于开始发布的分支。

我们的测试阶段在我们的测试服务器上发布测试分支。 Stage/Production 来自同一个发布分支,但有自己的转换文件。

解决方案

我关注了一些guide from Microsoft 并设置了我的web.<environment_name>.config 以匹配发布阶段名称。

我不需要为每个转换从我的.csproj 中删除<Dependent Upon> 行。相反,我所做的只是将每个转换的属性 Build Action 设置为 Content,如下图所示。

然后我将这些命令添加到构建管道的构建解决方案 -> MSBuild Arguments:

  • /p:MarkWebConfigAssistFilesAsExclude=false
  • /p:TransformWebConfigEnabled=false
  • /p:AutoParameterizationWebConfigConnectionStrings=False

现在构建不会尝试自行转换.config,也不会从工件中排除转换文件,而是允许发布管道进行转换。此外,为转换文件保留 <Dependent On> 可以让我们在代码编辑器中“更清晰”地查看。

【讨论】:

  • 此解决方案也适用于部署到 Azure 以外的托管环境的用户。对于 Azure 部署任务,您只需检查 xml 转换选项,但该选项不适用于其他类型的部署。对我有帮助,谢谢兄弟!
  • 我使用上述方法部署到 IIS 上的 Windows Server。我也使用了 XML 转换选项,但在我完成上述所有其他操作之前,它并没有解决我的问题。
【解决方案3】:

我刚刚完成了这项工作,因此我可以构建一个可以部署到多个环境的版本。这就是我所做的。

在代码中,我将每个Web.<Environment>.config 属性设置为Build Action = "Content"。我也将所有我的设置为Copy to Output Directory = "Copy Always"。我还卸载了项目并编辑了csproj 文件,然后删除了<DependendUpon>Web.config</DependentUpon> 行。这会将您所有的 web.configs 转储到根目录(无文件嵌套)。

在构建中,我设置了管道变量BuildConfiguration = "Release"。我的项目中没有Web.Release.config

在发布中,我以环境命名部署阶段(在我的例子中,DevelopmentStagingProduction)。在 Azure 部署任务的所有阶段,我都选中了 XML 转换复选框。

在 Azure 中,我将 ASPNETCORE_ENVIRONMENT 设置为暂存环境的命名,在我的例子中,DevelopmentStagingProduction)。

【讨论】:

  • 只是想在乔·威尔逊所说的所有内容中添加这个。我有一个 web.config web.Release.config 和 web.Debug.config。所有默认情况下都带有 asp.net。我将我的 devops 构建设置为“发布”并进行了 xml 转换并失败了。但是,如果我进行调试构建,那么它就会通过。所以不知何故,它搞砸了“使用 web.Release.config 发布构建”。所以我采纳了 Wilson 的建议,将我的 web.Release.config 更改为 web.Production.config,并将我的发布阶段名称命名为“Production”。长话短说,随便命名,但不要命名为“web.Release.config”
【解决方案4】:

我也刚刚得到这个工作。我的问题实际上是在 Visual Studio 解决方案级别。我让 MVC 项目指向了与其他项目不同的配置。因此,请务必仔细检查配置!

【讨论】:

  • 不知道为什么它被否决了,因为它是我的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-25
  • 2019-11-22
  • 2021-05-22
  • 2020-11-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多