Задача: триггерить билд по каждому
push
в репозиторий.
Усложнаяется задача тем, что некоторые билды созданы как Freestyle project и используют плагин GitHub плагин, а некоторые — созданы через Pipeline плагин. Ниже описано создание вебхуков в Github для обоих типов билдов.
Содержание
Firewall
Сначала — Azure firewall.
Находим IP Github-а тут>>>, добавляем правило:
Подготовка Jenkins
Добавляем пользователя Jenkins для Gihub-а.
Переходим Manage Jenkins > Manage Users > Create User и добавляем пользователя:
Github — добавление Webhook для Freestyle проекта
Переходим в репозиторий — Settings > Webhooks > Add webhook.
Указываем URL в виде:
http://username:[email protected]/github-webhook/
Внимание на github-webhook/
— слеш в конце нужен:
Content type — оставляем без изменений.
Проверяем статус:
Проверяем лог самого Jenkins, если всё ОК — то должно быть сообщение вида:
Feb 21, 2017 11:08:47 AM org.jenkinsci.plugins.github.webhook.subscriber.PingGHEventSubscriber onEvent
INFO: PING webhook received from repo <https://github.com/reponame/jm-jenkins>!
В случае ошибки вида:
Feb 22, 2017 2:20:07 PM hudson.security.csrf.CrumbFilter doFilter
WARNING: No valid crumb was included in request for /. Returning 403.
Переходим Manage Jenkins > Configure Global Security > Prevent Cross Site Request Forgery exploits и снимаем чекбокс:
Jenkins — настройка Freestyle/GitHub билда
Создаём Freestyle проект, и добавляем GitHub hook trigger for GITScm polling:
Вносим изменения в репозиторий:
[simterm]
$ touch htest && git add htest && git commit -m "Webhook test" && git push
[/simterm]
Проверяем лог Jenkins:
Feb 22, 2017 2:30:03 PM org.jenkinsci.plugins.github.webhook.subscriber.DefaultPushGHEventSubscriber onEvent
INFO: Received PushEvent for https://github.com/setevoy2/tests from 192.30.252.45 ⇒ http://jenkins.domain.tld:34585/github-webhook/
Feb 22, 2017 2:30:03 PM org.jenkinsci.plugins.github.webhook.subscriber.DefaultPushGHEventSubscriber$1 run
INFO: Poked FreestyleBuild
Feb 22, 2017 2:30:03 PM org.jenkinsci.plugins.github_branch_source.PushGHEventSubscriber onEvent
INFO: Received PUSH for https://github.com/setevoy2/tests from 192.30.252.45 ⇒ http://jenkins.domain.tld:34585/github-webhook/
Feb 22, 2017 2:30:04 PM com.cloudbees.jenkins.GitHubPushTrigger$1 run
INFO: SCM changes detected in FreestyleBuild. Triggering #2
Feb 22, 2017 2:30:10 PM hudson.model.Run execute
INFO: FreestyleBuild #2 main build action completed: SUCCESS
В самом Jenkins:
ОК, с GitHub плагином — проблем нет.
Jenkins — настройка Pipeline билда
Pipeline использует свою логику и вызовы для работы с Github, поэтому пример выше тут не сработает — пуши будут приходить, но билд не запустится.
Создаём простой билд-скрипт:
#!/usr/bin/env groovy node { println 'Hello, Jenkins!' }
Создаём билд:
Ставим отметку на GitHub hook trigger for GITScm polling, как в примере выше:
Выполняем пуш:
[simterm]
$ git add buildme.groovy && git commit -m "Pipeline build trigger will not work now" && git push
[/simterm]
Проверяем лог Jenkins:
Feb 22, 2017 2:42:29 PM org.jenkinsci.plugins.github.webhook.subscriber.DefaultPushGHEventSubscriber onEvent
INFO: Received PushEvent for https://github.com/setevoy2/tests from 192.30.252.41 ⇒ http://jenkins.domain.tld:35599/github-webhook/
Feb 22, 2017 2:42:29 PM org.jenkinsci.plugins.github.webhook.subscriber.DefaultPushGHEventSubscriber$1 run
INFO: Poked FreestyleBuild
Feb 22, 2017 2:42:29 PM org.jenkinsci.plugins.github_branch_source.PushGHEventSubscriber onEvent
INFO: Received PUSH for https://github.com/setevoy2/tests from 192.30.252.41 ⇒ http://jenkins.domain.tld:35599/github-webhook/
Feb 22, 2017 2:42:30 PM com.cloudbees.jenkins.GitHubPushTrigger$1 run
INFO: SCM changes detected in FreestyleBuild. Triggering #3
Feb 22, 2017 2:42:40 PM hudson.model.Run execute
INFO: FreestyleBuild #3 main build action completed: SUCCESSFreestyleBuild #3 main build action completed: SUCCESS
Затриггерился только первый проект.
Решение — использовать Trigger builds remotely (e.g., from scripts):
Возвращаемся в Github, и обновляем или добавляем новый вебхук.
Тут мы используем родной Jenkins API для триггера билда, запрос будет выглядеть так:
JENKINS_URL/job/PipelineBuild/build?token=TOKEN
Следовательно, для вызова сборки PipelineBuild — в webhook указываем:
http://gituser:[email protected]:8080/job/PipelineBuild/build?token=triggerPipelieBuild
Проверяем лог:
Feb 22, 2017 2:44:19 PM org.jenkinsci.plugins.github.webhook.subscriber.DefaultPushGHEventSubscriber onEvent
INFO: Received PushEvent for https://github.com/setevoy2/tests from 192.30.252.41 ⇒ http://jenkins.domain.tld:49370/github-webhook/
Feb 22, 2017 2:44:19 PM org.jenkinsci.plugins.github.webhook.subscriber.DefaultPushGHEventSubscriber$1 run
INFO: Poked FreestyleBuild
Feb 22, 2017 2:44:19 PM org.jenkinsci.plugins.github_branch_source.PushGHEventSubscriber onEvent
INFO: Received PUSH for https://github.com/setevoy2/tests from 192.30.252.41 ⇒ http://jenkins.domain.tld:49370/github-webhook/
Feb 22, 2017 2:44:19 PM com.cloudbees.jenkins.GitHubPushTrigger$1 run
INFO: SCM changes detected in FreestyleBuild. Triggering #4
Feb 22, 2017 2:44:25 PM hudson.model.Run execute
INFO: FreestyleBuild #4 main build action completed: SUCCESS
Feb 22, 2017 2:51:33 PM org.jenkinsci.plugins.workflow.job.WorkflowRun finish
INFO: PipelineBuild #1 completed: SUCCESSPipelineBuild #1 completed: SUCCESS
FreestyleBuild тоже затриггерился из-за изменений в репозитории.
Авторизация
Вместо использования пароля в запросе — можно сгенерировать токен доступа для пользователя.
Логинимся под gituser, переходим на страницу http://JENKINS_URL/user/USERNAME/configure, и нажимаем Show API token:
После чего обновляем URL запроса:
[simterm]
$ curl http://gituser:cbc***[email protected]:8080/job/PipelineBuild/buildWithParameters?token=triggerPipelieBuild\&branch=master
[/simterm]
Готово.
Ссылки по теме
How to Start Working with the GitHub Plugin for Jenkins
Setting up a Jenkins 2.0 pipeline