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


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

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

в Jenkins триггер создать раздел I выбранного триггера построить удаленно.
В .git КАТАЛОГ, КАТАЛОГ крючков есть в том, что мы должны настроить файл post commit.
Я путаю как запустите сборку оттуда (я знаю, что некоторые части мы должны использовать команду curl).


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

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

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

4 112

4 ответа:

как говорилось в "опрос должен умереть: запуск Дженкинса строится из крючка git", вы можете уведомить Дженкинса о новой фиксации:

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

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

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

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

как упомянутые здесь, убедитесь, что вы выбрали правильный адрес для вашего сервера 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>. 

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


вы также можете использовать простой пост-получаем крюк, как в "толчок на основе строит с помощью Дженкинса и GIT"

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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