Jenkins: pipeline плагин и триггер билда через Github webhook

Автор: | 24/02/2017

Задача: триггерить билд по каждому 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: SUCCESS

FreestyleBuild #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: SUCCESS

PipelineBuild #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

GitHub Plugin

Setting up a Jenkins 2.0 pipeline

Webhooks