Azure Pipelines with .Net Core -针对每个环境转换web.config

nkkqxpd9  于 2023-11-21  发布在  .NET
关注(0)|答案(2)|浏览(133)

我们一直在迁移到Azure Devops与.Net Core部署到我们的本地Windows服务器上时遇到问题。这可能是由于缺乏对平台的了解,但尽管如此...

问题我们试图弄清楚的是,当遵循“一次构建,到处部署”结构时,我们如何转换我们的web.config文件以将“ASPNETCORE_ENVIRONMENT”env变量设置为正在部署的正确环境。目前我们的应用程序需要设置该变量,因为我们的appsettings分为两个文件,appSettings.json和appSettings.Env.json,其中Env是我们部署到的当前环境(Dev或Prod)。
**例如:**Azure Pipelines构建我们的项目,并且输出工件中的结果web.config将ASPNETCORE_ENVIRONMENT变量设置为“Development”。这很好,因为我们随后将该工件部署到我们的开发环境。但是当我们将其发布到我们的prod阶段时会发生什么?该web.config仍然将ASPNETCORE_ENVIRONMENT变量设置为“Development”。

什么是正确的(2021)转换配置的方法?我甚至不应该在web.config中使用该变量并更改我们与appSettings文件交互的方式吗?
我读过很多关于类似问题的文章和问题,但没有多少与ASPNETCORE_ENVIRONMENT env变量相关。有些人说使用“替换令牌任务”。有些人说使用配置转换(它们不适用于ASPNETCORE_ENVIRONMENT)。
不知道该怎么办。

我最近尝试的:

Transform web.config for Azure Website Deployment for each release environment
Azure Pipelines Config Transform based on Stage

我发布时生成的web.config文件:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <configuration>
  3. <location path="." inheritInChildApplications="false">
  4. <system.webServer>
  5. <handlers>
  6. <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" />
  7. </handlers>
  8. <aspNetCore processPath="dotnet" arguments=".\WebApi.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" hostingModel="inprocess">
  9. <environmentVariables>
  10. <environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Development" />
  11. </environmentVariables>
  12. </aspNetCore>
  13. </system.webServer>

字符串

Azure管道文件

  1. name: WebApp-$(Date:yyyyMMdd).$(rev:rr)
  2. trigger:
  3. branches:
  4. include:
  5. - master
  6. variables:
  7. major: 2
  8. minor: 0
  9. patch: 0
  10. solution: '**/*.sln'
  11. buildPlatform: 'Any CPU'
  12. buildConfiguration: 'Release'
  13. Parameters.WebsiteName: 'webapp'
  14. jobs:
  15. - job: Build
  16. pool:
  17. vmImage: 'windows-latest'
  18. steps:
  19. - task: DotNetCoreCLI@2
  20. displayName: 'dotnet restore'
  21. inputs:
  22. command: 'restore'
  23. projects: '$(solution)'
  24. - task: VSBuild@1
  25. inputs:
  26. solution: '$(solution)'
  27. msbuildArgs: '/p:DeployOnBuild=true /p:WebPublishMethod=Package /p:PackageAsSingleFile=true /p:SkipInvalidConfigurations=true /p:DesktopBuildPackageLocation="$(build.artifactStagingDirectory)\WebApp.zip" /p:DeployIisAppPath="webapp" /p:EnvironmentName="Development"'
  28. platform: '$(buildPlatform)'
  29. configuration: '$(buildConfiguration)'
  30. - task: VSTest@2
  31. inputs:
  32. platform: '$(buildPlatform)'
  33. configuration: '$(buildConfiguration)'
  34. - task: ArchiveFiles@2
  35. displayName: 'Create Zip Archive'
  36. inputs:
  37. rootFolderOrFile: '$(build.artifactStagingDirectory)/'
  38. includeRootFolder: false
  39. archiveType: zip
  40. archiveFile: $(Build.ArtifactStagingDirectory)/$(Build.BuildNumber).zip
  41. replaceExistingArchive: true
  42. - task: DotNetCoreCLI@2
  43. inputs:
  44. command: 'publish'
  45. publishWebProjects: true
  46. - task: PublishBuildArtifacts@1
  47. displayName: 'Web Artifact'

omjgkv6w

omjgkv6w1#

当你看到web.config在这里设置environmentVariable为this时,如果以另一种方式处理这个问题,你就不需要这个了,比如在你想部署应用程序的地方设置这个。更多信息,你可以找到here in docs - Use multiple environments in ASP.NET Core。但是如果你仍然想通过web.config来做这个,请检查this answer

o4tp2gmn

o4tp2gmn2#

我发现了一种通过发布配置文件来支持设置此值的方法。
在最近的.Net版本中,他们添加了将以下属性添加到发布配置文件的功能。
第一个月
当使用发布配置文件时,生成的web.config中会根据该值设置ASPNETCORE_ENVIRONMENT环境变量。
我在Azure DevOps CI/CD管道中使用这种方法,其中我的构建步骤看起来像这样,其中DEV与Prod的PublishProfile名称不同,这意味着我构建两次,这很好,因为我在prod中以发布模式构建并在dev中进行调试。

  1. - task: VSBuild@1
  2. displayName: 'Build'
  3. inputs:
  4. solution: '$(solution)'
  5. msbuildArgs: '/p:DeployOnBuild=true /p:PublishProfile=MyApi-Prod.pubxml'
  6. platform: '$(buildPlatform)'
  7. configuration: 'Release'
  8. clean: true

字符串
给定bin目录中的默认路径,如我的发布配置文件中所定义的,我的工件发布如下所示:

  1. - task: PublishBuildArtifacts@1
  2. displayName: 'Publish Prod Site'
  3. inputs:
  4. PathtoPublish: '$(System.DefaultWorkingDirectory)\src\MyWebApi\bin\Release\net6.0\publish'
  5. ArtifactName: 'ProdWebsite'
  6. publishLocation: 'Container'


本示例中的Web配置为

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <configuration>
  3. <location path="." inheritInChildApplications="false">
  4. <system.webServer>
  5. <handlers>
  6. <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" />
  7. </handlers>
  8. <aspNetCore processPath="dotnet" arguments=".\MyWebApi.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" hostingModel="inprocess">
  9. <environmentVariables>
  10. <environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Release" />
  11. </environmentVariables>
  12. </aspNetCore>
  13. </system.webServer>
  14. </location>
  15. </configuration>


希望这能帮上忙。干杯

展开查看全部

相关问题