Мое требование:
- Иметь собственный пул виртуальных машин, скажем, 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 ОТСТУПАЕТ!