Определение yaml конвейера Azure DevOps: параметр всегда включает выбираемое значение, даже если он не отмечен

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

---
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 содержит все определенные этапы, а не все выбранные этапы.

То, как вы подходите к этому, странно. Почему бы не сделать каждый этап отдельным параметром bool?

Daniel Mann 17.04.2023 21:07

кроме того, если вы можете сопоставить свои шаблоны с вашими сценическими именами, я бы рекомендовал цикл над объектами.

DreadedFrost 17.04.2023 22:09

@DanielMann Я не разрабатывал эту установку, но мне нужно ее поддерживать. Тотальный рефакторинг желателен и, возможно, самый правильный вариант, но сейчас я не могу этого сделать. Тем не менее, даже если это «странно», я не понимаю, почему параметр и логические переменные ведут себя так, как они.

AbianG 18.04.2023 11:32
Стоит ли изучать 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 называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
68
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Проблема:

Я перепутал две разные вещи.

Параметр deploy_stages определяется нашим конвейером и отличается от внутреннего механизма, используемого Azure Devops, чтобы отметить, какие этапы были выбраны для выполнения.

Поэтому я ожидал, что один механизм (селектор Azure DevOps) изменит результаты другого, пользовательского параметра deploy_stages.

Как ссылаться на этапы, выбранные для запуска:

Во время разговоров со службой поддержки MS была ссылка на переменную (variables['RELEASE_SELECTED_STAGES']), которая якобы содержала информацию об этапах, выбранных с помощью «Этапы для запуска» в «Дополнительных параметрах», но позже они это отрицали. Согласно ответам, которые дал мне MS, в настоящее время нет возможности указать, какие этапы были выбраны для запуска.

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