Azure Dev Ops - 基于表达式设置变量模板

问题描述 投票:0回答:1

我正在尝试使用以下配置根据分支是开发、发布还是主控来设置要使用的变量模板:

管道.yml

variables:
  - template: ../vars/global.yml
  - ${{ if eq( variables.isDev , 'True' ) }}:
      - template: ../vars/dev.yml
  - ${{ if eq( variables.isRelease , 'True' ) }}:
      - template: ../vars/stage.yml
  - ${{ if eq( variables.isMaster , 'True' ) }}:
      - template: ../vars/prod.yml


stages:
  - template: ../stages/build.yml
  - template: ../stages/deploy.yml
    parameters:
      dmEnvironment: $(dmEnvironment)
      environment: $(environment)

dev.yml

variables:
  dmEnvironment:         Data-Marketplace-Dev
  environment:           dev

全局.yml

variables:

  # Branches
  masterBranch:          refs/heads/master
  developBranch:         refs/heads/an-update-templates
  releaseBranch:         refs/heads/stage

  # Pipeline conditions
  isMaster:              ${{ eq(variables['Build.SourceBranch'], variables.masterBranch) }}
  isDev:                 ${{ eq(variables['Build.SourceBranch'], variables.developBranch) }}
  isRelease:             ${{ eq(variables['Build.SourceBranch'], variables.releaseBranch) }}
  isPR:                  ${{ eq(variables['Build.Reason'], 'PullRequest') }}
  isScheduled:           ${{ eq(variables['Build.Reason'], 'Schedule') }}
  isManual:              ${{ eq(variables['Build.Reason'], 'Manual') }}

部署.yml

stages:
  - stage: Deployment
    dependsOn: Build
    jobs:
      - deployment: DeploymentJob
        environment: $(dmEnvironment)
        timeoutInMinutes: 0
        workspace:
          clean: all
        strategy:
          runOnce:
            deploy:
              steps:
                - template: ../steps/retrieve_akv.yml
                  parameters:
                    azure_service_connection: $(starburstService)
                    key_vault_name: $(starburstKeyVaultName)
                - template: ../steps/tag_successful_deployment.yml
                  parameters:
                    azure_service_connection: $(edlService)
                    tag: $(environment)

但是我收到错误

Job Dev: Environment $(dmEnvironment) could not be found. The environment does not exist or has not been authorized for use.
所以看起来它没有识别我的变量。我怎样才能让它读取实际值?

azure azure-devops
1个回答
0
投票

根据更新,我们可以看到该管道在宏语法中使用变量

$(dmEnvironment)
来定义模板
environment
deployment job
deploy.yml
属性。这是不正确的,因为环境资源应该在编译时而不是运行时决定,而宏语法变量在运行时编译后进行处理。因此,我们只能观察到环境变量名
$(dmEnvironment)
,而看不到它的值,因为它在编译时没有扩展。这是帮助我们理解变量语法的文档。

然而,即使我们选择使用像

${{ varialbes.dmEnvironment ]}
这样的编译时模板表达式,它也只能扩展为空
''
,因为它是在${{ if eq( variables.isDev , 'True' ) }}:
变量块中以
pipeline.yml
为条件动态定义的。
要动态使用阶段模板和相应的变量模板,我建议修改 YAML 管道结构,如下所示。

管道.yml

variables: - template: ../vars/global.yml stages: - template: ../stages/build.yml - ${{ if eq( variables.isDev , 'True' ) }}: - template: ../stages/deploy.yml

部署.yml

stages: - stage: Deployment dependsOn: Build variables: - template: ../vars/dev.yml # Expand variable template dev.yml inside stage template deploy.yml jobs: - deployment: DeploymentJob environment: ${{ variables.dmEnvironment }} # Use compile time template expression rather than macro syntax timeoutInMinutes: 0 workspace: clean: all strategy: runOnce: deploy: steps: - script: | echo "dmEnvironment is $(dmEnvironment)" # Use macro syntax of variables at runtime echo "environment is $(environment)"

Image

© www.soinside.com 2019 - 2024. All rights reserved.