You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

跨多租户多订阅的Bicep与YAML流水线ACR命名适配问题

多租户Azure流水线ACR名称动态配置问题

现有架构包含两类核心资源:

  • Bicep模板:负责部署Azure容器注册表(ACR),并发布Bicep文件至注册表
  • YAML任务模板:封装多任务逻辑,通过调用模板替代重复的多任务调用

当前主流水线部署流程:调用包含AzureResourceManagerTemplateDeployment@3任务的YAML模板部署ACR,再通过AzureCLI@2任务执行内联脚本发布Bicep文件,ACR名称由外部参数JSON文件指定。

现在需要将流水线部署到两个不同租户的订阅,通过布尔变量IsOld区分租户,但要求两个租户的ACR名称不能重复。需解决以下两个问题:

  1. 如何基于IsOld变量在AzureCLI任务的内联脚本中动态传入对应ACR名称
  2. 如何根据IsOld参数为Bicep模板传递正确的ACR名称参数

解决方案

1. AzureCLI任务内联脚本动态传入ACR名称

有两种简洁的实现方式:

方式一:提前通过流水线变量赋值

在流水线变量段或模板参数中,根据IsOld生成对应ACR名称变量:

variables:
  - name: ACRName
    value: ${{ if eq(variables.IsOld, 'true') }}: 'old-tenant-acr-001'
           ${{ else }}: 'new-tenant-acr-001'

随后在AzureCLI@2任务中直接引用该变量:

- task: AzureCLI@2
  inputs:
    azureSubscription: ${{ parameters.azureSubscription }}
    scriptType: 'bash'
    scriptLocation: 'inlineScript'
    inlineScript: |
      az bicep publish --file ./main.bicep --target br:$(ACRName).azurecr.io/bicep/modules/module-name:v1

方式二:脚本内直接做条件判断

若无需提前定义变量,可在脚本内通过IsOld变量直接分支处理:

- task: AzureCLI@2
  inputs:
    azureSubscription: ${{ parameters.azureSubscription }}
    scriptType: 'bash'
    scriptLocation: 'inlineScript'
    inlineScript: |
      if [ "$(IsOld)" = "true" ]; then
        acrName="old-tenant-acr-001"
      else
        acrName="new-tenant-acr-001"
      fi
      az bicep publish --file ./main.bicep --target br:$acrName.azurecr.io/bicep/modules/module-name:v1

2. 为Bicep模板传递正确的ACR名称参数

针对AzureResourceManagerTemplateDeployment@3任务,可选择以下两种方式:

方式一:动态选择参数JSON文件

准备两个参数文件(acr-params-old.json和acr-params-new.json),分别对应两个租户的ACR名称。根据IsOld变量选择对应文件:

- task: AzureResourceManagerTemplateDeployment@3
  inputs:
    deploymentScope: 'Resource Group'
    azureResourceManagerConnection: ${{ parameters.azureSubscription }}
    resourceGroupName: ${{ parameters.resourceGroupName }}
    templateLocation: 'Linked artifact'
    csmFile: './acr-deploy.bicep'
    csmParametersFile: ${{ if eq(variables.IsOld, 'true') }}: './acr-params-old.json'
                       ${{ else }}: './acr-params-new.json'
    deploymentMode: 'Incremental'

方式二:直接在任务中指定参数值

无需单独参数文件时,可在overrideParameters字段中动态生成参数:

- task: AzureResourceManagerTemplateDeployment@3
  inputs:
    deploymentScope: 'Resource Group'
    azureResourceManagerConnection: ${{ parameters.azureSubscription }}
    resourceGroupName: ${{ parameters.resourceGroupName }}
    templateLocation: 'Linked artifact'
    csmFile: './acr-deploy.bicep'
    overrideParameters: >
      -acrName ${{ if eq(variables.IsOld, 'true') }}: 'old-tenant-acr-001'
               ${{ else }}: 'new-tenant-acr-001'
    deploymentMode: 'Incremental'

另外,建议保持Bicep模板的通用性,仅通过参数接收ACR名称,不在模板内做租户判断:

param acrName string

resource acr 'Microsoft.ContainerRegistry/registries@2023-01-01-preview' = {
  name: acrName
  location: resourceGroup().location
  sku: {
    name: 'Premium'
  }
  properties: {
    adminUserEnabled: false
  }
}

内容的提问来源于stack exchange,提问作者Lucky

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 23:22:53