Как получить тег Git в Azure Pipelines

В Azure Pipelines я включил теги git для запуска конвейеров следующим образом:

trigger:
  branches:
    include:
    - '*'
  tags:
    include:
    - '*'

Теперь я хочу знать, есть ли способ определить программно:

  1. Был ли конвейер запущен из коммита git или тега git?
  2. Если конвейер был запущен из тега git, каково имя тега?

Вы когда-нибудь находили ответ на свой вопрос? Пытаюсь найти ответ на 2.

arya 06.08.2019 03:37

@arya Смотрите ответ ниже.

Muhammad Rehan Saeed 06.08.2019 09:47
Стоит ли изучать 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 называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
28
2
15 751
9
Перейти к ответу Данный вопрос помечен как решенный

Ответы 9

Когда вы настраиваете конвейер как триггеры с тегом, это означает, что при нажатии нового тега конвейер начинает работать. так:

1) Конвейер начнется с тега git.

2) Я не понимаю вопроса, если вы нажали тег test, то имя тега будет test.

Если вы хотите узнать программно, был ли триггер сборки тегом и каково имя тега, вы можете проверить переменную среды Build.SourceBranch, если сборка из тега, значение будет: refs/tags/tagName.

Так что просто добавьте задачу PowerShell и напечатайте значение:

Write-Host $env:Build_SourceBranch

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

Muhammad Rehan Saeed 28.05.2019 09:45

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

Но если вы нажмете коммит с тегом, сборка будет запущена дважды. Первый запускается фиксацией, а второй — тегом. Проверьте это изображение.

Это означает, что конвейер начался с коммита, а не с тега.

В общем, независимо от того, что будет первым, тег, который запускает сборку, — это все, что вы нажали или создали.

Чтобы получить более интуитивное представление об этом, вы можете добавить переменную ' $(Build.SourceBranch)' в свой номер сборки. Вот мой код о том, как настроить номер сборки в файле YAML:

name: $(Build.SourceBranch)-$(date:yyyyMMdd)$(rev:.r)
trigger:
  branches:
    include:
    - '*'
  tags:
    include:
    - '*'

Вот результат того, что вызвало сборку. Если тег, то будет отображаться refs_tags_{tagname}, если это коммит, то будет отображаться refs_heads_{branchname}.

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

Muhammad Rehan Saeed 28.05.2019 09:45

Вы можете проверить эту информацию с помощью одной системной переменной — '$(Build.SourceBranch)'. Для более интуитивного отображения вы можете добавить его в номер конвейера, чтобы показать его. У меня есть более подробная информация об этом в моем ответе.

Mengdi Liang 28.05.2019 11:08
Ответ принят как подходящий

Чтобы проверить, была ли фиксация из тега, используйте:

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.

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

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

jrjohnson 20.11.2019 20:48

Новый ответ отражает сортировку. Не удалось удалить ответ, поэтому я процитировал ответ Джеймса.

Alex Kaszynski 04.12.2019 00:26

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

Jéf Bueno 26.03.2021 12:25

Принятый ответ с использованием 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) для этой работы.

Martijn Pieters 01.12.2019 14:44

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

etalon11 20.04.2021 13:50

Другие ответы здесь охватывают первую часть вопроса, поэтому, как уже указал Алекс Кашински, вы можете использовать условие 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 выведет самый новый тег в обоих запусках конвейера.

Felza 17.09.2020 12:55

Я понимаю, что мой ответ может не относиться ко всем. Однако я хотел предоставить его в качестве альтернативы тем, кто использует предварительную установку 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

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