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

от автора

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

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

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

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

Когда мы запускаем git pull с помощью PHP, команда выполняется не от имени вашего пользователя. Поэтому 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/articles/718608/