【问题标题】:deploying web app with env specific appsetting使用特定于环境的 appsetting 部署 Web 应用程序
【发布时间】:2022-06-14 15:54:16
【问题描述】:

我目前正在部署一个 Web 应用程序,在该应用程序上我有一个用于生产目的的应用程序设置和一个用于测试目的的应用程序设置。 我如何在部署期间将 appsetting.json 替换为生产或测试的内容?

要部署,我使用 IIS Web 应用管理和 IIS Web 应用部署。

我目前所做的是每次将某些内容推送到 main 时,我都会设置 Azure 来触发一个

variables:
  solution: '**/*.sln'
  buildPlatform: 'Any CPU'
  testConfiguration: 'Test'
  prodConfiguration: 'Production'

steps:
- task: NuGetToolInstaller@1

- task: NuGetCommand@2
  inputs:
    restoreSolution: '$(solution)'

- task: VSBuild@1
  inputs:
    solution: '$(solution)'
    msbuildArgs: '/p:DeployOnBuild=true /p:WebPublishMethod=Package /p:PackageAsSingleFile=true /p:SkipInvalidConfigurations=true /p:PackageLocation="$(build.artifactstagingdirectory)"'
    platform: '$(buildPlatform)'
    configuration: '$(testConfiguration)'

- task: VSBuild@1
  inputs:
    solution: '$(solution)'
    msbuildArgs: '/p:DeployOnBuild=true /p:WebPublishMethod=Package /p:PackageAsSingleFile=true /p:SkipInvalidConfigurations=true /p:PackageLocation="$(build.artifactstagingdirectory)"'
    platform: '$(buildPlatform)'
    configuration: '$(prodConfiguration)'

- task: DotNetCoreCLI@2
  inputs:
   command: 'publish'
   publishWebProjects: true
   zipAfterPublish: true
   arguments: '--output $(build.artifactstagingdirectory)'

- task: PublishBuildArtifacts@1
  inputs:
    PathtoPublish: '$(Build.ArtifactStagingDirectory)'
    ArtifactName: 'drop'
    publishLocation: 'Container'

然后,我使用 drop to 中创建的工件进行部署。 当我想部署到我的测试或生产环境时会出现问题。

解决方案本身对appsetting.json有一个transform,即appsetting.Test.json和appsetting.Production.json 但放置文件夹中的只是发布的产品版本,而不是测试和产品。

如何将两者都包含在放置文件夹下?

所以当我通过部署管道发布它时,可以指定我要部署测试版本还是产品版本?

【问题讨论】:

  • 根据您的描述,我无法清楚地理解您的要求。你这样做的目的是什么?
  • 部署时转换后的 appsetting.json 文件的内容不同我想覆盖使用特定环境而不是我的一组 appsetting.json
  • 您的问题似乎很复杂,建议您通过support.microsoft.com开箱。
  • 我认为您可以在 Linux 中使用 bash 脚本或在 Windows 中使用 bat 文件,在您的管道中创建一个步骤来更改 appsetting.json

标签: iis azure-devops deployment appsettings


【解决方案1】:

使用特定于环境的应用设置部署 Web 应用

使用新版本的Azure App Service Deploy 任务可以轻松实现此方法,只要您定义要在每个环境中替换的设置值

参考Managing Configuration and App Settings for Multiple Environments in Your CD Pipeline

  • 要替换应用程序设置,请将变量添加到发布任务并将用于变量替换的 json 文件发送到任务中。

  • 如果您想在部署到每个 Web 应用之前更改应用设置和连接字符串值,您可以通过应用 Web.config transformation 或替换 Web.config 文件中的变量来实现。

  • 根据提供的阶段名称,Azure App Service Deploy 操作允许用户在 Web 包和 XML 参数文件 (parameters.xml) 内的配置文件(*.config 文件)中编辑配置设置。

  • 单独的File Transform task 也支持文件转换和变量替换,以便在 Azure Pipelines 中使用。

  • 在“部署 Azure 应用服务”发布任务中,您可以看到 File Transforms and Variable Substitution 部分。您需要提供要交换变量值的 json 文件的路径。

  • 单击发布环境上的选项按钮。您将在弹出菜单中看到配置变量的选项。

  • 将要修改的json属性添加为变量。

  • 输入您的连接字符串或应用程序设置值。然后,Azure Devops 会在部署时为您换出这些值。

  • 配置替换在任务设置的文件转换和变量替换选项部分中指定。

更多信息请参考File transforms and variable substitution reference

【讨论】:

  • 嘿@我不胖!它是否解决了您的问题,否则您可以分享更多详细信息以便我进行故障排除?
  • 没有问题仍然存在,试图更具描述性 - 在意识到是什么导致我的问题之后
【解决方案2】:

您是否尝试过使用Azure App Service Settings task

【讨论】:

  • 这在 azure devops 中。 - 我不知道这是可用的吗?
  • @IamnotFat 这适用于 Azure Devops。链接中有一个 YAML 示例,您应该能够将 AzureAppServiceSettings@1 作为任务添加到您的管道中。
【解决方案3】:

如果您不想要变量替换,那么也许您可以拥有 2 个 json 副本,一份用于生产,一份用于测试,然后使用此处所述的复制任务:https://docs.microsoft.com/en-us/azure/devops/pipelines/tasks/utility/copy-files?view=azure-devops&tabs=yaml

您可以在部署的 yaml 中添加副本,并根据阶段使用您需要的文件。在此复制任务之后,您可以添加部署任务。

【讨论】:

    【解决方案4】:

    如果appsetting.Test.json 未包含在您的drop 文件夹中的问题,请将下一部分添加到您的.csproj 中:

    <ItemGroup>
       <None Include="appsettings.Test.json" CopyToPublishDirectory="Always" />
    </ItemGroup>
    

    【讨论】:

      猜你喜欢
      • 2012-04-12
      • 2021-09-18
      • 2011-09-11
      • 1970-01-01
      • 1970-01-01
      • 2019-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多