如何基于哪个代理正在运行Azure DevOps构建管道来设置变量?

时间:2020-08-14 15:49:05

标签: azure-devops azure-devops-self-hosted-agent

我们有多个自托管的构建代理。我们的构建管道之一的步骤是将一些工件复制到网络驱动器。我们通过PowerShell脚本执行此操作,该脚本将目标作为参数。我们希望此目的地根据运行管道的代理(或代理池)而有所不同。

我想将用户定义的功能添加到指定此路径的代理中,但是您不能在管道中将其用作变量。

我也尝试过:

parameters:
- name: PoolName
  displayName: Pool Name
  type: string
  default: Pool A
  values:
  - Pool A
  - Pool B

pool:
  name: ${{ parameters.PoolName }}

variables:
  ${{ if eq(parameters.PoolName, 'Pool A') }}:
      BuildArchiveLocation:  'foo'
  ${{ if eq(parameters.PoolName, 'Pool B') }}:
      BuildArchiveLocation:  'bar'

但是在A template expression is not allowed in this context行收到了name: ${{ parameters.PoolName }}

有什么好方法吗?

2 个答案:

答案 0 :(得分:0)

奇怪的是,您不能在此级别使用运行时参数。但是,如果将池置于作业级别,则应该能够运行管道。所以请尝试:

parameters:
- name: PoolName
  displayName: Pool Name
  type: string
  default: Pool A
  values:
  - Pool A
  - Pool B

variables:
  ${{ if eq(parameters.PoolName, 'Pool A') }}:
      BuildArchiveLocation:  'foo'
  ${{ if eq(parameters.PoolName, 'Pool B') }}:
      BuildArchiveLocation:  'bar'

jobs:
- job: build
  displayName: Build and Test
  pool: 
    name: ${{ parameters.PoolName }}
  steps:
  - script: echo building $(Build.BuildNumber)

脚本通过了验证:

enter image description here

答案 1 :(得分:0)

我同样需要参数化池,但是我还需要在托管和私有构建代理之间切换。您必须按以下条件设置整个池节点。您不能将参数作为池节点的条件。

parameters:
  - name: BuildAgent
    type: string
    default: private
    values:
      - private
      - hosted

jobs:
- job: BuildJob
  displayName: Build
  ${{ if eq(parameters.BuildAgent, 'private') }}:
    pool: default #whatever your private agent pool name is
  ${{ if eq(parameters.BuildAgent, 'hosted') }}:
    pool:
      vmImage: windows-latest