У меня довольно сложная настройка конвейеров в 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. Документация не очень ясна по этому поводу. В нем упоминается только использование зависимости от стадии в условии, и все. Надеюсь, кто-нибудь может помочь мне здесь!
Ваше здоровье, Откровенный
Я думаю, это просто потерялось при копировании строки. Двоеточие есть :)
@fmode Привет, ты проверил мое предложение? Помогает решить вашу проблему?
использовать 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, спасибо за ваше предложение. Мне нужно проверить это с нашей настройкой, но это похоже на работоспособное решение. Тем не менее, это оставит нам много «зомби»-шагов в конвейере, что не очень приятно. У меня сложилось впечатление, что этап, который зависит от другого, оценивается после завершения первого. Но похоже, что конвейеры очень ограничены в динамической оценке.
Привет @RoyWang, я думаю, что предложенное вами решение не работает в нашем случае использования. Параметр используется для управления выполнением набора задач, добавленных в качестве шаблонов во всем конвейере. несколько задач A - условные задачи B - несколько задач C. Задачи C могут быть выполнены только в случае успешного выполнения A. Когда B опущен, выполните C, но если B был запущен, выполните C, только когда B был успешным. Условия нельзя использовать для вызовов шаблона, а помещать условие в шаблон не вариант, потому что оно не всегда нужно, только в особом случае. Это привело бы к огромной перегрузке параметров.
Это может быть глупый вопрос, но тем не менее, вы добавили двоеточие (:) в конце оператора if?