Teamcity запускает только метки из одной ветки - PullRequest
0 голосов
/ 03 июля 2018

Моя команда использует TeamCity для CI, и я немного новичок в этом.

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

Пока мне удалось сделать так, чтобы при создании нового тега сборка в TeamCity запускалась, однако проблема в том, что она запускается для любой ветви и любого тега. Есть ли способ сделать триггер сборок, только когда TAGS созданы в СПЕЦИАЛЬНОМ ФИЛИАЛЕ?

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

enter image description here

Спасибо за помощь.

Ответы [ 2 ]

0 голосов
/ 03 июля 2018

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

Если вы хотите использовать теги, на самом деле есть два варианта.

Простой вариант - использовать соглашения о присвоении имен для ваших тегов, как предлагает Ян Скляренко. Конечно, кто-то может поместить неправильный тег в неправильное место, что является либо функцией (она гибкая), либо ошибкой (ошибки приводят к потере производственных сборок). И там есть элемент «скрытой магии». Но это, по крайней мере, простой в реализации вариант.

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

Теперь я помещаю «в ветку master» в кавычках, потому что, как указывает г-н Скляренко, он немного говорит о том, как ветви и теги структурированы в git. На самом деле вы бы сказали, что хотите знать о новых тегах, которые «доступны на коммитах, доступных с master». И на самом деле, вы, вероятно, имеете в виду «достижимый из master только с использованием указателей первого родителя» То есть

       D
      / \
A -- B - E -- F <--(master)
 \
  C <--(branch)

Если мы пометим C, это не достижимо с master. («Достижимый» означает через родительские указатели, поэтому вы можете следовать только линиям влево на диаграмме.)

D достижимо с master, но если все было сделано "нормально", D является вторым родителем E. Поэтому, если мы говорим «достижимы указателями первого родителя», то A, B, E и F квалифицируются - и это, вероятно, то, что вы подразумеваете под «на master».

Единственный способ, которым я знаю, чтобы выполнить такую ​​проверку в TC, это выполнить сценарий сборки; Итак, вам нужна команда git, которая предоставит информацию, соответствует ли этот тег критериям? Вы можете использовать это:

git rev-list --first-parent master |grep -q $(git rev-parse <tagname>)

(где <tagname> - имя тега), который вернет 0, если тег соответствует критериям.

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

A -- B -- C -- D <--(master)
          ^
          tag-1.0

вы можете захотеть построить только , если кто-то пометит D, а не, если они пометят A, B или C (поскольку у вас уже есть тег C) , В этом случае вы можете проверить, является ли

git describe --tags --first-parent --abbrev=0 master

возвращает имя вашего нового тега.

0 голосов
/ 03 июля 2018

Теги как объекты в Git не привязаны к какой-либо конкретной ветке - они просто указывают на определенные ревизии. Теги могут даже указывать на те ревизии, которые не являются частью какой-либо ветви (отдельная HEAD). Следовательно, я подозреваю, что для TeamCity технически сложно судить, создан ли тег Git в ветви для мониторинга или нет.

Однако вы можете обойти это, установив некоторые правила именования для тегов Git. Например, теги, созданные в ветви master, должны называться release/something или main/something. В этом случае значение в поле Branch specification можно сузить до +:refs/tags/release/*.

...