$ {{if}} Синтаксис в Azure DevOps YAML - PullRequest
0 голосов
/ 02 августа 2020

У меня есть пул самостоятельно размещенных виртуальных машин (MyTestPool), половина из которых предназначена для установки и тестирования сборки «ON» (в которой включено несколько функций) и сборки «OFF» (это установка по умолчанию). Все мои тестовые виртуальные машины агента имеют "ВСЕ" как определяемую пользователем возможность. Половина из них также помечена как 'ON', а другая половина 'OFF'.

Теперь у меня есть 2 этапа, называемые DEPLOYOFF и DEPLOYON, которые можно пропустить, если переменная группы переменных 'skipDeployOffStage' или 'skipDeployOnStage' имеет значение установлено значение true. Я бы хотел использовать «ВСЕ» в качестве требования агента, если нужно тестировать только ВКЛ / ВЫКЛ. Если должны быть протестированы как ВКЛ, так и ВЫКЛ, соответствующий этап потребует их соответствующих ВМ 'ВКЛ' или 'ВЫКЛ'.

Вопрос: $ {{if}} НЕ РАБОТАЕТ.

trigger: none
pr: none


pool: 'MyBuildPool'

variables:
  - group: TEST_IF_VARIABLE_GROUP
  - name: subPool
    value: 'ON'
  - name: useAllPool
    value: $[ or(eq( variables.skipDeployOnStage, true), eq( variables.skipDeployOffStage, true)) ]
    
stages:
- stage: DEPLOYOFF
  condition: ne(variables['skipDeployOffStage'], 'true')

  variables:
    # The test stage's subpool
    ${{ if variables.useAllPool }}:
      subPool: 'ALL'
    ${{ if not(variables.useAllPool)  }}:
      subPool: 'OFF'

  pool: 
    name: 'MyTestPool'
    demands: 
      - ${{ variables.subPool }}

  jobs:
  - job:

    steps:
    - checkout: none
    - pwsh: |
        Write-Host ("Value of useAllPool is: {0}" -f '$(useAllPool)')
        Write-Host ("Value of VG variable 'skipDeployOnStage' is {0} and 'skipDeployOffStage' is {1}" -f '$(skipDeployOnStage)', '$(skipDeployOffStage)')
        Write-Host ("Subpool is {0}" -f '$(subPool)')
      displayName: 'Determined SubPool'

Вывод, когда один из флагов ложен:

2020-08-02T18:39:05.5849160Z Value of useAllPool is: True
2020-08-02T18:39:05.5854283Z Value of VG variable 'skipDeployOnStage' is true and 'skipDeployOffStage' is false 
2020-08-02T18:39:05.5868711Z Subpool is ALL

Вывод, когда оба ложны:

2020-08-02T18:56:40.5371875Z Value of useAllPool is: False
2020-08-02T18:56:40.5383258Z Value of VG variable 'skipDeployOnStage' is false and 'skipDeployOffStage' is false
2020-08-02T18:56:40.5386626Z Subpool is ALL

Что мне не хватает?

Ответы [ 2 ]

1 голос
/ 03 августа 2020

Есть две проблемы, из-за которых ваш код работает некорректно:

1. ${{if}}: вы пишете ${{if}} неверно, и правильный сценарий:

${{ if eq(variables['useAllPool'], true)}}:
   subPool: 'ALL'
${{ if ne(variables['useAllPool'], true)}}:
   subPool: 'OFF'

2. Определение переменных. UseAllPool: вы используете выражение времени выполнения ($[ <expression> ]), поэтому, когда ${{if}} работает, значение variables.useAllPool равно '$[ or(eq( variables.skipDeployOnStage, true), eq( variables.skipDeployOffStage, true)) ]' вместо true или false.

Чтобы решить эту проблему, необходимо использовать выражение времени компиляции ${{ <expression> }}.

Однако при использовании выражения времени компиляции оно не может содержать переменные из групп переменных. Итак, вам нужно переместить переменные skipDeployOnStage и skipDeployOffStage из группы переменных в файл YAML.

Итак, вы можете решить проблему, выполнив следующие шаги:

1. Удалите переменные skipDeployOnStage и skipDeployOffStage из группы переменных TEST_IF_VARIABLE_GROUP.

2. Измените файл YAML:

trigger: none
pr: none
 
 
pool: 'MyBuildPool'
 
variables:
  - group: TEST_IF_VARIABLE_GROUP
  - name: subPool
    value: 'ON'
  - name: skipDeployOnStage
    value: true
  - name: skipDeployOffStage
    value: false
  - name: useAllPool
value: ${{ or(eq( variables.skipDeployOnStage, true), eq( variables.skipDeployOffStage, true)) }}
    
