我正在尝试使用以下配置根据分支是开发、发布还是主控来设置要使用的变量模板:
管道.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.
所以看起来它没有识别我的变量。我怎样才能让它读取实际值?
根据更新,我们可以看到该管道在宏语法中使用变量
$(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)"