Конвейер Azure Devops с дополнительным этапом, запускаемым вручную

Я использую конвейеры YAML Azure DevOps и имею два этапа: один — развертывание в разработке (запускается при фиксации в мастере), а второй — проверка запросов на включение (выполнение тестов и статический анализ). Эти этапы выполняются на основе переменных, например. variables['Build.Reason'] или variables['Build.SourceBranchName'].

Проверки запросов на включение устанавливаются в соответствии с требованиями политики ветвей, поэтому конвейер должен пройти проверку, прежде чем автор сможет объединить их.

Я хочу, чтобы автор вручную запускал развертывание для разработки из запроса на включение (например, из-за изменений в инфраструктуре, переменных среды и т. д.), чтобы убедиться, что все работает, прежде чем изменения будут объединены в исходную версию.

Пример 1: я меняю только одну функцию. Я хочу, чтобы конвейер успешно выполнил статический анализ и тесты, а затем объединил PR.

Пример 2. Я интегрирую новую внешнюю службу (например, электронную почту) и хочу убедиться, что все работает. Таким образом, конвейер запустит статический анализ и тесты и успешно завершится (и позволит мне выполнить слияние, если я захочу). Однако, поскольку это более серьезное изменение при внешней интеграции, на этом этапе я хочу запустить развертывание для разработки и проверить, все ли работает. Это по-прежнему делается из PR, а не из мастера, потому что я хочу исправить проблемы, если они возникнут, до того, как изменение будет передано в исходную версию.

В обоих случаях (Пример1 и Пример2) после того, как mege to master изменения будут развернуты в dev.

Что я пробовал до сих пор

  • Использование задачи ManualValidation@0: неприменимо, потому что тогда конвейер не будет успешным. Поскольку конвейер должен пройти до запроса на слияние, автор не может объединить его без развертывания в dev.
    Я не пробовал задания по развертыванию, но подозреваю, что они работают аналогично.
  • Используйте параметр, например DeployDevFromPR, который должен указывать, должен ли конвейер проверять код или развертывать его. Затем установите две политики ветвей: одну автоматическую и обязательную (проверки), а другую вручную и необязательную (развертывание). Однако нет возможности установить переменную env из представления PR (если только автор не запросит конвейер снова), поэтому проверка выполняется вручную.
  • Принимайте решение на основе переменной variables['Build.QueuedBy']: значение будет другим, когда конвейер запускается автоматически. Для пользователя указано его имя пользователя, а для автоматических триггеров — «Microsoft.VisualStudio.Services.TFS». Однако это не работает, если пользователь хочет перезапустить конвейер проверки (тогда пользователем будет QueuedBy).

Могу ли я каким-то образом добиться желаемого эффекта, чтобы разрешить пользователю развертывание из PR вручную, не блокируя слияние?

Спасибо

Это утверждение немного сбивает с толку: «разрешить автору вручную запускать развертывание для разработки из запроса на включение» — если сборка будет запускаться как часть проверки запроса на включение, она будет запущена автоматически. Может быть, настройка среды с утверждениями и использование ее в задании по развертыванию может помочь?

Rui Jarimba 12.08.2024 12:10

Можете ли вы поделиться примером конвейера YAML, чтобы понять ваш текущий рабочий процесс и требования? Ожидаете ли вы, что первый этап будет изменен для развертывания в разработке при создании PR, а не при слиянии PR?

Alvin Zhao - MSFT 12.08.2024 12:13

Насколько я понимаю, в настоящее время первый этап конвейера запускался коммитом PR-слияния в качестве триггера CI; и ваша сборка PR-валидации запустила второй этап того же конвейера?

Alvin Zhao - MSFT 12.08.2024 12:16

@RuiJarimba Я привел два примера, описывающих случаи, которые я хочу осветить. Надеюсь, теперь стало более понятно?

Patrik Valkovič 12.08.2024 12:21
Стоит ли изучать 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
4
63
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Я использую конвейеры Azure DevOps YAML и имею два этапа: один — развертывание в разработке (запускается при фиксации в мастере), а второй — проверка запросов на извлечение (выполнение тестов и статический анализ).

Вместо использования одного конвейера с двумя этапами рассмотрите возможность разделения конвейера на две части:

  • Тестовый конвейер: запускает тесты и статический анализ.
  • Развертывание конвейера: развертывает код.

После разделения конвейеров создайте политику сборки в разделе Build Validation для каждого из них:

  • Политика тестового конвейера должна быть настроена по мере необходимости, т. е. сборка всегда должна выполняться как часть проверки запроса на включение.
  • Политика конвейера развертывания должна быть установлена ​​как необязательная: создатель PR должен решить, следует ли запускать эту сборку как часть проверки запроса на включение или нет.

