当阶段与不同的变量组相关联时,变量扩展在 Azure DevOps Yaml 管道中无法按预期工作

Variable expansion not working as expected in Azure DevOps Yaml Pipeline when stages are associated with different variable groups

我在 运行 下面的管道时收到错误消息 'Job Job1: Environment $(environmentName) could not be found. The environment does not exist or has not been authorized for use.'。


trigger:
- main

pool:
  vmImage: ubuntu-latest

stages:
  - stage: Dev
    variables:
      - group: Config.Dev
    jobs:
      - deployment:
        environment: $(environmentName)
        strategy: 
          runOnce:
            deploy:
              steps:
              - checkout: self 
              - task: AzureCLI@2
                inputs:
                  azureSubscription: $(azureSubscriptionName)
                  scriptType: 'bash'
                  scriptLocation: 'inlineScript'
                  inlineScript: |
                    az deployment sub create --location uksouth --template-file main.bicep

  - stage: Prd
    variables:
      - group: Config.Prd
    jobs:
      - deployment:
        environment: $(environmentName)
        strategy: 
          runOnce:
            deploy:
              steps:
              - checkout: self 
              - task: AzureCLI@2
                inputs:
                  azureSubscription: $(azureSubscriptionName)
                  scriptType: 'bash'
                  scriptLocation: 'inlineScript'
                  inlineScript: |
                    az deployment sub create --location uksouth --template-file main.bicep
                

你不能那样做。它必须是 yaml 变量。这是你无法克服的限制。所以你需要在 YAML 中定义你的变量,或者直接硬编码环境名称。

您有没有对环境名称进行硬编码的原因?如果目的是让您的代码保持干燥,我建议将您的部署阶段放入模板文件中。然后为传入环境名称作为参数的每个部署调用模板。

蔚蓝-pipelines.yml

trigger:
- main

pool:
  vmImage: ubuntu-latest

stages:
  - template: deploy.yml
    parameters: 
      environment: Dev
  - template: deploy.yml
    parameters: 
      environment: Prd

deploy.yml

parameters:
  - name: environment
    type: string

stages:
 - stage: ${{parameters.environment}}
    variables:
      - group: Config.${{parameters.environment}}
    jobs:
      - deployment:
        environment: ${{parameters.environment}}
        strategy: 
          runOnce:
            deploy:
              steps:
              - checkout: self 
              - task: AzureCLI@2
                inputs:
                  azureSubscription: AzureSub.${{parameters.environment}}
                  scriptType: 'bash'
                  scriptLocation: 'inlineScript'
                  inlineScript: |
                    az deployment sub create --location uksouth --template-file main.bicep

您必须更新您的订阅名称才能像您的变量组一样具有标准的命名约定。这将使代码保持干燥并使添加环境变得容易。它还使用模板表达式,因此环境名称在 运行 时间之前展开。

首先,错误发生是因为您没有创建环境的权限。在您的问题中,它搜索名为“$(environmentName)”的环境,但找不到也无法创建环境。

请检查此处的安全性。创建者可以创建环境。


其次,正如其他答案所解释的那样,您不能使用 $(environmentName) 来获取变量中的值。它会在名为“$(environmentName)”的环境中 运行 就像这个截图。

我按如下方式解决了我的问题。

它依赖于命名相同的环境、服务连接和变量组。

蔚蓝-pipelines.yml

trigger:
- main

pool:
  vmImage: ubuntu-latest

stages:
  - template: deploy.yml
    parameters: 
      environment: Dev
  - template: deploy.yml
    parameters: 
      environment: UAT
  - template: deploy.yml
    parameters: 
      environment: Prd

deploy.yml

parameters:
  - name: environment
    type: string

stages:
  - stage: ${{parameters.environment}}
    variables:
      - group: Simply.Infrastructure.${{parameters.environment}}    
    jobs:
      - deployment:
        environment: ${{parameters.environment}}
        strategy: 
          runOnce:
            deploy:
              steps:
              - checkout: self 
              - task: AzureCLI@2
                inputs:
                  azureSubscription: ${{parameters.environment}}
                  scriptType: 'bash'
                  scriptLocation: 'inlineScript'
                  inlineScript: |
                    az deployment sub create --location uksouth --template-file main.bicep --parameters "{ \"environmentName\": { \"value\": \"$(environmentName)\" }, \"versionNumber\": { \"value\": \"$(versionNumber)\" } }"

main.bicep

targetScope = 'subscription'

param environmentName string
param versionNumber string

resource resourceGroup 'Microsoft.Resources/resourceGroups@2021-04-01' = {
  name: 'Simply.Infrastructure.${versionNumber}'
  location: 'uksouth'
} 

module vnet './vnet.bicep' = {
  name: 'vnet'
  scope: resourceGroup   
  params: {
    name: 'smplyinf${toLower(environmentName)}${versionNumber}'
  }
}

请取消对变量库中变量组的限制。它将解决问题,并且所有 user/schedule 都可以解决其 运行.

的变量