Не так давно я решил настроить автоматический деплой на сервер из Bitbucket репозитория (хотя для GitHub всё делается абсолютно аналогично).
Есть множество специализированных инструментов для подобной задачи (например jenkins), но мне захотелось использовать сам git, ибо его было вполне достаточно.
В теории всё очень просто: после каждого изменения в репозитории bitbucket должен дёргать специальный скрипт на нашем сервере, смысл которого сводился бы к следующему
exec('git reset --hard HEAD'); exec('git pull');
На практике я столкнулся с некоторыми трудностями при настройки всего этого добра на сервере. Надеюсь статья поможет людям, которые не очень близки к администрированию.
Итак, для начала нам нужно установить sudo и git (если не установлено ранее):
apt-get install sudo apt-get install git
Все следующие действия нам нужно выполнять от имени пользователя, от которого будет выполняться деплой. Чтобы точно определить кто это, вы можете записать в любой php скрипт код
echo exec('whoami');
и запустить его в браузере. В нашем примере пусть это будет user.
Чтобы выполнять команды от имени user, можно прописать в консоль:
sudo -u user bash
И тогда все последующие команды будут от имени пользователя user. Либо для всех команд в начале добавлять sudo -u user, к примеру sudo -u user cd /.
Далее выполняем следующие команды:
cd ~/.ssh ssh-keygen -t rsa
Мы переходим в папку ssh нашего пользователя (если её не существует — нужно создать: mkdir ~/.ssh) и запускаем генерацию ssh ключа. Укажите любое имя для ключа, а поле пароля оставьте пустым.
Далее в папке .ssh вы увидите 2 файла, id_rsa и id_rsa.pub (вместо id_rsa имя ключа, которое вы ввели). Скопируйте себе .pub файл, откройте в редакторе и всё его содержимое добавьте в специальный раздел настроек вашего проекта на Bitbucket. Найти этот разделы можно так: Страница проекта -> Настройки проекта -> Deployment keys.
Затем запускаем ssh агент и добавляем созданный ключ:
ssh-agent /bin/bash ssh-add ~/.ssh/id_rsa
После этого заходим в папку, где будет лежать проект и клонируем репозиторий:
cd ~/www/путь_до_проекта/ git clone git@bitbucket.org:name/project.git
При первом подключении он спросит добавить ли неизвестный ip в список, введите yes. Репозиторий должен успешно склонироваться, если это произошло, значит вы всё сделали правильно.
Теперь осталось настроить сам деплой. Для этого я использовал чужой скрипт, который можно найти тут, но без проблем можно написать и своё решение. Не забудьте сменить значения некоторых переменных на свои. Располагаем этот скрипт по адресу, к примеру, yoursite.ru/deploy.php, после чего идём в настройки проекта на Bitbucket, в раздел Services, добавляем новый, выбрав POST, и вставляем в поле URL нашу ссылку.
Теперь можно всё проверит: сделать тестовый коммит, запушить его и посмотреть, появляются ли они на сервере.
Добрый вечер, подскажите пожалуйста на какой cms лучше всего будет создать свой сообственый блог?
На той, на которой вы умеете что-либо делать
Эммм, а если кто-то будет просто дергать Вашу ссылку yoursite.ru/deploy.php ? То таким образом Ваш проект будет постоянно выполнять скрипт, следовательно можно Ваш сервак серьезно нагрузить
Да, в теории это можно сделать.
Но:
— Необязательно его держать в корне сайта, можно по какому-нибудь техническому адресу, доступному только вам.
— Этот способ точно не для продакшена, а для разработки. Dev сервер, если загрузится почему-то, перестанет работать и прочее — ничего страшного, он для этого и создан.
— Конечно, есть куча специальных средств для нормального деплоя, типа jenkins, которые нужно использовать. Но если хочется что-то совсем простое для своего домашнего проекта, то вполне рабочий вариант.
Очень помогли, но есть один вопрос. Когда конечный сервер пулит с помощью деплой скрипта данные из битбакет он создает отдельную папку с названием репозитория, сейчас это у меня «test», а я хотел бы чтобы содержимое репозитория попадало в папку где лежит deploy.php напрямую. Подскажите пожалуйста куда нажимать, свечку вам поставлю и тосты в вашу честь буду произносить)
Вот тут указывается соответствие репозиториев и папок:
Путь до папки выходит
$root_dir . $repos[$slug]
Проще говоря: не нужна папка test — не указывайте её в $repos
Оказалось что я первичный git clone из сервера принял за то что скрипт отработал. Я еще подумал, вот не разбираюсь в этих бэкэндах, а получилось переменные правильно ввести. Не получилось. Да и я не нашел servises в настройках проекта bitbucket, решил что теперь это webhooks в настройках конкретного репозитория. Наверное и тут косяк. В общем очень большую услугу сделаете смертным если объясните что в переменных этого скрипта писать. Для новичка двусмысленно звучит комментарий например $_directory – «The directory where your website and git repository are located». Вроде как репозиторий находится внешне, а сайт то мой вот он тут, почему просят один урл, или это вообще массив который не надо заполнять. Или $root_dir «The root directory where the repos live.» ну а черт знает где он живет, имеется ли в виду вид «git@bitbucket.org:name/project.git» или нужен https вид. Я чэсна перебрал 13 вариантов (коммитил и пушил) и не удалось, ну и логично что на месте repo_slug, repo_location тоже у меня возникает несколько возможных вариантов чего вписать :( В любом случае еще раз спасибо за ответ и статью.
Окей, постараюсь в ближайшее время обновить статью, спасибо.
У вас в итоге всё получилось?
Спасибо большое за статью!