Можно ли в DevOps Azure вызывать сборку всякий раз, когда завершается одна или несколько сборок независимо от ветви? - PullRequest
0 голосов
/ 03 октября 2019

У нас есть предварительный доступ к серверу Azure DevOps 2019, который недоступен извне.

Насколько я сейчас вижу, у меня есть следующие варианты:

Запускать сборку после некоторых другихпостроить с использованием встроенной возможности:

enter image description here

Есть проблемы с этим подходом:

  1. Всесборки, включая эту, должны быть в том же проекте TFS
  2. Мы вынуждены предоставить ветку сборки - невозможно, если мы хотим запустить сборку после проверки PR, которая всегда запускает новую ветку. Я думаю, что это можно обойти, создав ветку мусора и предоставив вместо этого фильтр исключения. Но это неубедительно.

Использовать сервисный крюк полной сборки

enter image description here

НетAzure DevOps в этом списке! Итак, я думаю, что это веб-хук. Теперь я не хочу поддерживать свой собственный веб-сервис для этого, так что же будет хостингом? Мы не можем использовать функции Azure, поскольку наш сервер Azure DevOps недоступен извне. Я мог бы сделать что-то запутанное, когда сервисный хук подключен к служебной шине Azure, а затем периодически запланированные опросы сборки Azure DevOps. Когда он находит соответствующий элемент в очереди, он выполняет настоящую "сборочную" логику. Но это хромает, теперь?

Использовать запланированную сборку для опроса других сборок

Здесь у меня будет сборка, которая будет запускаться периодически (каждые 5 минут?) И исследоватьсборка, которую предполагается запустить после использования API REST Azure DevOps. Такая сборка будет нуждаться в постоянном хранилище, чтобы отслеживать то, что она видела в последний раз. ( Предоставляет ли Azure DevOps постоянное хранилище для своих сборок? ). И это тоже немного неубедительно.

Я, должно быть, здесь упускаю что-то очевидное. Это не может быть так сложно.

РЕДАКТИРОВАТЬ 1

Для фильтра ветви исключения необходимо ветвь:

enter image description here

а какую ветку там предоставить? Я не вижу, как обойти это без специальной ветки мусора, которую никто не удаляет.

РЕДАКТИРОВАТЬ 2

Оказывается, можно ввести * вфильтр ветвления:

enter image description here

Поэтому я использую его для мониторинга сборок без проверки PR. Для проверки PR сборок я исключаю мастер. Но это отстой, потому что это означает, что если я ставлю PR-сборку вручную для главной ветви, это не вызовет мою сборку.

РЕДАКТИРОВАТЬ 3

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

enter image description here

EDIT 4

Триггер сборки не работает при сбое отслеживаемой сборки. Хотя это может иметь смысл, это не должно быть жестко закодировано в функции. Мне, например, нужно, чтобы моя сборка была запущена в любом случае, даже если отслеживаемая сборка не удалась. Название функции - «Запуск по завершению сборки», а не «Запуск по успешной сборке». Это ограничение этой функции разочаровывает.

1 Ответ

0 голосов
/ 04 октября 2019

О вашей первой проблеме Все сборки, включая эту, должны быть в одном проекте TFS. В официальной документации о триггерах завершения сборки добавьте триггер завершения сборки, чтобы запустить сборку после успешного завершения триггерной сборки. Вы можете выбрать любую другую сборку в том же проекте. Таким образом, эта функция разработана следующим образом.

О триггерах завершения сборки, когда изменяется исходный компонент (например, библиотека), нижестоящие зависимости необходимо перестраивать и повторно проверять. Но проверка PR - это предварительная сборка для вашей защищенной ветви, в восходящем потоке нет никаких изменений, и поэтому триггер завершения сборки не работал.

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

В моем тесте в моем репо три ветви. (master, branch1, branch2) И даже я установил конфидецию, как показано ниже, триггер завершения сборки donне работает, как ожидалось. enter image description here

Это связано с тем, что в трех ветвях нет изменений, и условия не выполняются, поэтому триггер завершения сборки не работает.

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

Поэтому я рекомендую вам изменить параметр Включить на Исключить, иСпецификация филиала, Вы можете выбрать филиал по желанию. В качестве теста я выбираю основную ветку. Как видите, конвейер запущен, как и ожидалось. enter image description here

enter image description here

Обновление

Приведенные выше результаты испытаний основаны наAzure DevOps. А в DevOps Azure функция завершения сборки может быть выполнена, как описано выше.

Однако в Azure DevOps Server 2019, независимо от того, как он установлен, эта функция не будет запускаться после проверки правильности PR. Поэтому я считаю, что это является дефектом функции Azure DevOps Server 2019. Я рекомендую вам отправить эту ошибку в Сообщество разработчиков для дальнейшего расследования.

О вашем редакторе 4, в официальнойдокументацию, вы можете обратиться к https://docs.microsoft.com/en-us/azure/devops/pipelines/build/triggers?view=azure-devops&tabs=classic#build-completion-triggers.

Если вы все еще чувствуете, что эта функция мешает вашему использованию, вы также можете отправить заявку в сообществе разработчиков.

И есть альтернативаобходной путь. Вы можете добавить задачу Powershell в свой конвейер сборки PR-валидации. И установите скрипт powershell, как показано ниже. Этот скрипт поставит в очередь указанный конвейер.

Param(
    [string]$collectionurl = "http://{instance}/{collection}",
    [string]$project = "{projectname}",
    [string]$definitionid="{definitionid}",
    [string]$user = "{username}",
    [string]$token = "PAT token"
)

#Base64-encodes the Personal Access Token(PAT) appropriately
$base64AuthInfo= [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f $user, $token)))

#Get response of the build definition
$defurl = "$collectionurl/$project/_apis/build/builds/$definitionid?api-version=5.0"

$definition = Invoke-RestMethod -Uri $defurl -Method Get -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)}

$json = @($definition.definition) | ConvertTo-Json -Depth 99
$js = "{'definition':$json}"
$defurl = "$collectionurl/$project/_apis/build/builds?api-version=5.0"

#Queue a build
$updatedef = Invoke-RestMethod -Uri $defurl -Method Post -Body $js -ContentType "application/json" -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)}
...