Azure DevOps CI / CD部署Web或Function App更改YAML管道中appsettings中的值

时间:2020-08-05 19:33:14

标签: azure azure-devops azure-pipelines azure-web-app-service azure-function-app

最近,在内部使用我们的一些部署,如何对Function Apps和Web Apps的应用程序设置进行自动化处理时,内部存在一些困惑,并且检查周围似乎有很多令人困惑的选项,看起来它们在做大致相同的事情,但步骤不同。

我们的开发人员通常有一个appsettings.json文件,他们会将其提交到存储库中,以进行测试...

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
    }
  },
  "Values": {
    "ThingToPointTo": "http://localhost",
  }
}

当我们将其带到其他环境时,例如PROD,我们将 ThingToPointTo 更改为“ https:// productionservice”

我们一直在使用Azure DevOps YAML管道以这种方式部署和更改AppSettings ...

- task: AzureFunctionApp@1
  inputs:
    azureSubscription: 'OurAzureSubServiceConnection'
    appType: functionApp
    appName: $(azfuncappname)
    package: '$(Pipeline.Workspace)/drop/$(Build.BuildId).zip'
    AppSettings: '-Values:ThingToPointTo "https://productionservice"'

我的问题是2倍

  1. Values:ThingToPointTo 是否正确,以枚举为正确的设置,还是 ThingToPointTo (忽略 Values )? >)?

  2. 这是这样做的方法吗?我注意到有一些JSON转换步骤可用于在部署之前更改实际文件,还有一个名为“ Azure App Service设置”的任务可用于部署后执行该操作?

关于这一主题的文章太多了,但似乎都不合适。

谢谢!

2 个答案:

答案 0 :(得分:2)

Values:ThingToPointTo是否已正确枚举为正确的设置,还是应该仅仅是ThingToPointTo(忽略Values)?

ThingToPointTo :https://productionservice可能是正确的格式。您无需添加values

例如:

- task: AzureFunctionApp@1
  displayName: 'Azure Function App Deploy: kevin0806'
  inputs:
    azureSubscription: '7.28-8.28'
    appType: functionApp
    appName: kevin
    appSettings: '-ThingToPointTo http://localhost'

结果:

enter image description here

这是这样做的方法吗?我注意到您有JSON转换步骤 可以用来在部署之前更改实际文件,这也是一项任务 可以使用名为“ Azure App Service设置”的功能 部署后?

Azure App Service Settings用于在部署后更改设置。

这是模板,您可以参考它:

steps:
- task: AzureRmWebAppDeployment@4
....

- task: AzureAppServiceSettings@1
  displayName: 'Azure App Service Settings: kevin0608'
  inputs:
    azureSubscription: '7.28-8.28'
    appName: kevin0608
    resourceGroupName: Kevintest
    appSettings: |
     [
        {
         "name": "ThingToPointTo",
         "value": "valueabcd",
         "slotSetting": false
        }
     
     ]

这里是有关Json Transform的文档,您也可以参考它。

此外,您可以检查this ticket

appsettings.json中的设置不会显示在Azure App Service配置中,但是>在那里定义的设置会覆盖appsettings.json中的值

任务中的appsettings配置可以显示在azure应用服务配置中,并且可以覆盖appsettings.json中的值。

更新

上面是没有嵌套变量的情况。

如果变量是嵌套值,则可以遵循以下结构:

"first" : {
  "second": {
    "third" : "value"
  }
}



-first.second.third value1

如果您的应用程序服务是Linux,则可以使用__来替换.

例如- first__second__third value1

注意:变量名匹配区分大小写

答案 1 :(得分:1)

感谢@Kevin Lu-MSFT与我讨论了这些选项

我们发现,对于具有嵌套值的Web应用,例如...

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
    }
  },
  "MySettings": {
    "ThingToPointTo": "http://localhost",
  }
}

...在AZDO YAML管道中的AppSettings确实是...

- task: AzureFunctionApp@1
  inputs:
    azureSubscription: 'OurAzureSubServiceConnection'
    appType: functionApp
    appName: $(azfuncappname)
    package: '$(Pipeline.Workspace)/drop/$(Build.BuildId).zip'
    AppSettings: '-MySettings:ThingToPointTo "https://productionservice"'

这是功能应用程序的不同主题!

如果JSON中包含“值”,则不要使用“值:”枚举!!!! ...

例如...

{
  "Values": {
    "ThingToPointTo": "http://localhost",
  }
}

...最终成为...

AppSettings: '-ThingToPointTo "https://productionservice"'

Function Apps似乎有双重标准!所以要当心 (大多数操作是使用.Net Core和Windows安装程序(适用于Azure)完成的)