Может ли Jenkins автоматически обнаруживать и создавать вновь созданные теги в git-репо? - PullRequest
44 голосов
/ 18 октября 2011

Было бы неплохо, если бы наш сервер Jenkins CI автоматически обнаруживал, развертывал и создавал теги по мере их создания в нашем репозитории Github.

Возможно ли это?

Ответы [ 5 ]

34 голосов
/ 21 августа 2013

При следующей конфигурации вы можете создать задание для построения всех тегов:

  1. Сделать теги извлечения задания, как если бы они были ветвями: Нажмите кнопку «Дополнительно» под URL-адрес хранилища и введите Refspec+refs/tags/*:refs/remotes/origin/tags/*
  2. Пусть он построит все теги "ветви" с помощью Спецификатора ветви */tags/*
  3. Включите опрос SCM, чтобы задание обнаружило новые теги.

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

Так как теги don 'После изменения git задание будет запускаться только один раз для каждого нового тега.

17 голосов
/ 08 ноября 2012

Чтобы преодолеть недостаток ответа @oberlies о том, что все теги будут созданы, я использую специальную сборку триггера.Сборка триггера использует тот же git-репозиторий и ветвь, что и основная сборка, и следующие (после) шаги сборки.

Сборка -> Выполнить оболочку:

# Get the most recent release tag.
PATTERN="release-tag-[0-9][0-9]-[0-9][0-9][0-9][0-9]"
TAG=$(git log --tags=$PATTERN --no-walk --pretty="format:%d" | grep -m 1 -o $PATTERN)

# Due to a Jenkins limitation (https://issues.jenkins-ci.org/browse/JENKINS-8952)
# when passing environment variables we have to write the tag to a file and
# inject it later again.
mv release.properties release-old.properties || true
echo "TAG = $TAG" > release.properties

# Fail the build if the most recent release tag did not change.
! diff release.properties release-old.properties

Сборка -> Внедрение переменных среды :

Properties File Path: release.properties

Действия после сборки ->: Запуск параметризованной сборки для других проектов

Projects to build: <your main project>
Trigger when build is: Stable
Parameters: TAG=$TAG

Наконец, в основной сборке, отметьте «Параметризация этой сборки» со следующим строковым параметром

Name: TAG
Default Value: <your release branch>

. В разделе «Управление исходным кодом» используйте «$ TAG» в поле «Ветки для сборки».

3 голосов
/ 04 ноября 2011

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

Крючок может выглядеть примерно так [*]:

#!/usr/bin/env python

import sys
from subprocess import Popen, PIPE, check_call

def call_git(command, args):
    return Popen(['git', command] + args, stdout=PIPE).communicate()[0]
JENKINS = 'http://localhost:8002/jenkins'
TOKEN = 'asdf8saffwedssdf'
jobname = 'project-tag'

def handle_ref(old, new, ref):
     print 'handle_ref(%s, %s, %s)' % (old, new, ref)
     if not ref.startswith('refs/tags/'):
          return
     url = '%s/job/%s/buildWithParameters?token=%s&branch=%s' % (
        JENKINS, jobname, TOKEN, new)
     print "queueing jenkins job " + jobname + " for " + new
     check_call(["wget", "-O/dev/null", "--quiet", url])
if __name__ == '__main__':
    for line in sys.stdin:
        handle_ref(*line.split())

[*] примечание: это просто быстрое преобразование из немного другого скрипта, поэтому вполне вероятно, что здесь есть небольшие ошибки. Это в основном, чтобы показать идею.

На стороне Дженкинса вам необходимо настроить параметризованное задание. Единственный параметр - «ветвь».

  1. Проверьте, «эта сборка параметризована» и добавьте параметр
  2. В 'управление исходным кодом -> ветки для сборки' поместите '$ branch'

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

0 голосов
/ 25 февраля 2019

В мире современных (?) Многоотраслевых конвейеров построение тегов работает следующим образом.

  1. Добавьте «поведение» для обнаружения тегов:
    enter image description here
  2. Используйте плагин Базовые стратегии построения веток , чтобы добавить «стратегию сборки» для тегов: enter image description here Не забудьте добавить стратегию сборки для ветоктакже;плагин полностью отключает настройки по умолчанию!
0 голосов
/ 20 октября 2011

Вы можете использовать опцию «Git Publisher», которая входит в состав Git Plugin , чтобы создать тег после успешной сборки / развертывания.

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