![](https://habrastorage.org/getpro/habr/upload_files/f6e/681/fd2/f6e681fd23da9c4d75bf41a0361a2b8a.jpg)
В этой статье я покажу, как организовать простейший автодеплой на сервере. Для автодеплоя через 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);
После того, как вы узнали вашего пользователя, выполняем следующие шаги:
Генерируем SSH-ключ для этого пользователя
sudo -u имя_этого_пользователя ssh-keygen -t rsa
Путь, где лежит папка .ssh и сгенерированный ключ будет показываться во время генерации ключа.
Добавляем bitbucket.org в known_hosts
ssh-keyscan -H bitbucket.org >> /путь/где/лежит/папка/.ssh/known_hosts
Добавляем наш публичный ключ для этого пользователя в Bitbucket
Для начала выводим ключ терминале, копируем
cat /путь/где/лежит/папка/.ssh/id_rsa.pub
и добавляем в Bitbucket — Personal settings->SSH keys->Add key.
Создаем Webhook
Заходим в репозиторий нашего проекта, потом в Repository settings->Webhooks->Add Webhook.
Прописываем название вебхука, ссылку на которую он должен триггериться и событие, при котором должен произойти автодеплой.
![](https://habrastorage.org/getpro/habr/upload_files/bd0/d17/a85/bd0d17a85a417f29947bf37cc8aca2f6.png)
Нужно обратить внимание, что вебхук отправляет 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 должна работать.