Я столкнулся с проблемой, когда параметр конвейера, используемый для выбора этапов для запуска, определяется как:
---
parameters:
- name: deploy_stages
type: object
default:
- Deploy_A
- Deploy_B
- Deploy_C
stages:
- stage: First_Stage
displayName: First
jobs:
- template: template1.yml
parameters:
b_selected: ${{ contains(join(' ', parameters.deploy_stages), 'Deploy_B') }}
stages_used: ${{ join(' ', parameters.deploy_stages) }}
- stage: Deploy_A
displayName: Deploy A
jobs:
- template: deploy-a.yml
condition: and(contains('${{ join(' ', parameters.deploy_stages) }}', 'Deploy_A'), succeeded())
- stage: Deploy_B
displayName: Deploy B
jobs:
- template: deploy-b.yml
condition: and(contains('${{ join(' ', parameters.deploy_stages) }}', 'Deploy_B'), succeeded())
- stage: Deploy_C
displayName: Deploy C
jobs:
- template: deploy-c.yml
condition: and(contains('${{ join(' ', parameters.deploy_stages) }}', 'Deploy_C'), succeeded())
Перед запуском конвейера я могу выбрать или отменить выбор этапов, нажав Stages to run
в дополнительных параметрах:
Это позволяет мне выбирать, какие этапы будут выполняться (см. First_Stage запускается перед всеми остальными, но ему нужно знать, выбраны ли другие или нет). Так что если condition
включено в параметр b_selected
, это будет правда.
Проблема в том, что независимо от того, выбран этап или нет, указанная выше переменная Deploy_B
всегда будет истинной. Таким образом, в шаблоне deploy_stages
, используемом для определения First_Stage, я хочу использовать переменную в:
- job: DEBUG_Parameter
displayName: "DEBUG if Deploy_B is selected"
variables:
variable1: ${{ parameters.b_selected }}
variable2: ${{ parameters.stages_used }}
steps:
- script: |
echo $(variable1) variable value
echo STAGES $(variable2)
if [[ $(variable1) == "True" ]]; then
echo Deploy_B selected
fi
Задание выводит, что переменная равна b_selected
и что значения в template1.yml
— это все этапы по умолчанию, которые я использую для определения параметра в конвейере (Deploy_A, Deploy_B и Deploy_C), даже если я вручную отменяю выбор одного из них.
Попытка устранения неполадок: если я изменю сравнение на что-то, что, как я знаю, никогда не будет существовать в параметре, это будет True
(т. е. если я изменю строку на parameters.stages_used
Единственный способ заставить его работать так, как ожидалось, - это закомментировать этап из определений параметров по умолчанию, но он не является динамическим. Я хочу иметь возможность выбирать этапы перед каждым запуском, выбирая их.
то есть: это также приводит к выводу false:
---
parameters:
- name: deploy_stages
type: object
default:
- Deploy_A
#- Deploy_B
- Deploy_C
stages:
[...]
Поскольку этот же метод используется в том же конвейере для выбора определенных этапов для запуска или нет, поэтому я не могу понять, почему он не может правильно оценить логическое значение. Я не знаю, почему False
содержит все определенные этапы, а не все выбранные этапы.
кроме того, если вы можете сопоставить свои шаблоны с вашими сценическими именами, я бы рекомендовал цикл над объектами.
@DanielMann Я не разрабатывал эту установку, но мне нужно ее поддерживать. Тотальный рефакторинг желателен и, возможно, самый правильный вариант, но сейчас я не могу этого сделать. Тем не менее, даже если это «странно», я не понимаю, почему параметр и логические переменные ведут себя так, как они.
Я перепутал две разные вещи.
Параметр deploy_stages
определяется нашим конвейером и отличается от внутреннего механизма, используемого Azure Devops, чтобы отметить, какие этапы были выбраны для выполнения.
Поэтому я ожидал, что один механизм (селектор Azure DevOps) изменит результаты другого, пользовательского параметра deploy_stages
.
Во время разговоров со службой поддержки MS была ссылка на переменную (variables['RELEASE_SELECTED_STAGES']
), которая якобы содержала информацию об этапах, выбранных с помощью «Этапы для запуска» в «Дополнительных параметрах», но позже они это отрицали. Согласно ответам, которые дал мне MS, в настоящее время нет возможности указать, какие этапы были выбраны для запуска.
То, как вы подходите к этому, странно. Почему бы не сделать каждый этап отдельным параметром
bool
?