在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)
执行此代码段后,将导致错误消息:
因此,开始运行时可能无法尽快expand the variable
AzureServiceConnection
。但是,如果确实如此,那么在每个阶段都使用单独的服务连接的替代解决方案是什么?确定有效的一个选项是直接为所有任务设置服务连接名称,但这将涉及为每个阶段复制相同的Yaml任务,我显然想避免这种情况。
有人对此有线索吗?提前致谢!
最佳答案
当前,您不能将变量作为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'}
关于azure-devops - 如何在Azure Pipelines的每个阶段使用不同的服务连接?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57520028/