Простой автодеплой средствами Bitbucket Webhooks и PHP

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

В этой статье я покажу, как организовать простейший автодеплой на сервере. Для автодеплоя через Bitbucket Webhooks и PHP не нужно использовать какие-то сложные решения.

Для начала можно подумать, что git pull выполняется через PHP с помощью этого куска кода:

exec('cd /путь/к/корневой/папке && git pull origin master');

Но во время выполнения этого кода возникает ошибка доступа, даже, если добавлен SSH-ключ в Bitbucket.

Когда мы запускаем git pull с помощью PHP, команда выполняется не из root пользователя. Поэтому Bitbucket не распознает наш SSH-ключ. Из-за этого возникает ошибка доступа, если репозиторий закрытый.

Функция exec выполняет команды от имени стандартного пользователя вашего веб-сервера. В Nginx это обычно www-data. Самый простой способ узнать пользователя от имени которого выполняются PHP скрипты, выполнять этот кусок кода и смотреть в браузере:

$result = exec('whoami');
var_dump($result);

После того, как мы узнали вашего пользователя, выполняем следующие шаги:

  1. Генерируем SSH-ключ для этого пользователя

sudo -u имя_этого_пользователя ssh-keygen -t rsa

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

  1. Добавляем bitbucket.org в known_hosts

ssh-keyscan -H bitbucket.org >> /путь/где/лежит/папка/.ssh/known_hosts
  1. Добавляем наш публичный ключ для этого пользователя в Bitbucket

Для начала выводим ключ терминале, копируем

cat /путь/где/лежит/папка/.ssh/id_rsa.pub

и добавляем в Bitbucket —  Personal settings->SSH keys->Add key.

  1. Создаем Webhook

Заходим в репозиторий нашего проекта, потом в Repository settings->Webhooks->Add Webhook.

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

Нужно обратить внимание, что вебхук отправляет POST запрос. Если ваш URL настроен на GET запросы, вебхук не будет работать. Bitbucket не показывает ошибку, если ссылка настроена на GET запросы, но и деплой не происходит.

PHP скрипт можно дополнять по необходимости. Можно кроме выполнения git pull ещё мигрировать базу и выполнять другие команды. Вебхуки передают данные во время обращения к вашей ссылке. Эти данные вы можете обработать и сделать необходимые проверки.

Ошибки, которые могу возникнуть

Ошибка #1

Если владелец ваших файлов проекта пользователь root, тогда Git может выдать такую ошибку "fatal: detected dubious ownership in repository".

Помогает рекурсивное изменение владельца папки на пользователя, от имени которого выполняются PHP скрипты.

chown -R имя_вашего_пользователя:root /путь/к/корневому/директорию/проекта

Еще можно в конфигах Git добавить эту настройку:

[safe]
    directory = /путь/к/корневому/директорию/проекта

Для этого нужно создать .gitconfig файл в домашнем директории вашего пользователя и в нем прописать эти настройки. Это тот директорий, где лежит ваша недавно сгенерированная папка .ssh. Эти настройки будут применяться, когда Git запустится от имени этого пользователя.

Ошибка #2

Ещё может возникнуть ошибка "fatal: empty ident name not allowed"

Для решения ошибки Git предлагает выполнить эти команды, чтобы добавить ваше имя и почту:

git config --global user.email ""
git config --global user.name ""

Но эти команды задают глобальные настройки, а нам нужно задавать настройки именно для нашего пользователя. Для этого мы заходим в уже созданный для нашего пользователя .gitconfig файл и добавляем следующие настройки:

[user]
        name = ваше_имя
        email = ваша_почту

После этого команда git pull со стороны PHP должна работать.

Источник: https://habr.com/ru/post/718608/


Интересные статьи

Интересные статьи

Представляем вашему вниманию чрезвычайно простой алгоритм сортировки. Может показаться, что он очевидно ошибочен, но мы докажем, что на самом деле он корректен. Мы сравним его с другими простыми алг...
В своё время я сам здорово намучился с английскими временами. Совершенно не получалось понять, как они формируются. Когда наконец удалось вызубрить все правила, самые про...
Выгрузка пользователей из 1C ЗУП в Битрикс24 или правдивая история о том как настроить интеграцию 1С-Битрикс24 с ЗУП без 1С-ника В жизни так бывает, причём бывает чаще чем хотелось б...
Суть проекта Когда я только устроился на первую работу разработчиком Java, сразу же возникла проблема уведомлений о событиях в Bitbucket. Направление Java разработки было новым (я был ...
Всем привет. Если вы когда-либо работали с универсальными списками в Битрикс24, то, наверное, в курсе, что страница детального просмотра элемента полностью идентична странице редак...