Плагин Jenkins Git: как создать конкретный тег?

121

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

sksamuel
источник
Вы имеете в виду, что это отличается от stackoverflow.com/questions/7157170/… ? (третий результат google.com/… )
VonC
1
«Это занимает 3 часа моего дня» - я не такой ленивый, что 3 часа моего дня не включали все ссылки, которые я мог найти в Google :)
sksamuel
1
Вы уверены, что хотите сделать это так? Вы понимаете, что теги в git не масштабируются ? Может быть, вы могли бы просто использовать задачу «выполнить оболочку», чтобы написать сценарий, чтобы проверить тег / версию, которую вы действительно хотите?
mpontillo

Ответы:

223

Я смог сделать это с помощью параметра «ветви для создания»:

Branch Specifier (blank for default): tags/[tag-name]

Замените [tag-name] названием вашего тега.

Эммануэль Келлер
источник
5
Я не знаю, почему здесь не больше +1. Эта запись в блоге erics-notes чертовски сбивает с толку. Это просто и отлично работает. Спасибо!
Cody S
3
Отлично сработал для меня. Спасибо. Мой параметр был назван RELEASE_TAG, поэтому я использовал теги / $ {RELEASE_TAG} в качестве значения для спецификатора ветвления.
Wesley Womack
3
Не удалось заставить это работать. По какой-то причине не могу проверить тег. Я получаю: «ОШИБКА: не удалось найти версию для сборки. Проверьте конфигурацию репозитория и ветки для этого задания ». Я указываю теги / 3.0.1, я также пробовал * / tags / 3.0.1 Я проверил, что тег действительно существует.
lostintranslation
1
Когда я пытаюсь сделать то, что предлагается в этом ответе, каждый опрос репозитория запускает сборку. Журнал опроса git будет постоянно показывать, что «Последняя созданная ревизия» - это ревизия тега, а «Последняя ревизия удаленной головки» - это ревизия самой новой HEAD. Логика плагина git, кажется, сравнивает эти две ревизии, которые в моем репозитории всегда не равны, и поэтому всегда запускается новая сборка.
Луи
Это наверняка правильный ответ, он сработал для меня и настолько прост. Я не опрашиваю репо, так что, думаю, проблема все еще существует.
Джереми
76

Ни один из этих ответов не был для меня достаточным при использовании Jenkins CI v.1.555, плагина Git Client v.1.6.4 и плагина Git 2.0.4.

Я хотел создать задание для одного репозитория Git для одного конкретного фиксированного (т. Е. Не параметризованного) тега. Мне пришлось сколотить решение из различных ответов плюс сообщение в блоге «создать тег Git», цитируемое Тило .

  1. Убедитесь, что вы отправили свой тег в удаленный репозиторий с помощью git push --tags
  2. В разделе «Репозиторий Git» вашего задания под заголовком «Управление исходным кодом» нажмите «Дополнительно».
  3. В поле для Refspec добавьте следующий текст: +refs/tags/*:refs/remotes/origin/tags/*
  4. В разделе «Отрасли для создания», «Спецификатор ветки» введите */tags/<TAG_TO_BUILD>(заменив <TAG_TO_BUILD>на свое фактическое имя тега).

Добавление Refspec для меня оказалось критичным. Хотя казалось, что репозитории git по умолчанию получают всю удаленную информацию, когда я оставил его пустым, плагин Git, тем не менее, полностью не смог найти мой тег. Только когда я явно указал «получить удаленные теги» в поле Refspec, плагин Git смог идентифицировать и строить из моего тега.

