Я решил что сайт слишком уныл, поэтому попросил нарисовать мне всяких животных, которых вы видите
04.08.2015

Git: Как настроить автоматически деплой из Bitbucket на сервер

Автоматический деплой из bitbuckey на сервер

Не так давно я решил настроить автоматический деплой на сервер из 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 нашу ссылку.

Теперь можно всё проверит: сделать тестовый коммит, запушить его и посмотреть, появляются ли они на сервере.

Категория: Разработчику Просмотров: 29276 9 комментариев

Комментарии

9 комментариев

DorkiNivu103 19.09.2019 в 20:27

Добрый вечер, подскажите пожалуйста на какой cms лучше всего будет создать свой сообственый блог?

z17 25.09.2019 в 21:10

На той, на которой вы умеете что-либо делать

Антон 23.09.2017 в 14:05

Эммм, а если кто-то будет просто дергать Вашу ссылку yoursite.ru/deploy.php ? То таким образом Ваш проект будет постоянно выполнять скрипт, следовательно можно Ваш сервак серьезно нагрузить

z17 24.09.2017 в 00:52

Да, в теории это можно сделать.

Но:
— Необязательно его держать в корне сайта, можно по какому-нибудь техническому адресу, доступному только вам.
— Этот способ точно не для продакшена, а для разработки. Dev сервер, если загрузится почему-то, перестанет работать и прочее — ничего страшного, он для этого и создан.
— Конечно, есть куча специальных средств для нормального деплоя, типа jenkins, которые нужно использовать. Но если хочется что-то совсем простое для своего домашнего проекта, то вполне рабочий вариант.

Костя 19.07.2017 в 13:12

Очень помогли, но есть один вопрос. Когда конечный сервер пулит с помощью деплой скрипта данные из битбакет он создает отдельную папку с названием репозитория, сейчас это у меня «test», а я хотел бы чтобы содержимое репозитория попадало в папку где лежит deploy.php напрямую. Подскажите пожалуйста куда нажимать, свечку вам поставлю и тосты в вашу честь буду произносить)

z17 19.07.2017 в 21:36

Вот тут указывается соответствие репозиториев и папок:

/**
* A list of repo slugs that the script is allowed to know about, and their
* locations relative to $root_dir.
* 
* @var array
*/
$repos = array(
  ‘repo-slug’ => ‘repo_location’
);

Путь до папки выходит $root_dir . $repos[$slug]

Проще говоря: не нужна папка test — не указывайте её в $repos

Костя 20.07.2017 в 15:00

Оказалось что я первичный 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 тоже у меня возникает несколько возможных вариантов чего вписать :( В любом случае еще раз спасибо за ответ и статью.

z17 24.07.2017 в 15:34

Окей, постараюсь в ближайшее время обновить статью, спасибо.

У вас в итоге всё получилось?

Ильдар 01.07.2017 в 22:52

Спасибо большое за статью!

Добавить комментарий