根据条件参数在池上执行 Azure Devops 作业

Execute Azure Devops job on a pool based on conditional parameter

我正在尝试根据条件在特定池上执行 Azure Devops 作业。 目标是在自托管代理和 Microsoft 代理之间切换。 这是配置:

parameters:
  custom_agent: true

jobs:
  - job: Test
    displayName: Test job
  - ${{ if eq(parameters.custom_agent, true) }}:
    - pool:
      name: mypool
      demands:
        - agent.os -equals Linux
  - ${{ if eq(parameters.custom_agent, false) }}:
    - pool:
        vmImage: 'ubuntu-latest'
    steps:
      - task: npmAuthenticate@0

有什么想法吗?

看起来 pool 不是 job type

的有效 属性

试着把你的工作换成 deployment type:

职位:

  - deployment: Test
  - ${{ if eq(parameters.custom_agent, true) }}:
     pool:
      name: mypool
      demands:
        agent.os -equals Linux
    strategy:
        runOnce:    
          deploy:
            steps:

我们可以指定步骤、作业或阶段 运行 的条件。我们可以为管道中的作业配置不同的条件条目,并根据这些条件设置需求。

骨架版本如下所示:

parameters:
- name: custom_agent
  displayName: Pool Image
  type: boolean
  default: True

jobs:
  - job: selfhostedagent
    condition: eq(${{ parameters.custom_agent }}, True)
    displayName: 'self_hosted agent'
    pool:
      name: Default
      demands:
        - Agent.Name -equals WS-VITOL-01
    steps:
      - script: echo self_hosted agent

  - job: hostedagent
    condition: eq(${{ parameters.custom_agent }}, False)
    displayName: 'hosted agent'
    pool:
      vmImage: 'ubuntu-latest'
      
    steps:
      - script: echo hosted agent

更新1

此外,我们可以配置任务模板,然后在步骤中使用模板。

结果:

如果您使用非虚拟机池,另一种有条件地 select 池的方法:

variables:
- ${{ if eq(parameters.custom_agent, true) }}:
  - name: testJobPool
    value: mypool
- ${{ if eq(parameters.custom_agent, false) }}:
  - name: testJobPool
    value: mypool_second

jobs:
- job: Test
  displayName: Test job
  pool:
    name: $(testJobPool)
  steps:
    - task: npmAuthenticate@0

事实证明这是有效的。

下面的例子解决了我的需求

parameters:
  - name: 'vmImage'
    type: string
    default: 'ubuntu-latest'
  - name: 'agentPool'
    type: string
    default: ''

jobs:
  - job: 'Example'
    pool:
      ${{ if ne(parameters.agentPool, '') }}:
        name: ${{ parameters.agentPool }}
      ${{ if eq(parameters.agentPool, '') }}:
        vmImage: ${{ parameters.vmImage }}
    steps:
      - script: example