Azure:AzureRmWebAppDeployment任务中的appsettings.json变量替换

时间:2020-07-11 20:13:13

标签: azure azure-devops azure-pipelines azure-resource-manager

在我的azure管道中,我曾经用以下方式替换appsettings.json文件中的变量:

  1. 我的appsettings文件定义了带有令牌值的变量

    MyClass.java
  2. 在此版本中,定义了管道变量

enter image description here

  1. 令牌发布器任务在发布管道的开头运行,并用正确的值替换令牌。

请注意,某些变量在不同的应用程序之间是相似的。例如,在上面的示例中,我有两个应用程序(AuthorPortalApi和FileApi)都具有AzureAD ClientId,因此我必须在令牌中包括应用程序的名称,以便用正确的值替换它。

这一切都很好,但是现在我要更改为使用YAML发布管道。唯一的区别是,现在变量是在专用的YAML文件中定义的:

 {
  "AzureAd": {
  "Instance": "__AAD_Instance__",
  "Domain": "__AAD_Domain__",
  "TenantId": "__AAD_TenantId__",
  "ClientId": "__AAD_AuthorPortalApi_ClientId__"
 }

我可以这样保存。但是我已经注意到,部署azure webapp variables: - name: AAD_FilesApi_ClientId value: some value 的任务提供了一种在appsettings.json中进行变量替换的方法:

AzureRmWebAppDeployment

在一个变量yaml文件中,我定义了这样的变量:

  - task: AzureRmWebAppDeployment@4
  displayName: 'Deploy my api'
  inputs:
    azureSubscription: 'my sub'
    WebAppName: 'my-api'
    packageForLinux: '$(workFolder)/my-api.zip'
    JSONFiles: '**/appsettings.json'

它可以工作,但是就像我上面说的那样,如果两个应用程序在appsettings.json中具有相同的json结构,那么如何区分它们以替换为正确的值?

我已经看过documentation,但是它没有显示如何在YAML模板中定义变量。

2 个答案:

答案 0 :(得分:1)

如果两个应用程序在appsettings.json中具有相同的json结构,那么如何区分它们以替换为正确的值?

我们可以为管道使用不同的变量创建两个 job 模板yaml。

模板AuthorPortalApi.yml

jobs:
- job: AuthorPortalApi
  variables:
    AAD_AuthorPortalApi_ClientId: xxx

模板FilesApi.yml

jobs:
- job: FilesApi
  variables:
    AAD_FilesApi_ClientId: xxx

您可以查看文档Define variables:Variable scopes了解更多详细信息。

另一方面,我们也可以仅将一个任务模板与Runtime parameters一起使用:

parameters:
- name: ClientId
  displayName: AzureAd.ClientId
  type: string
  default: Vlaue_AAD_AuthorPortalApi_ClientId
  values:
  - Value_AAD_FilesApi_ClientId
  - Value_OhterThings_ClientId

jobs:
- job: build
  displayName: build
  pool: 
    vmImage: ubuntu-latest
  steps:
  - script: echo The value is ${{ parameters.ClientId }}

在将管道排队或使用默认值Vlaue_AAD_AuthorPortalApi_ClientId时选择该值:

enter image description here

测试结果:

enter image description here

更新

如果以上方法都不适合您,那么我可以想到的方法是使用模板参数,但是此方法要求我们找到条件以将不同的参数传递给模板:

jobs:
- template: ClientId.yml 
  parameters:
    ClientId: AAD_AuthorPortalApi_ClientId
  condition: and(succeeded(), eq(variables['xx.xx'], 'xx'))

- template: ClientId.yml
  parameters:
    ClientId: AAD_FilesApi_ClientId
  condition: and(succeeded(), eq(variables['yy.yy'], 'yy'))

请查看此文档Job, stage, and step templates with parameters,以了解更多详细信息。

答案 1 :(得分:0)

最后,我决定在库选项卡中使用变量组:

enter image description here

然后在Yaml管道中,我根据运行的阶段简单地引用了正确的组:

variables: 
- group: 'dev'