Обновление 2014-5-7 : К сожалению, это решение имеет нежелательный побочный эффект для Jenkins CI (v.1.555) и механизма push-уведомлений репозитория Git в стиле Stash Webhook для Jenkins : каждый раз, когда обновляется любая ветка в репозитории при нажатии снова запускаются задания построения тегов. Это приводит к множеству ненужных повторных построений одних и тех же заданий тегов снова и снова. Я пробовал настраивать задания как с опцией «Принудительный опрос с использованием рабочей области», так и без нее, но, похоже, это не помогло. Единственный способ предотвратить создание Дженкинсом ненужных сборок для заданий тегов - очистить поле Refspec (т.е. удалить +refs/tags/*:refs/remotes/origin/tags/*).

Если кто-то найдет более элегантное решение, отредактируйте этот ответ с помощью обновления. Я подозреваю, например, что, возможно, этого не произошло бы, если бы refspec был конкретно, +refs/tags/<TAG TO BUILD>:refs/remotes/origin/tags/<TAG TO BUILD>а не универсальной звездочкой. Однако на данный момент это решение работает для нас, мы просто удаляем лишние Refspec после успешного выполнения задания.

gotgenes
источник
4
Чтобы «добавить следующий текст» в refspec ... если ваш refspec был ранее, +refs/heads/*:refs/remotes/origin/*то теперь он будет +refs/heads/*:refs/remotes/origin/* +refs/tags/*:refs/remotes/origin/tags/*. (Я не очень много работал с refspecs, поэтому потребовались некоторые эксперименты, чтобы узнать, что это поле разделено пробелами.)
driftcatcher
1
Дополнительный +1 за это решение. Предыдущие решения тоже не помогли мне.
whitespy9
16

Разве вы не можете сказать Дженкинсу, чтобы он строил по имени Ref? Если так, то это

refs/tags/tag-name

Из всех вопросов, которые я вижу о Дженкинсе и Хадсоне, я бы предложил перейти на TeamCity. Мне не пришлось редактировать какие-либо файлы конфигурации, чтобы TeamCity заработал.

Эндрю Т. Финнелл
источник
На самом деле, вы не первый, кто предлагает город команды. Неужели все намного лучше? Я могу это проверить.
sksamuel
1
@monkjack Я попробовал тот же синтаксис в одном из своих репо, и он сработал. Вы можете перечислить свои текущие теги? Вы уверены, что специально разместили этот тег в удаленном репо с помощьюgit push --tags
Эндрю Т. Финнелл
4
Все ближе. Я не подталкивал теги к удаленному, но теперь я это делаю. Я могу заставить Дженкинса построить сейчас, используя refs / tags / harpercollins-1.0.16, однако он всегда настаивает на создании головы, независимо от того, что я туда вставляю. Я подтвердил, что на пульте дистанционного управления есть тег (его можно увидеть в gitweb), и создание снимка этого тега подтверждает, что все в нем правильно.
sksamuel
6
TeamCity проприетарный, что делает его бесполезным.
сленг
2
Ах да, переход с бесплатного инструмента на коммерческий - правильный выбор! Когда Jetbrains изобретут велосипед и создадут новый трекер ошибок, предложите ли вы другим перейти с bugzilla на это?
m1ld 02
11

Если вы используете конвейеры Jenkins и хотите проверить определенный тег (например: TAG параметр вашей сборки), вот что вы можете сделать:

stage('Checkout') {
  steps {
    checkout scm: [$class: 'GitSCM', userRemoteConfigs: [[url: 'YOUR_GIT_REPO_URL.git', credentialsId: 'YOUR_GIT_CREDENTIALS_ID' ]], branches: [[name: 'refs/tags/${TAG}']]], poll: false
  }
}
Винсент де Лагаббе
источник
9

В последней версии Jenkins (1.639 и выше) вы можете:

  1. просто укажите название тега в поле «Отрасли для построения».
  2. в параметризованной сборке вы можете использовать параметр как переменную в том же поле «Ветви для сборки», то есть $ {Branch_to_build}.
  3. вы можете установить подключаемый модуль Git Parameter, который предоставит вам функциональность, перечислив все доступные ветки и теги.
m1ld
источник
1
Действительно, просто ввод имени тега у меня тоже сработал. Хотя в документации по этому вопросу в подключаемом модуле
Zitrax
Это сработало для меня в Jenkins 1.532.3, я просто указал версию тега (например 1.0.1) в поле веток для сборки.
andre
9

Я сделал что-то вроде этого, и это сработало:

Source Code Management

 Git    
    Repositories    


 Advance

Name: ref
Refspec : +refs/tags/*:refs/remotes/origin/tags/* 

 Branches to build  
 Branch Specifier (blank for 'any') : v0.9.5.2

введите описание изображения здесь

Журнал Jenkins подтвердил, что он получал источник из тега

Проверка 0b4d6e810546663e931cccb45640583b596c24b9версии (v0.9.5.2)

Хасан Шайк
источник
Это отлично подходит для создания всех тегов, спасибо! Добавление refspecбыло уловкой, нажав кнопку «Дополнительно».
Styfle
9

Я установил в поле Advanced-> Refspec значение refs/tags/[your tag name] . Это кажется проще, чем другие предложения для Refspec, но у меня все сработало.

ОБНОВЛЕНИЕ 23/7/2014 - На самом деле, после дальнейшего тестирования оказалось, что это не сработало, как ожидалось. Похоже, что версия HEAD все еще проверялась. Отмените это как принятый ответ. Я получил рабочее решение, подписавшись на сообщение от gotgenes в этой теме (30 марта). Упомянутая в этом посте проблема ненужного запуска сборок не была для меня проблемой, поскольку моя работа запускается из восходящего задания, а не из опроса SCM.

ОБНОВЛЕНИЕ АПРЕЛЬ-2018 - обратите внимание в комментариях, что это работает для одного человека и согласуется с документацией Jenkins.

Nebu
источник
Просто хотел отметить, что через четыре года после того, как этот ответ был опубликован, использование refs/tags/<tagname>- это то, что сказано в документации Jenkins , и у меня это работает нормально. Возможно , плагин был багги в момент первоначального поста, но ... по состоянию на апрель 2018 года, это является правильным ответом.
evadeflow
Обновление моего предыдущего комментария: На самом деле я обнаружил, что могу опустить refs/tagsпрефикс и просто использовать <tagname>. YMMV, но ... он отлично подходит для моих целей.
evadeflow
3

Мне удалось заставить Дженкинса создать тег, установив Refspec и Branch Specifier, как подробно описано в этом сообщении в блоге. .

Мне также пришлось установить имя репозитория (в моем случае «origin»), чтобы я мог ссылаться на него в Refspec (в противном случае он явно использовал бы случайно сгенерированное имя).

Тило
источник
2

В итоге я сделал следующее:

  • создал новую ветку jenkins-targetи попросил Дженкинса отслеживать это
  • слить из той ветки или тега, которые я хочу построить на jenkins-target
  • после того, как сборка заработала, тесты прошли и т.д., просто создайте тег из jenkins-targetветки

Я не уверен, что это сработает для всех, мой проект был довольно маленьким, не слишком много тегов и прочего, но это очень легко сделать, не нужно возиться с refspecs, параметрами и прочим :-)

Хью Перкинс
источник
Мне нравится этот очень простой подход.
zochhuana
2

Вы можете создать даже тип тега, например 1.2.3-alpha43 , используя подстановочные знаки:

Refspec: +refs/tags/*:refs/remotes/origin/tags/*

Спецификатор ветки: origin/tags/1.2.3-alpha*

Вы также можете установить флажок « Строить, когда изменение отправлено на GitHub », чтобы инициировать отправку, но вы должны добавить действие «создать» в веб-перехватчик.

riverfall
источник
1

Добавляю сюда свои два цента, поскольку я не видел ответа, в котором использовалась бы опция «Построить с параметрами» в Jenkins.

Здесь я использую консоль браузера Jenkins CI для проекта starwars_api, и мне удалось выполнить сборку напрямую с помощью команды «Сборка с параметрами» со значением refs / tags / tag-name

  1. выберите вариант «построить с параметрами».
  2. добавьте значение в поле как "refs / tags / tag_142" (tag_name = tag_142 в моем примере)

построить с именем тега ref

anayagam
источник