Использовать stageDependencies в операторах if в Azure DevOps yaml

У меня довольно сложная настройка конвейеров в Azure DevOps по разным причинам, но сейчас я застрял в особом сценарии. Позвольте мне немного объяснить.

Существует Stage_A с Job_A, устанавливающим Variable_A. Теперь есть Stage_B с Job_B, нужно использовать Variable_A из Stage_A.Job_A.

Переменная в Job_A устанавливается следующим образом:

echo ##vso[task.setvariable variable=Variable_A;isOutput=true]$value

Теперь Job_B в Stage_B может получить доступ к переменной в условии с

variables: 
          Variable_A_FromStageA: $[stageDependencies.Stage_A.Job_A.outputs['task_A.Variable_A']]

Я также могу сделать эхо для переменной, используя

echo $(Variable_A_FromStageA)

Вопрос в том, как я могу использовать это в if-операторе? Я пробовал разные подходы:

- ${{ if eq($(Variable_A_FromStageA), 'True') }}:

- ${{ if eq(variables.Variable_A_FromStageA, 'True') }}:

- ${{ if eq(variables['Variable_A_FromStageA'], 'True') }}:

- ${{ if eq(stageDependencies.Stage_A.Job_A.outputs['task_A.Variable_A'], "True") }}:

На самом деле ничего не работает. Либо система жалуется на проблемы с синтаксисом, либо неправильно его оценивает. Я действительно не знаю, как использовать информацию в моем выражении if в файле yaml. Документация не очень ясна по этому поводу. В нем упоминается только использование зависимости от стадии в условии, и все. Надеюсь, кто-нибудь может помочь мне здесь!

Ваше здоровье, Откровенный

Это может быть глупый вопрос, но тем не менее, вы добавили двоеточие (:) в конце оператора if?

Dilly B 24.11.2022 18:14

Я думаю, это просто потерялось при копировании строки. Двоеточие есть :)

fmode 25.11.2022 08:14

@fmode Привет, ты проверил мое предложение? Помогает решить вашу проблему?

RoyWang-MSFT 28.11.2022 02:40
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
3
483
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

использовать stageDependencies в операторах if в Azure DevOps yaml

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

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

Правильный способ - использовать «условие» вместо «Условная вставка». Использование условия может достичь вашей ситуации.

Я пишу демо для вас, как показано ниже:

trigger:
- none
pool:
  vmImage: ubuntu-latest
stages:
- stage: A
  jobs:
  - job: A1
    steps:
     - bash: echo "##vso[task.setvariable variable=shouldrun;isOutput=true]true"
     # or on Windows:
     # - script: echo ##vso[task.setvariable variable=shouldrun;isOutput=true]true
       name: printvar
- stage: B
  condition: and(succeeded(), eq(dependencies.A.outputs['A1.printvar.shouldrun'], 'true'))
  variables:
      myStageAVar: $[stageDependencies.A.A1.outputs['printvar.shouldrun']]
  dependsOn: A
  jobs:
  - job: B1
    steps:
    - script: echo $(myStageAVar)

Привет RoyWang, спасибо за ваше предложение. Мне нужно проверить это с нашей настройкой, но это похоже на работоспособное решение. Тем не менее, это оставит нам много «зомби»-шагов в конвейере, что не очень приятно. У меня сложилось впечатление, что этап, который зависит от другого, оценивается после завершения первого. Но похоже, что конвейеры очень ограничены в динамической оценке.

fmode 28.11.2022 10:43

Привет @RoyWang, я думаю, что предложенное вами решение не работает в нашем случае использования. Параметр используется для управления выполнением набора задач, добавленных в качестве шаблонов во всем конвейере. несколько задач A - условные задачи B - несколько задач C. Задачи C могут быть выполнены только в случае успешного выполнения A. Когда B опущен, выполните C, но если B был запущен, выполните C, только когда B был успешным. Условия нельзя использовать для вызовов шаблона, а помещать условие в шаблон не вариант, потому что оно не всегда нужно, только в особом случае. Это привело бы к огромной перегрузке параметров.

fmode 28.11.2022 15:26

Другие вопросы по теме