Условная вставка конвейеров Azure YAML не работает

Рассмотрим следующий фрагмент конвейера, это часть шаблона.

- task: Bash@3
  inputs:
    targetType: 'inline'
    script: |
      echo "##vso[task.setvariable variable=AppType;]WebJob"
      echo "##[debug] AppType set to WebJob"

# This works, using the task condition
- task: DotNetCoreCLI@2
  condition: eq(variables['AppType'], 'WebJob')
  displayName: 'net publish for WebJob'
  inputs:
    command: 'publish'

# This doesn't work, using the conditional insertion, index syntax
- ${{ if eq(variables['AppType'], 'WebJob') }}:
  - task: DotNetCoreCLI@2
    displayName: 'net publish for WebJob'
    inputs:
      command: 'publish'

# This also doesn't work, using the conditional insertion, property dereference syntax
- ${{ if eq(variables.AppType, 'WebJob') }}:
  - task: DotNetCoreCLI@2
    displayName: 'net publish for WebJob'
    inputs:
      command: 'publish'

Почему условие задачи работает, а условная вставка - нет? Со вторым я не получаю никаких ошибок, просто задачи нет, например, условие if не выполняется.


person goosseno    schedule 25.12.2020    source источник
comment
Не получать последнюю информацию. Просто хотите проверить, полезны ли для вас приведенные ниже ответы? Если да, вы можете принять один в качестве ответа, который также может принести пользу другим, у которых есть та же головоломка с вами, и мы могли бы заархивировать эту ветку. Кроме того, не стесняйтесь оставлять комментарии ниже, если у вас все еще есть какие-то проблемы :-)   -  person Hugh Lin    schedule 31.12.2020


Ответы (3)


Синтаксис ${{}} оценивается во время компиляции шаблона, а не во время выполнения, поэтому задача будет удалена из рабочего процесса, когда задание настраивается, поскольку переменная еще не существует, она не ждет, пока ей действительно нужно запустить задача оценить состояние.

Вы можете использовать условный синтаксис $[] для оценки времени выполнения или полагаться на condition:syntax.

Из документов:

# Two examples of expressions used to define variables
# The first one, a, is evaluated when the YAML file is compiled into a plan.
# The second one, b, is evaluated at runtime.
# Note the syntax ${{}} for compile time and $[] for runtime expressions.
variables:
  a: ${{ <expression> }}
  b: $[ <expression> ]

Видеть:

person jessehouwing    schedule 25.12.2020
comment
Спасибо за объяснение. Синтаксис - $[ if eq(variables.AppType, 'WebJob') ]: недопустим. - person goosseno; 26.12.2020
comment
Вы случайно не используете сервер Azure DevOps? - person 4c74356b41; 26.12.2020
comment
Я не думаю, что условие выполнения в этом контексте является допустимым. Условное выражение шаблона должно использовать синтаксис выражения времени компиляции. docs.microsoft.com/en-us/azure/devops/ конвейеры / процесс / - person jessehouwing; 26.12.2020

Условная вставка конвейеров YAML Azure не работает

Как мы знаем, синтаксис ${{}} для времени компиляции:

Выражения

# Note the syntax ${{}} for compile time and $[] for runtime expressions.

Итак, когда мы выполняем конвейер, условная вставка ${{ if eq(variables['AppType'], 'WebJob') }} уже была оценена, однако задача Bash не была запущена, значение AppType всегда будет null. Это причина, по которой условная вставка не работает.

Чтобы решить эту проблему, мы могли бы определить переменную напрямую:

 variables:
   AppType: WebJob

Или мы могли бы определить параметры времени выполнения:

parameters:
  - name: AppType
    displayName: AppType
    default: WebJob
person Leo Liu-MSFT    schedule 30.12.2020
comment
Спасибо, вы сэкономили мне массу времени. Объяснение должно быть написано КРАСНЫМ цветом в верхней части документации по выражениям, переменным и условиям для Azure Pipelines. - person Pavel Sapehin; 18.01.2021

Я проверил ваше состояние на конвейере и изменил его вот так, и он работает правильно. вам следует изменить синтаксис условия, и все будет правильно.

- task: Bash@3
  inputs:
   targetType: 'inline'
   script: |
     echo "##vso[task.setvariable variable=AppType;]WebJob"
     echo "##[debug] AppType set to WebJob"
- task: CmdLine@2
  inputs:
    script: echo Key:'$(AppType)' 
# This doesn't work, using the conditional insertion, index syntax
  ${{ if eq(variables['AppType'], 'WebJob') }}:
- task: CmdLine@2
  inputs:
    script: echo Key:'$(AppType)'
# This also doesn't work, using the conditional insertion, property dereference syntax
  ${{ if eq(variables.AppType, 'WebJob') }}:
- task: CmdLine@2
  inputs:
    script: echo Key:'$(AppType)'

Я рекомендую вам попробовать код Visual Studio и расширение или любой ide, чтобы исправить ваш файл YAML.

person iman ansari    schedule 01.01.2021