≈ Approximate Number
I`m writing useless blog

Jenkins+Bitbucket Pull Request CI


Данная заметка касается реализации варианта CI для fast-forward merging.

Алгоритм работы механизма CI в данном случае: Следуя подходу Git-flow, разработчик создает новый бранч (например new_feature) для реализации какой-либо функциональности. Выполнив работу, он отправляет результат в Bitbucket и создает там pull request (new feature → master). Этот pull request не может быть одобрен (т.е. невозможно сделать merge), пока не получится выполнить удачную сборку. В результате создания (обновления, либо открытия заново) pull-request`а срабатывает триггер, и Jenkins выполняет билд той ветки, которая должна быть слита. В нашем случае, настоящего слияния не происходит, а происходит перемотка, индекс перемещается на последний коммит (результат fast-forward). Таким образом, результат слияния веток более контролируем.

Как всё это настроить: Установить необходимые плагины для Bitbucket и Jenkins:

  • Pull Request Notifier for Atlassian Bitbucket (позволяет Jenkins информировать Bitbucket о результате сборки pull request)

  • Bitbucket (Stash) Notifier Plugin for Jenkins (позволяет Jenkins уведомить Bitbucket о результате сбоки)

Существуют плагины для Jenkins, позволяющие тесней интегрировать его с Bitbucket, но они подразумевают использование OAuth, как единственный механизм для входа в Jenkins (странный подход к конфигурации: глобальная аутентификация для всего в системе без возможности разделения). Данный вариант не подходит, поскольку наша конфигурация предусматривает использование Crowd-аутентификации, и ее отключение непозволительно. Но для обеспечения pull-request CI достаточно двух плагинов. Подразумевается, что остальные плагины, например, связанные с git, уже установлены.

Отключить в Jenkins “Prevent Cross Site Request Forgery exploits”Configure Global Security), чтобы обеспечить связь Jenkins и Bitbucket без использования Crumb. В противном случае необходимо выполнить настройку для использования плагинами Crumb (например, это описано в этой инструкции). В нашем же случае достаточно использования токенов в качестве гарантии безопасности.

Настройка сборки в Jenkins Несколько слов о важных параметрах сборки:

  • В случае использования Project-based security полный доступ к билду можно оставить только администратор-у(ам). Bitbucket будет стучаться в Jenkins без учетной записи (используя лишь токен), поэтому необходимо разрешить анонимным пользователям Credentials=View, Job=Build, Job=Read
  • Передаваемые переменные - это переменные, связанные с параметрами pull request`а, которые в POST-запросе передает Pull Request Notifier for Atlassian Bitbucket. Используемые в билде:
    • ${PULL_REQUEST_FROM_BRANCH} - название ветки, для которой создан pull request. Используется в скрипте сборки для переключения в эту ветку.
    • ${PULL_REQUEST_FROM_REPO_NAME} - название самого репозитория, может использоваться в скрипте сборки, либо для email и проч.
    • ${PULL_REQUEST_FROM_HASH} - хеш коммита пулл реквеста, его билд отошлет обратно Bitbucket вместе с результатом сборки.
    • ${PULL_REQUEST_URL} - url-адрес пулл реквеста в Bitbucket, используется для email и проч.
    • ${PULL_REQUEST_TITLE} - название пулл реквеста, используется для email и проч.
    • ${PULL_REQUEST_USER_DISPLAY_NAME} - полное имя создателя пулл реквеста, используется для email и проч.
    • ${PULL_REQUEST_USER_EMAIL_ADDRESS} - его почтовый адрес, используется для email и проч.
    • ${PULL_REQUEST_AUTHOR_EMAIL} - я так понимаю, это адрес владельца репозитория (?), используется для email и проч.
    • ${PULL_REQUEST_REVIEWERS_EMAIL} - почтовые адреса ревьюиров, используется для email и проч.
  • Раздел Build Triggers → включить Trigger builds remotely (e.g., from scripts). Добавить произвольный токен, с которым Bitbucket будет делать запрос (чем сложнее, тем лучше, естественно).
  • Set Build Name - опционально.
  • Build: собственно, ваш способ сборки.
  • Post-build Actions:
    • Editable Email Notification, - используются полезные параметры, полученные Jenkins через триггер, упомянутые выше для создания понятного письма о результатах сборки.
    • Notify Stash Instance, - важный шаг, который извещает Bitbucket (в названии плагина только Stash, да) о результате сборки. Здесь нужно использовать учетную запись , которой разрешен вход в Bitbucket, например, builder. Также передается переменная ${PULL_REQUEST_FROM_HASH}, обозначающая, к какому коммиту относится данный билд.

Пример настройки рабочего билда в скриншоте:

Настройка сборки в Bitbucket

  • Необходимо разрешить аутентификацию пользователю builder (в Crowd).
  • Для выбранного репозитория/проекта необходимо:
    • добавить access key для пользователя builder.
    • настроить раздел Pull Request, где указать условия возможности Merge. Сейчас условия это: не менее 1 ревьюира и не менее 1 успешного билда.
  • Добавить новый триггер (Notification) в Administration → Manage Addons → pull-request-notifier-for-Bitbucket → Configure:
  • Buttons - в данный момент добавление кнопки для запуска триггера не требуется.
  • Notifications. Необходимо вписать правильный URL для триггера Jenkins (здесь пригодится токен). Чаще всего, это http://<JENKINS>/job/<Job_Name>/buildWithParameters?token=<TOKEN>&${EVERYTHING_URL}. Также в запросе передается переменная ${EVERYTHING_URL}, - это массив переменных, среди которых есть упомянутые выше переменные, используемые в билде. Также стоит обратить внимание на события, по которым происходит срабатывание триггера. Сейчас это происходит при открытии (OPENED), обновлении (UPDATED), открытии заново (REOPENED) пулл реквеста.

Пример настройки триггера приведен на скриншоте:


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

На почту будут приходить уведомления вида:

comments powered by Disqus

© Maksim Melnikov, 2015-2019.
Made with Jekyll and GitHub.