stages:
- stage: DEPLOYOFF
  condition: ne(variables['skipDeployOffStage'], 'true')
 
  variables:
    # The test stage's subpool
    ${{ if eq(variables['useAllPool'], true)}}:
      subPool: 'ALL'
    ${{ if ne(variables['useAllPool'], true)}}:
      subPool: 'OFF'
  pool: 
    name: 'MyTestPool'
    demands: 
      - ${{ variables.subPool }}
 
  jobs:
  - job:
 
    steps:
    - checkout: none
    - pwsh: |
        Write-Host ("Value of useAllPool is: {0}" -f '$(useAllPool)')
        Write-Host ("Value of VG variable 'skipDeployOnStage' is {0} and 'skipDeployOffStage' is {1}" -f '$(skipDeployOnStage)', '$(skipDeployOffStage)')
        Write-Host ("Subpool is {0}" -f '$(subPool)')
      displayName: 'Determined SubPool'

Вы можете изменить значение skipDeployOnStage и skipDeployOffStage в файле YAML, чтобы проверить, работает ли это решение.

0 голосов
/ 19 августа 2020

Мое требование:

  • Иметь собственный пул виртуальных машин, скажем, 20 машин пусто) 10 из них имеют
  • «ВКЛ» в качестве возможности пользователя (имя как «ВКЛ.» и значение как пустое)
  • Все они имеют «ВСЕ» в качестве дополнительной возможности пользователя
  • Конвейер в основном устанавливает 2 варианта продуктов и запускает тесты на них на назначенных машинах в пуле (ВКЛ. / ВЫКЛ.)
  • Когда пользователь хочет запускать как ВЫКЛЮЧЕННЫЕ, так и ВКЛЮЧЕННЫЕ развертывания, у меня есть этапы которые требуют ВЫКЛЮЧЕНИЯ или ВКЛЮЧЕНИЯ
  • То, что я хочу сделать, это когда пользователь хочет только ВКЛ или ВЫКЛ развертывание, чтобы сэкономить время, я хочу использовать все 20 машин, развернуть и протестировать, чтобы уменьшить общее тестирование time.

Я тщетно пытался заменить потребность в пуле во время выполнения, поскольку я не хотел каждый раз обновлять возможности пользователей для 20-50 виртуальных машин непосредственно перед запуском. Это то, что мне нужно сделать, если использовать традиционный синтаксис спроса:

  pool: 
    name: 'MyTestPool'
    demands: 
      # There's no OR or other syntax supported here
      # LVALUE must be a built-in variable such as Agent.Name OR a User capability
      # I will have to manually change the DeploymentType before the pipeline is run
      - DeploymentType -equals $(subPool)  

Итак, я пытался определить значение вспомогательного пула во время выполнения и использовать приведенный ниже синтаксис, поэтому мне не нужно вручную настроить возможности пользователя перед запуском.

pool:
  name: ${{ parameters.pool }}
  demands:
    - ${{ parameters.subPool}}

Вот мое исследование:

Вы определенно можете смешивать выражения времени компиляции и выполнения. Выражение времени компиляции оценивает значение, которое было во время компиляции. Если это выражение или переменная (а не константа), все выражение или переменная подставляется как примечания Jane Ma-MSFT.

Например, я смог использовать переменные времени очереди в выражениях времени компиляции без проблем. Например, я использовал, какой пул использовать в качестве переменной времени очереди, а затем передал его в шаблон, который использует синтаксис времени компиляции для значения.

parameters:
  - name: pool
    type: string  

jobs:
  - job: ExecAllPrerequisitesJob
    displayName: 'Run Stage prerequisites one time from a Single agent'

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

Однако реальная проблема заключается в где вы используете выражение времени компиляции. По сути, в приведенном выше примере весь $ {{parameters.pool}} заменяется на $ (buildPool), переменную времени очереди во время компиляции. Но пул поддерживает использование переменной для имени пула. Это настолько запутано и недокументировано, где вы можете использовать выражения, переменные (компилировать или запускать) и где вы должны использовать константы.

Один из таких примеров:

jobs:
- job: SliceItFourWays
  strategy:
    parallel: 4  # $[ variables['noOfVMs'] ] is the ONLY syntax that works to replace 4

В некоторых местах, например Требуется пул, синтаксический анализатор YAML от Microsoft послушно заменяет переменную. Однако среда выполнения не поддерживает пользовательские переменные как LVALUE.

Она поддерживает оценку пользовательских переменных времени выполнения только в части запроса RVALUE.

  pool: 
    name: ${{ parameters.buildPool }} # Run time supports variables here
    demands: 
      - ${{ parameters.subPool }}  # Must be resolved to a CONSTANT at compile time

Заключение:

ВНЕДРЕНИЕ MICROSOFT YAML ОТСТУПАЕТ!

...