Пример политики для конвейера развертывания:

Спасибо, кажется, это решило проблему. Немного жаль, что для создания конвейера в графическом интерфейсе требуется несколько файлов и ручное вмешательство :( Я как бы ожидал, что смогу указать ключ «pipelines:» и указать их все в одном файле. Тем не менее, это работает так, как я хотел. так что спасибо.

Patrik Valkovič 14.08.2024 16:23

В зависимости от вашего требования к решению с одним конвейером вы можете рассмотреть возможность оценки переменной из группы переменных, чтобы предотвратить запуск stage3 для развертывания Dev во время проверки PR, поскольку такие значения переменных находятся за пределами определения конвейера и обрабатываются во время выполнения конвейера.

trigger:
- master

pool:
  vmImage: ubuntu-latest

stages:
- stage: stage1
  condition: and(
                eq(variables['Build.Reason'], 'IndividualCI'),
                eq(variables['Build.SourceBranchName'], 'master')
              ) 
  jobs:
  - job: DeployToDevUponCI
    steps:
    - pwsh: |
        Write-Host "This is stage 1 deploying to Dev upon CI trigger"

- stage: stage2
  dependsOn: []
  condition: eq(variables['Build.Reason'], 'PullRequest')
  jobs:
  - job: Tests
    steps:
    - pwsh: |
        Write-Host "This is stage 2 running tests upon PR validation trigger"
        Write-Host "##vso[build.addbuildtag]stage2succeeded" # Add Build tag to filter the latest artifacts for download during stage3
    - publish: $(System.DefaultWorkingDirectory)
      artifact: drop$(Build.BuildId)

- stage: stage3
  dependsOn: stage2
  variables:
  - group: VG-DeployDevUponPR
  condition: eq(variables['DeployDevUponPR'], 'True')
  jobs:
  - job: DeployToDevUponPR
    steps:
    - task: DownloadPipelineArtifact@2
      inputs:
        buildType: 'specific'
        project: 'TheProjectName'
        definition: 'DeployDevUponPR'
        buildVersionToDownload: 'latest'
        tags: 'stage2succeeded'
        targetPath: '$(Pipeline.Workspace)'
    - pwsh: |
        Write-Host "This is stage 3 deploying to Dev upon CI trigger"
        tree $(Pipeline.Workspace)
        Write-Host "DeployDevUponPR - $(DeployDevUponPR)"
        Write-Host "After deployment - Reset the variable DeployDevUponPR in variable group 36 as false"
        az pipelines variable-group variable update --group-id 36 `
          --name DeployDevUponPR `
          --org $(System.CollectionUri) `
          --project $(System.TeamProject) `
          --value False
      env: 
        AZURE_DEVOPS_EXT_PAT: $(System.AccessToken)
      displayName: Reset the variable DeployDevUponPR in variable group 36 as false
      condition: always()

   

Когда конвейер запускался PR, stage3 всегда пропускался, пока вы вручную не установили значение переменной в группе переменных как True. Статус сборки проверки PR также был успешным. А когда вы захотите развернуть stage3, вы можете создать новый запуск только с выбранным stage3, который не будет отображаться на странице PR. Вы также можете использовать сценарий CLI Azure DevOps для обновления всех необходимых переменных среды в группе переменных во время stage2 для использования stage3.

Кстати, Build.Reason для развертывания новой сборки stage3Manual не PullRequest. Если вам подходит временное хранение переменных среды в группе переменных, это также должно работать в отдельных конвейерах.

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

Как запретить принудительную отправку только на главную, но при этом разрешить прямую (не принудительную) отправку в репозиториях git Azure DevOps
Azure Pipelines — обработка одинаковых имен переменных в разных группах переменных
Не могу найти нужные артефакты
Уменьшение объема хранилища пакетов Azure Devops
Как создать скрипт в учетной записи автоматизации для получения квот и используемой емкости для каждого общего файлового ресурса
Триггер нескольких репозиториев Azure. Почему он срабатывает несколько раз для одной и той же фиксации?
Невозможно воспроизвести приложение на основе холста после его импорта в другую среду/другой клиент (с использованием инструментов сборки Azure DevOps PP)
Azure Pipeline не удается извлечь подмодуль
Каковы варианты миграции VSS 6.0 в Azure DevOps, если у вас нет VSS 2005?
Как вставить CSV-файл из Azure Repo в базу данных SQL Azure через конвейер выпуска?