В Azure Pipelines я включил теги git для запуска конвейеров следующим образом:
trigger:
branches:
include:
- '*'
tags:
include:
- '*'
Теперь я хочу знать, есть ли способ определить программно:
@arya Смотрите ответ ниже.
Когда вы настраиваете конвейер как триггеры с тегом, это означает, что при нажатии нового тега конвейер начинает работать. так:
1) Конвейер начнется с тега git.
2) Я не понимаю вопроса, если вы нажали тег test
, то имя тега будет test
.
Если вы хотите узнать программно, был ли триггер сборки тегом и каково имя тега, вы можете проверить переменную среды Build.SourceBranch
, если сборка из тега, значение будет: refs/tags/tagName
.
Так что просто добавьте задачу PowerShell и напечатайте значение:
Write-Host $env:Build_SourceBranch
Возможно, я недостаточно ясно выразился. Я хочу знать программно, был ли конвейер запущен с тегом и что это за тег.
Это нужно учитывать в разных ситуациях. Если вы просто нажмете тег или создадите его с помощью пользовательского интерфейса, конвейер запустится из тега git. Просто зафиксируйте без какого-либо тега, он начнется с коммита git. Без сомнения, сборка будет запущена только один раз.
Но если вы нажмете коммит с тегом, сборка будет запущена дважды. Первый запускается фиксацией, а второй — тегом. Проверьте это изображение.
Это означает, что конвейер начался с коммита, а не с тега.
В общем, независимо от того, что будет первым, тег, который запускает сборку, — это все, что вы нажали или создали.
Чтобы получить более интуитивное представление об этом, вы можете добавить переменную ' $(Build.SourceBranch)'
в свой номер сборки. Вот мой код о том, как настроить номер сборки в файле YAML:
name: $(Build.SourceBranch)-$(date:yyyyMMdd)$(rev:.r)
trigger:
branches:
include:
- '*'
tags:
include:
- '*'
Вот результат того, что вызвало сборку. Если тег, то будет отображаться refs_tags_{tagname}
, если это коммит, то будет отображаться refs_heads_{branchname}
.
Возможно, я недостаточно ясно выразился. Я хочу знать программно, был ли конвейер запущен с тегом и что это за тег.
Вы можете проверить эту информацию с помощью одной системной переменной — '$(Build.SourceBranch)'. Для более интуитивного отображения вы можете добавить его в номер конвейера, чтобы показать его. У меня есть более подробная информация об этом в моем ответе.
Чтобы проверить, была ли фиксация из тега, используйте:
startsWith(variables['Build.SourceBranch'], 'refs/tags/')
От Джеймса Терли:
Get the name of the tag with:
$tags = git tag --sort=-creatordate
$tag = $tags[0]
This sorts the tags correctly for both annotated and unannotated tags, and so the first result is the most recent tag.
Я удалил исходный ответ и заменил его правильным ответом Джеймса Терли. Я бы удалил свой ответ, но, похоже, вы не можете удалить принятый ответ.
Это зависит от правильной сортировки тегов и может не дать вам имя тега, который фактически запустил сборку.
Новый ответ отражает сортировку. Не удалось удалить ответ, поэтому я процитировал ответ Джеймса.
Я знаю, что это немного устарело, но вы используете первый вариант? У меня много проблем, пытаясь использовать его. Я нашел этот выпуск на GitHub, но мне это не очень понятно.
Принятый ответ с использованием git tag -l v*
не сработал для меня, так как он неправильно упорядочивал теги, а вместо этого давал 1.1, 1.11, 1.12, 1.2, 1.3, etc
.
Я нашел, что лучше сделать:
$tags = git tag --sort=-creatordate
$tag = $tags[0]
Это правильно сортирует теги как для аннотированных, так и для неаннотированных тегов, поэтому первым результатом является самый последний тег.
Согласно этот документ тег, с которого началась сборка, находится в BUILD_SOURCEBRANCH
.
If this build was queued by the creation of a tag then this is the name of that tag. For Azure Pipelines, the BUILD_SOURCEBRANCH will be set to the full Git reference name, eg refs/tags/tag_name.
Мне не нравится, что я все еще должен удалить префикс refs/tags/
. Я предпочитаю использовать git describe --exact-match $(Build.SourceVersion)
для этой работы.
git describe
может предоставить вам (ближайшее) имя тега для данного хэша git, а Azure может предоставить вам текущий хэш с помощью $(Build.SourceVersion)
.
Используйте --exact-match
, чтобы ограничить git describe
использование только тега из определенного коммита:
git describe --exact-match $(Build.SourceVersion)
Если есть тег, он будет возвращен на стандартный вывод:
$ git describe --exact-match d9df242
v1.0.0
Если тега нет, git describe --exact-match
завершает работу с кодом выхода 128:
$ git describe --exact-match cc1f9d2
fatal: no tag exactly matches 'cc1f9d23854c37dec000485c6c4009634516a148'
$ echo $?
128
поэтому вы можете использовать это в тесте или просто не выполнить задачу в конвейерах, которые запускаются не только помеченными ревизиями.
Если у вас есть неаннотированные теги, вы должны использовать эту команду: $ git описать --tags --exact-match cc1f9d2
Другие ответы здесь охватывают первую часть вопроса, поэтому, как уже указал Алекс Кашински, вы можете использовать условие YAML:
startsWith(variables['Build.SourceBranch'], 'refs/tags/')
Получить имя тега теперь немного проще, чем на момент, когда был задан вопрос:
Build.SourceBranchName
Эта переменная содержит последний сегмент пути git ref, поэтому, например, если тег был refs/tags/1.0.2
, эта переменная будет содержать 1.0.2
: имя тега.
Чтобы ответить на ваш второй вопрос. Если вы не возражаете против наличия отдельного конвейера для запуска через теги, вы можете включить непрерывную интеграцию и переопределить триггер YAML, как показано ниже. В этом примере будут запускаться сборки с тегами, имеющими шаблон «test-*» (независимо от ветки).
Сделав это, вы можете просто выполнить git describe
в своем конвейере, и он выведет имя тега, который запустил сборку.
Здесь вы можете увидеть результат:
ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: После некоторого дальнейшего тестирования я обнаружил, что git description действительно будет использовать новейший тег для этой фиксации. Но это также означает, что если вы одновременно отправите 2 тега в один и тот же коммит, git description выведет самый новый тег в обоих запусках конвейера.
Я понимаю, что мой ответ может не относиться ко всем. Однако я хотел предоставить его в качестве альтернативы тем, кто использует предварительную установку Azure DevOps, в которой еще нет функции replace
(2019 г.).
steps:
- powershell: |
$tag = "$(Build.SourceBranch)"
$tag = $tag -replace "refs/tags/", ""
echo "##vso[task.setvariable variable=tag;isOutput=true]$tag"
name: createTagVariableStep
На этом шаге используется специальный синтаксис для вызова команды регистрации setvariable
для настройки переменной с именем tag
для использования в текущем задании. Доступ к нему можно получить как $(createTagVariableStep.tag)
.
Если вы используете версию Azure DevOps с функцией замены (версия 2020 в предварительной версии или Azure DevOps Services), вы можете использовать что-то вроде следующего:
variables:
tag: $[replace(variables['Build.SourceBranch'], 'refs/tags/', '')]
Для любого из этих вариантов я бы использовал их в сочетании с условием
job: SomeAwesomeJob
condition: startsWith(variables['Build.SourceBranch'], 'refs/tags/') # only run when there is a tag
Вы когда-нибудь находили ответ на свой вопрос? Пытаюсь найти ответ на 2.