Azure Pipelines yml - 变量不会在 AzureResourceManagerTemplateDeployment@3 的 overrideParameters 部分中被替换

Azure Pipelines yml - Variable doesn't get substituted in overrideParameters part of AzureResourceManagerTemplateDeployment@3

动态创建的变量不会作为 AzureResourceManagerTemplateDeployment@3 的一部分进行插值 overrideParameters.

示例模板:

trigger:
- master

pool:
  vmImage: 'ubuntu-latest'

variables:
  resourceGroupName: '...'
  storageAccountName: 'actualAccountName'
  subscriptionId: '...'
  location: '...'

steps:      
- task: PowerShell@2
  displayName: "Set AzurePipeline var 'sasToken' to 1234"
  inputs:
    targetType: 'inline'
    script: |            
      $token = 1234;
      Write-Host "##vso[task.setvariable variable=sasToken;]$token"

- task: PowerShell@2
  displayName: "Testing that sasToken is set"
  inputs:
    targetType: 'inline'
    script: |            
      Write-Host "Token is: $(sasToken)"
      
- task: AzureResourceManagerTemplateDeployment@3
  inputs:
    deploymentScope: 'Resource Group'
    azureResourceManagerConnection: 'AzureRMServiceConnection'
    subscriptionId: '$(subscriptionId)'
    action: 'Create Or Update Resource Group'
    resourceGroupName: '$(resourceGroupname)'
    location: $(location)
    templateLocation: 'Linked artifact'
    csmFile: 'azuretemplates/azuredeploy.json'
    overrideParameters: >-
      -appServiceTemplateUri https://$(storageAccountName).blob.core.windows.net/templates/linked-appservice-template.json?$(sasToken)
    deploymentMode: 'Incremental' 

如您所见,有一个 override parameters 部分,我在其中尝试使用各种方式附加 $sasToken

到目前为止我已经尝试过:

None 这些工作,sasToken 总是空的。

输出 url 如下所示:

https://actualAccountName.blob.core.windows.net/templates/linked-appservice-template.json?$(sasToken)

注意:$(storageAccountName) 被替换了,而 $(sasToken) 没有。

我做错了什么?

抱歉,我的示例比使用作业和任务的实际 yml 过于简单。

解决方案:

使用以下方法创建的变量:

"##vso[task.setvariable variable=sasToken]$token"

默认范围为 job

为了在作业之间共享变量,需要执行几个步骤:

      - job: buildJob               #1. name your source job
        steps:
        - task: PowerShell@2
          name: obtainSasTokenTask  #2  name your source task
          inputs:
            targetType: 'inline'    #4  add isOutput=true;
            script: '##vso[task.setvariable variable=sasToken;isOutput=true]$token'
      - job: build                  #5  name your target job
        dependsOn: ['buildJob']     #6  create a dependency on prev job
        variables:                  #7  create scoped variables an reference your sasToken
            sasToken: $[dependencies.buildJob.outputs['obtainSasTokenTask.sasToken'] ]
        steps:
          - task: PowerShell@2
          inputs:
            targetType: 'inline'
            script: |               #8  use your local $(sasToken)
              Write-Host "Token is: $(sasToken)"

这是一个糟糕的多步骤过程,但我还没有找到更清晰、更不容易出错的语法。