Azure Многоступенчатые конвейеры DevOps застряли в ожидании разрешений - PullRequest
1 голос
/ 30 января 2020

Я использую размещенные Azure DevOps с нашим кодом в Azure Git Repos. Раньше мы использовали редактор конвейеров на основе пользовательского интерфейса Classi c, но переходим к шаблонам YAML для наших этапов сборки / выпуска.

Раньше я настраивал CI / CD так, чтобы при фиксации кода в основную ветку через запрос на извлечение, она запускает сборку, а затем развертывание разработки. Другие этапы выпуска ожидают утверждения, прежде чем код переместится на этот этап. Новый выпуск отменяет все предыдущие выпуски, которые не были развернуты в их соответствующих средах.

С этапами развертывания YAML я обнаружил, что, когда главная ветвь запускает сборку, она развертывается в среде разработки. , но конвейер застрял в состоянии ожидания, потому что другие этапы не были утверждены. В результате, прогон не помечается как «завершенный», и в конечном итоге другие этапы истекают и отмечаются как сбойные. Кроме того, предыдущие прогоны конвейера не отменяются, поэтому несколько прогонов складываются в состоянии ожидания.

В идеале я хотел бы видеть, что новая сборка отменит все предыдущие прогоны конвейера. Мне бы хотелось, чтобы прогон был помечен как «завершенный» после его развертывания в разработке, и я мог бы выполнить развертывание на других этапах вручную после этого.

Кто-нибудь еще хотел сделать то же самое? Я просто думаю об этом все неправильно и должен делать это по-другому?

Ответы [ 2 ]

1 голос
/ 30 января 2020

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

. Вы можете попробовать добавить зависящее от и условие для каждого этапа. Для примера ниже yaml конвейер. Этап Сборка начнет выполняться только после успешного завершения этапа Запуск , затем Сборка этапа будет ожидать подтверждения, Выпуск этапа не будет запускаться до тех пор, пока Сборка этапа не будет утверждена и успешно завершена.

Вы можете определить pr триггер и установить autocancel=true (по умолчанию true) для отмены предыдущих запусков, если новые изменения были перенесены в тот же pr.

Свойство batch для trigger может обеспечить аналогичный эффект. Он не запустит новый запуск, если текущий pr все еще находится в здании.

trigger:
  batch: boolean # batch changes if true (the default); start a new build for every push if false
  branches:
    include:

_

pr:
  autoCancel: true
  branches:
    include:
    - master

stages:
- stage: Start
  jobs:
    - job: A
      pool:
        vmImage: windows-latest
      steps:
      - powershell: |
          echo "i am job a"

- stage: Build
  dependsOn: Start
  condition: succeeded()
  jobs:
  - deployment: Dev
    displayName: deploy Web App
    pool:
      vmImage: 'Ubuntu-16.04'
  # creates an environment if it doesn't exist
    environment: 'Dev'
    strategy:
    # default deployment strategy, more coming...
      runOnce:
        deploy:
          steps:
          - script: echo "i am dev environment"


- stage: Release
  dependsOn: Build
  condition: succeeded()
  jobs:
  - deployment: Environ
    displayName: deploy Web App
    pool:
      vmImage: 'Ubuntu-16.04'
  # creates an environment if it doesn't exist
    environment: 'Environment'
    strategy:
    # default deployment strategy, more coming...
      runOnce:
        deploy:
          steps:
          - script: echo "i am Environment environment"

Обновление: Отмена в процессе сборки через скрипты powershell .

Вы можете добавить задачу powershell в верхней части конвейера, чтобы вызвать build api . Приведенные ниже скрипты получают все текущие сборки и отменяют их, кроме текущей сборки.

- task: PowerShell@2

      inputs:
        targetType: inline
        script: |

          $header = @{ Authorization = "Bearer $(system.accesstoken)" }
          $buildsUrl = "$(System.TeamFoundationCollectionUri)$(System.TeamProject)/_apis/build/builds?api-version=5.1"
          echo $buildsUrl
          $builds = Invoke-RestMethod -Uri $buildsUrl -Method Get -Header $header

          $buildsToStop = $builds.value.Where({ ($_.status -eq 'inProgress') -and ($_.definition.name -eq "$(Build.DefinitionName)") -and ($_.id -ne $(Build.BuildId))})

          ForEach($build in $buildsToStop)
          {
            echo $build.id
            $build.status = "cancelling"
            $body = $build | ConvertTo-Json -Depth 10
            $urlToCancel = "$(System.TeamFoundationCollectionUri)$(System.TeamProject)/_apis/build/builds/$($build.id)?api-version=5.1"
            echo $urlToCancel
            Invoke-RestMethod -Uri $urlToCancel -Method Patch -ContentType application/json -Body $body -Header $header
          }

Чтобы у вашего конвейера было разрешение отменить текущую текущую сборку. Вам нужно go к вашему конвейеру, нажмите на 3 точки и выберите Управление защитой

enter image description here

Затем установите Остановить разрешение на сборку для Разрешить для пользователя Служба сборки коллекций проектов (имя_проекта),

enter image description here

0 голосов
/ 24 апреля 2020

Я уже давно ищу эту проблему и думаю, что есть лучшее решение.

Смотрите мой ответ на похожий вопрос здесь: { ссылка }

...