Как настроить Git post commit hook

Как запустить сборку удаленно из Jenkins?
Как настроить Git post commit hook?

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

В секции сборки триггера Jenkins я выбрал триггерную сборку удаленно.
В .git каталог, каталог ловушек есть в том, что мы должны настроить файл после фиксации.
Я путаюсь, как запустить сборку оттуда (я знаю какую-то часть, мы должны использовать команду curl).


curl cmbuild.aln.com/jenkins/view/project name/job/myproject/buildwithparameters?Branch=feat-con

Я поместил эту команду в мой каталог перехватов на git server (post commit hook).
Всякий раз, когда изменения происходят в хранилище, он запускает автоматическую сборку.

Я хочу проверить в changeset-е, есть ли хотя бы в одном java-файле, должна начаться сборка.
Предположим, что разработчики изменили только XML-файлы или файлы свойств, сборка не должна запускаться.
Вместе с xmlдопустим .java файлы есть, сборка должна начаться.

4 ответа

Решение

Как упомянуто в " Опрос должен умереть: запуск сборок Jenkins с помощью git hook ", вы можете уведомить Jenkins о новом коммите:

С последним Git-плагином 1.1.14 (который я только что выпустил сейчас) вы теперь можете сделать это более легко, просто выполнив следующую команду:

curl http://yourserver/jenkins/git/notifyCommit?url=<URL of the Git repository>

Это отсканирует все задания, настроенные для проверки указанного URL-адреса, и, если они также настроены с опросом, он немедленно запустит опрос (и если это обнаружит изменение, заслуживающее сборки, сборка будет запущена по очереди.)

Это позволяет сценарию оставаться неизменным, когда задания приходят и уходят в Jenkins.
Или, если у вас есть несколько репозиториев в одном хост-приложении репозитория (например, Gitosis), вы можете поделиться одним скриптом ловушки после получения со всеми репозиториями. Наконец, этот URL-адрес не требует аутентификации даже для защищенных Jenkins, поскольку сервер напрямую не использует ничего, что отправляет клиент. Он запускает опрос, чтобы убедиться, что есть изменение, прежде чем он действительно начнет сборку.

Как уже упоминалось, убедитесь, что вы используете правильный адрес для вашего сервера Jenkins:

поскольку мы запускаем Jenkins в качестве автономного веб-сервера на порту 8080, URL должен был быть без /jenkins, как это:

http://jenkins:8080/git/notifyCommit?url=git@gitserver:tools/common.git

Чтобы подкрепить эту последнюю мысль, ptha добавляет в комментариях:

Это может быть очевидно, но у меня были проблемы с:

curl http://yourserver/jenkins/git/notifyCommit?url=<URL of the Git repository>. 

Параметр url должен точно соответствовать тому, что есть в URL-адресе репозитория вашей работы Jenkins.
При копировании примеров я пропустил протокол, в нашем случае ssh:// и это не сработало.


Вы также можете использовать простой хук после получения, как в " Сборках на основе Push с использованием Jenkins и GIT "

#!/bin/bash
/usr/bin/curl --user USERNAME:PASS -s \

http://jenkinsci/job/PROJECTNAME/build?token=1qaz2wsx

Сконфигурируйте задание Jenkins, чтобы иметь возможность "Удаленно запускать сборки" и использовать токен аутентификации (1qaz2wsx в этом примере).

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


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

По сути, ваш скрипт сборки может:

  • положить "построить" заметки (см. git notes) по первому звонку
  • при последующих вызовах захватить список коммитов между HEAD вашего кандидата в ветви для сборки и коммит, на который ссылается git notes 'построить' (git show refs/notes/build): git diff --name-only SHA_build HEAD,
  • ваш скрипт может проанализировать этот список и решить, нужно ли продолжать сборку.
  • в любом случае создайте / переместите git notes ' build к HEAD,

Май 2016: cwhsu указывает в комментариях следующие возможные URL:

Вы могли бы просто использовать curl --user USER:PWD http://JENKINS_SERVER/job/JOB_NAME/build?token=YOUR_TOKEN если вы установите триггер конфигурации в вашем элементе

http://i.imgur.com/IolrOOj.png


В июне 2016 года polaretto отмечает в комментариях:

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

repository=${PWD%/hooks}; 
repository=${repository##*/} 

и затем используйте это как:

curl $JENKINS_URL/git/notifyCommit?url=$GIT_URL/$repository

Надеюсь, что это помогает: http://nrecursions.blogspot.in/2014/02/how-to-trigger-jenkins-build-on-git.html

Это просто вопрос использования curl запускать задание Jenkins, используя git-хуки, предоставляемые git.
Команда

curl http://localhost:8080/job/someJob/build?delay=0sec

можно запустить работу Дженкинса, где someJob это название работы Дженкинс.

Поиск для hooks папка в вашей скрытой папке.git. Переименовать post-commit.sample подать в post-commit, Откройте его с помощью блокнота, удалите : Nothing и вставьте в него указанную выше команду.

Вот и все. Всякий раз, когда вы делаете коммит, Git запускает команды post-commit, определенные в файле.

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

#!/usr/bin/python

import sys
from subprocess import call

if __name__ == '__main__':
    for line in sys.stdin.xreadlines():
        old, new, ref = line.strip().split(' ')
        if ref == 'refs/heads/master':
            print "=============================================="
            print "Pushing to master. Triggering jenkins.        "
            print "=============================================="
            sys.stdout.flush()
            call(["curl", "-sS", "http://jenkinsserver/git/notifyCommit?url=ssh://user@gitserver/var/git/repo.git"])

В этом случае я запускаю задания jenkins только при нажатии на master, а не на другие ветви.

Я хочу добавить к ответам выше, что становится немного сложнее, если включена авторизация Jenkins.

После включения я получил сообщение об ошибке, что анонимному пользователю необходимо разрешение на чтение.

Я видел два возможных решения:

1: Изменение моего крючка на:

curl --user name:passwd -s http://domain?token=whatevertokenuhave

2: настройка авторизации на основе проекта.

Предыдущие решения имеют тот недостаток, что мне пришлось выставить свой пароль в файле ловушек. Недопустимо в моем случае.

Второй работает для меня. В глобальных настройках авторизации мне пришлось включить Общий> Чтение для анонимного пользователя. В проекте, который я хотел вызвать, мне нужно было включить Job>Build and Job>Read for Anonymous.

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

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