如何在池需求中使用矩阵变量?

Her*_*des 8 azure-devops azure-pipelines-build-task azure-pipelines

对于Azure Pipelines yaml文件,我想在特定池中的每个代理上一次运行一组任务。当我查看工作策略矩阵时,它看起来是一个很好的解决方案,但是目前它无法提取我为此使用的变量。

与该问题相关的管道yaml文件是以下部分:

resources:
- repo: self

trigger: none

jobs:
- job: RunOnEveryAgent
  strategy:
    maxParallel: 3
    matrix:
      agent_1:
        agentName: Hosted Agent
      agent_2:
        agentName: Hosted VS2017 2
      agent_3:
        agentName: Hosted VS2017 3
  pool:
    name: Hosted VS2017
    demands:
    - msbuild
    - visualstudio
    - Agent.Name -equals $(agentName)

  steps:
  - (etc.)
Run Code Online (Sandbox Code Playgroud)

使用此脚本,我尝试设置一个矩阵以在池中的三个代理中的每个代理上运行一次。但是,当我尝试在需求列表中引用该代理时,它不会选择它。实际的错误信息如下:

[错误1]在满足指定要求的托管VS2017池中找不到代理:

msbuild

视觉工作室

Agent.Name-等于$(agentName)

Agent.Version -gtVersion 2.141.1

如果我硬编码的代理名称也的工作:

    demands:
    - msbuild
    - visualstudio
    - Agent.Name Hosted VS2017 3
Run Code Online (Sandbox Code Playgroud)

是否支持在池需求中使用这些变量?还是应该使用其他变量或表达式?

小智 6

parameters:
  - name: agentNames
    type: object
    default: []
jobs:
- job: RunOnEveryAgent
  strategy:
    matrix:
       ${{ each agentName in parameters.agentNames }}:
        ${{ agentName }}:
         agentName: ${{ agentName }}
  pool:
    name: Hosted VS2017
    demands:
    - msbuild
    - visualstudio
    - Agent.Name -equals $(agentName)
Run Code Online (Sandbox Code Playgroud)

如果您将来想添加更多代理,这将是一个更好的解决方案


Wim*_*dse 2

由于变量扩展的顺序,其中一些作业不支持变量。

但是,您可以做的是为您的作业策略使用模板包含语法(https://learn.microsoft.com/en-us/azure/devops/pipelines/process/templates?view=azure-devops)并传递代理名称作为参数。

因此,您的构建作业在其自己的 YAML 文件中可能如下所示:

parameters:
  agentName1: ''
  agentName2: ''
  agentName3: ''

jobs:
- job: RunOnEveryAgent
  strategy:
    maxParallel: 3
    matrix:
      agent_1:
        agentName: ${{ parameters.agentName1 }}
      agent_2:
        agentName: ${{ parameters.agentName2 }}
      agent_3:
        agentName: ${{ parameters.agentName3 }}
  pool:
    name: Hosted VS2017
    demands:
    - msbuild
    - visualstudio
    - Agent.Name -equals ${{ parameters.agentName3 }}

  steps:
Run Code Online (Sandbox Code Playgroud)

然后你的 mainazure-pipelines.yml会变成这样:

resources:
- repo: self

trigger: none

jobs:
  - template: buildjob.yml
    parameters:
      agentName1: 'Hosted Agent'
      agentName2: 'Hosted VS2017 2'
      agentName3: 'Hosted VS2017 3'
Run Code Online (Sandbox Code Playgroud)

  • 这个例子根本没有解决这个问题。重点是在需求中使用“agentName”,但在示例中它被硬编码为“${{parameters.agentName3 }}”。 (4认同)