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

127

Как запустить сборку удаленно из 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 (перехватчик post commit).
Когда в репозитории происходят изменения, запускается автоматическая сборка.

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

Фаникумар Раджа
источник
Я отредактировал свой ответ, чтобы ответить на вторую часть вашего вопроса.
VonC

Ответы:

166

Как упоминалось в разделе « Опрос должен умереть: запуск сборок Jenkins с помощью git-хука », вы можете уведомить Jenkins о новой фиксации:

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

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

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

Это позволяет сценарию оставаться неизменным, когда в Jenkins приходят и уходят задания.
Или, если у вас есть несколько репозиториев в рамках одного хост-приложения репозитория (например, Gitosis), вы можете использовать один скрипт перехвата post-receive для всех репозиториев. Наконец, этот 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://, и он не сработал.


Вы также можете использовать простой обработчик post-receive, как в « Сборках на основе 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'build' ( 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, Поларетто отмечает в комментариях :

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

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

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

curl $JENKINS_URL/git/notifyCommit?url=$GIT_URL/$repository
VonC
источник
привет фон, как вы сказали при первом вызове, я должен добавить заметки о сборке. Мой первый вызов - читать файл .java всякий раз, когда разработчик вводит изменения в репозиторий git. Я новичок во всех этих вещах, поэтому я спрашиваю каждый шаг. пожалуйста, не возражайте, и я должен выполнить эту задачу.
phanikumar Raja
Это очень помогло мне. Я написал Git hook с помощью этой темы. Спасибо, ребята!
Кирилл Базаров
Мне пришлось добавить вызов curl в файл после получения, что не совсем понятно из этого ответа. В любом случае очень полезно!
Magnilex 08
1
@IgorGanapolsky в папке хуков вашего голого репо, которое получает коммиты и которое должно вызывать jenkins:yourRepo.git/hooks/post-receive
VonC
2
Это может быть очевидным, но у меня были проблемы с: curl http://yourserver/jenkins/git/notifyCommit?url=<URL of the Git repository>. Параметр url должен точно соответствовать тому, что у вас есть в URL-адресе репозитория вашего задания Jenkins. При копировании примеров я пропустил протокол, в нашем случае ssh: //, и он не работал.
ptha
17

Надеюсь, это поможет: 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

может запускать задание Jenkins, где someJob- имя задания Jenkins.

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

Вот и все. Каждый раз, когда вы выполняете фиксацию, Git запускает команды после фиксации, определенные в файле.

навигационный
источник
После выполнения фиксации с машины разработчика вызывается post-receive, а не post-commit. Проверено путем помещения операторов журнала в оба крючка. Я неправильно читаю документацию, разве это не должно быть вызвано пост-фиксацией?
Shirish Hirekodi
@ Шириш: Странно. Возможно, вы делаете что-то по-другому
Nav
это сборка успешно, когда я нажимаю последнее изменение, но не строю, когда я фиксирую изменения ... ???
3

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

#!/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, а не на другие ветки.

Zitrax
источник
1
Как связать этот скрипт Python с Jenkins? Или вы просто запускаете его один раз?
Игорь Ганапольский
Дженкинс не знает об этом хуке, основная часть загружает URL-адрес notifyCommit на сервер jenkins, который запускает опрос. Я думаю, что опрос включен, но без расписания на стороне Дженкинса.
Zitrax
Итак, где находится этот скрипт Python? Я предполагаю, что вы связали это со своей установкой git, чтобы отслеживать коммиты ...
Игорь Ганапольский
1
Поздний ответ - но местоположение сценария будет на сервере git в хуках / пост-приеме. Прочтите о хуках git, чтобы узнать больше.
Zitrax 06
3

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

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

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

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

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

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

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

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

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

anhoppe
источник