Azure Pipelines:将变量作为参数传递给模板

时间:2019-01-18 00:14:37

标签: azure-devops

我目前正在使用小型POC评估Azure Pipelines,我认为我遇到了一个限制,但想知道是否有人可以解决此问题。

这是我想要做的关键部分。

azure-pipelines.yml

variables:
  - name: FavouriteSportsTeam
    value: "Houston Rockets"
jobs:
  - template: Build1.yml
    parameters:
      SportsTeam: $(FavouriteSportsTeam)
  - template: Build2.yml
    parameters:
      SportsTeam: $(FavouriteSportsTeam)

Build1.yml

parameters:
  SportsTeam: "A Default Team"
jobs:
  - job: SportsTeamPrinter
    steps:
      - script: "echo ${{ parameters.SportsTeam }}"

现在,当我尝试运行此文件时,从azure-pipelines.yml文件传递的变量不会扩展,而是保留为“ $(FavouriteSportsTeam)”

是否可以将扩展变量作为参数传递给另一个文件?

4 个答案:

答案 0 :(得分:3)

将变量作为参数传递给模板可以正常工作。您的问题是您错误地声明了变量。效果很好:

azure-pipelines.yml

variables:
  FavouriteSportsTeam: "Houston Rockets"
jobs:
  - template: Build1.yml
    parameters:
      SportsTeam: $(FavouriteSportsTeam)
  - template: Build2.yml
    parameters:
      SportsTeam: $(FavouriteSportsTeam)

Build1.yml

parameters:
  SportsTeam: "A Default Team"
jobs:
  - job: SportsTeamPrinter
    steps:
      - script: "echo ${{ parameters.SportsTeam }}"

答案 1 :(得分:2)

我在模板中的部署作业中遇到了相同的问题,在该模板中,我尝试根据参数设置environment。模板参数将接收运行时变量$(Environment)

问题在于,在解释传递给environment的值时,运行时变量尚不可用。解决方案是不要以运行时语法传递变量,而是使用表达式语法 ${{ variables.environment }}

deploy-appservice.yml

parameters:
- name: environment # don't pass run-time variables

jobs:
- deployment: DeployAppService
  environment: ${{ parameters.environment }}
  strategy: [...]

azure-pipelines.yml

- stage: QA
  variables: 
    Environment: QA
  jobs:
  - template: templates/deploy-appservice.yml
    parameters:
      environment: ${{ variables.environment }} # use expression syntax

如果您错误地传递了运行时变量$(Environment),则此字符串是部署作业将尝试命名Azure DevOps环境的字符串。我猜,由于这不是一个有效的名称,因此它将使用Test作为后备名称,然后该名称会出现在“环境”菜单中。

答案 2 :(得分:0)

是,但是您必须使用format()函数:

Inline: |
  ${{ format('$Tags = (Get-AzureRmResourceGroup -Name {0}).Tags
  $Tags.Version = "$(Build.BuildNumber)"
  $Tags.FailedVersion = "-"; Set-AzureRmResourceGroup -Name {0} -Tag $Tags',
        parameters.resourceGroupName ) }}

这是一个例子。您还可以将其设置为多行以提高可读性。

https://github.com/Microsoft/azure-pipelines-agent/issues/1686

答案 3 :(得分:0)

我想在初始化变量之前先评估模板参数。这就是为什么您得到$(FavouriteSportsTeam)而不是变量值的原因

我试图以不同的方式从变量中设置模板参数值,但是没有运气

在模板参数值中,可以使用format来解析,也可以不使用(使用$ {{}}来解析),如

#template1
parameters:
  poolname: dev4-kyiv
  versionFile: ''

jobs:
  - job: versionJob 
    pool:
      name: ${{ parameters.poolname }}
    steps:
      - powershell: |
          Write-Host ("${{ parameters.versionFile }}")

或带有局部模板变量

#template2
parameters:
  releaseFilePath: ''
  packageTags: '' 
jobs:
  - job: build
    variables:
      releaseNotesFile: '${{ parameters.releaseFilePath }}/releaseNotes.txt'
      tags: '${{ parameters.packageTags }}'

但是我找不到使用模板的主脚本中的变量来设置模板参数值的方法。