Azure Devlops Pipeline - условное выполнение задачи - PullRequest
0 голосов
/ 05 ноября 2019

У нас есть Azure Pipline, который используется для развертывания нашего кода. (это связано с BigData).

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

  • Посредством команды git проверьте, были ли изменены определенные файлы в последнем коммите.
  • если это так, задайте для конкретной переменной значение true else false
  • Теперь для задачи развертывания используйте custom condition и проверьте указанную выше переменную на наличие true

Проблема Я не могу выполнить git command, поскольку артефакты копируются из build pipeline, у которого нет каталога .git.

Я пытался клонировать каталог git, однако учетные данные настроены так, что я не могу его клонировать.

Есть ли другой способ решить эту проблему.

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

Ответы [ 3 ]

0 голосов
/ 06 ноября 2019

Tl; Dr Есть много способов соединить это вместе

  1. Добавить git-репо к артефактам конвейера релиза, как упомянул @Shayki
  2. Добавить git-репо в ваш конвейер релиза вручнуюс опцией --no-checkout
  3. Выполнять операции git в сборке и включать некоторый файл флага в артефакт
  4. Выполнять операции git в сборке и помечать сборку (предпочтительно)
  5. Вставьте .git dir в артефакт

Добавьте git repo к артефактам конвейера релиза

Добавление репозитория Git в качестве артефакта в конвейер релиза позволит агенту развертывания получить доступв систему контроля версий (включая файлы кода), чтобы вы могли выполнить запрос на стадии выпуска.

Добавление git repo в конвейер выпуска вручную

Я не думаю, что пользовательский интерфейс DevOps Azure даст вам возможность клонировать только каталог .git, что помешает вашему развертываниюагент на самом деле с исходным кодом. Но, если вы «разрешите сценариям доступ к токену oAuth», вы сможете использовать его для клонирования хранилища вручную с помощью powershell, используя git clone --no-checkout url.

Включить некоторый файл флага в артефакт

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

Пометить сборку

Может быть другой способ сделать это, но я этого не знаю. Используйте RESTapi для добавления тега в сборку, если поиск в git показывает, что выпуск должен выполнять дополнительную работу. Не забудьте установить «разрешить скриптам использовать токен oAuth» в вашей работе по сборке. Затем создайте в конвейере выпуска этапы Full и Min, где у full есть дополнительные задачи, а min нет.

enter image description here

На этих этапах вы можете использовать функцию фильтров артефактов на основе тега сборки. enter image description here


enter image description here

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

Вставьте .git dir в артефакт

Если вы полностью настроены на принятие решения о выпуске и не можете получить от него доступ к репо, поместите каталог .git из вашей сборки в (новый?) Артефакт, а затем используйте его навыпуск трубопровода. (Это похоже на настоящий взлом, и я не совсем уверен, что это сработает).

0 голосов
/ 06 ноября 2019

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

В вашем конвейере Build запустите git diff:

$CSV_FileName = git diff-tree --no-commit-id --name-only $Commit_ID -r | where {$_ -like "*.csv"}
$Ps1_FileName = git diff-tree --no-commit-id --name-only $Commit_ID -r | where {$_ -like "*.ps1"}

Затем выполните ваше условие

Метод 1

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

Сборка

#Set Build Tag
if ($CSV_FileName) {
 Write-Host "##vso[build.addbuildtag]CSV"
}
if ($PS1_FileName) {
 Write-Host "##vso[build.addbuildtag]PS1"
}

Выпуск

Stage Artifact Filter: Branch | Include | <TagName>

Метод 2

Привязать группу переменных можно как к конвейерам сборки, так и к выпуску. Это позволяет более детально контролировать условия для каждой задачи, но немного сложнее. Убедитесь, что вы сбросили переменную в группе переменных в конце выпуска.

Сборка

#Update Variable Group
if ($CSV_FileName) {
 echo $env:AZURE_DEVOPS_EXT_PAT | az devops login
 az devops configure -d organization=https://dev.azure.com/<your_organisation>/ project=<your_project>

 az pipelines variable-group variable update --id <id_here> --name <name_here> --value <value_here>
}
if ($PS1_FileName) {
 echo $env:AZURE_DEVOPS_EXT_PAT | az devops login
 az devops configure -d organization=https://dev.azure.com/<your_organisation>/ project=<your_project>

 az pipelines variable-group variable update --id <id_here> --name <name_here> --value <value_here>
}

Выпуск

Task Condition: and(succeeded(), eq(variables['VariableName'], 'Value'))
0 голосов
/ 05 ноября 2019

Вы можете добавить git-репо в качестве дополнительного артефакта:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...