如何在Azure Pipelines的每个阶段使用不同的服务连接?

时间:2019-08-16 06:45:08

标签: azure-devops yaml azure-pipelines

在Azure Pipelines中使用yaml中的multistage pipelines时,每个阶段都将资源部署到单独的环境中时,我想为每个阶段使用专用的服务连接。就我而言,每个阶段都使用相同的部署作业,即yaml模板。因此,我使用了许多具有特定值的变量,这些变量取决于环境。除服务连接外,此方法均正常运行。

理想地,将包含服务连接名称的变量添加到阶段级别,如下所示:

stages:
- stage: Build
    # (Several build-stage specific jobs here)

- stage: DeployToDEV
  dependsOn: Build
  condition: succeeded()
  variables:
    AzureServiceConnection: 'AzureSubscription_DEV' # This seems like a logical solution
  jobs:
    # This job would ideally reside in a yaml template
    - job: DisplayDiagnostics
      pool:
        vmImage: 'Ubuntu-16.04'
      steps:
        - checkout: none
        - task: AzurePowerShell@4
          inputs:
            azureSubscription: $(AzureServiceConnection)
            scriptType: inlineScript
            inline: |
              Get-AzContext
            azurePowerShellVersion: LatestVersion

- stage: DeployToTST
  dependsOn: Build
  condition: succeeded()
  variables:
    AzureServiceConnection: 'AzureSubscription_TST' # Same variable, different value
  jobs:
    # (Same contents as DeployToDEV stage)

执行此代码段后,将导致错误消息:

  

存在资源授权问题:“管道无效。   作业显示诊断:步骤AzurePowerShell输入   ConnectedServiceNameARM引用服务连接   $(AzureServiceConnection)找不到。服务   连接不存在或尚未被授权使用。对于   授权详细信息,请参阅https://aka.ms/yamlauthz

因此,开始运行时可能expand the variable AzureServiceConnection不够快。但是,如果确实如此,那么在每个阶段都使用单独的服务连接的替代解决方案是什么?

可以肯定使用的一个选项是直接为所有任务设置服务连接名称,但这将涉及到在每个阶段复制相同的Yaml任务,我显然想避免。

有人对此有任何线索吗?预先感谢!

1 个答案:

答案 0 :(得分:3)

当前,您不能将变量作为serviceConnection传递。 显然,服务连接名称是在push / commit上获取的,无论那里有什么都可以获取。

例如如果您有$(变量),它将选择$(变量)而不是值。

到目前为止,我一直使用的解决方法是在每个阶段的步骤中使用模板,并通过serviceConnection传递不同的参数。

请参考:https://github.com/venura9/azure-devops-yaml/blob/master/azure-pipelines.yml,以获取示例实现。非常欢迎您提出更新请求。

- stage: DEV
  displayName: 'DEV(CD)'
  condition: and(succeeded('BLD'), eq(variables['Build.SourceBranch'], 'refs/heads/develop'))
  dependsOn: 
   - BLD
  variables: 
    stage: 'dev'
  jobs:

  - job: Primary_AustraliaSouthEast
    pool:
      vmImage: $(vmImage)
    steps:
    - template: 'pipelines/infrastructure/deploy.yml'
      parameters: {type: 'primary', spn: 'SuperServicePrincipal', location: 'australiasoutheast'}
    - template: 'pipelines/application/deploy.yml'
      parameters: {type: 'primary', spn: 'SuperServicePrincipal'}