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

Я новичок в Дженкинсе. Как инициировать построение удаленно от Jenkins?
Кто-нибудь может сказать, как настроить Git post commit hook?

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

В разделе сборки триггеров Jenkins я выбрал удаленную триггерную сборку.
В директории .git есть каталог hooks, в котором мы должны настроить post commit file.
Я сбиваю с толку, как запускать сборку оттуда (я знаю, какую часть мы должны использовать команду curl).


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

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

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

Ответ 1

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

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

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

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

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

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

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

http://jenkins:8080/git/notifyCommit?url=git[email protected]:tools/common.git

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

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

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

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


Вы также можете использовать простой пост-приемный крючок, как в " Push-based build, используя Jenkins и GIT "

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

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

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

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


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

В принципе, вы создаете script:

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

Ответ 2

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

Это просто вопрос использования curl для запуска задания Дженкинса с помощью крючков git, предоставленных git.
Команда

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

может выполнять задание Jenkins, где someJob - это имя задания Jenkins.

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

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

Ответ 3

Как и в предыдущем ответе, был показан пример того, как выглядит полный крючок, вот код моего рабочего крюка post-receive:

#!/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://[email protected]/var/git/repo.git"])

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

Ответ 4

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

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

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

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

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

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

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

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

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