Как подружить хостинг-панель VESTA и Bitbucket
Разработка с применением систем контроля версий становится сегодня все более популярной, и сисадмину приходится иногда решать нестандартные задачи. Разберемся, как подружить хостинг-панель VESTA и Bitbucket.
Подключаемся к Bitbucket
Самый, наверное, простой способ использования Git, позволяет разработчику сразу после коммита отправлять файл на сервер, например
1 2 |
nano .htaccess git commit -a -m "htaccess correction" |
Если не добавим изменения в общий репозиторий, то мы можем в будущем получить нерабочий сайт. Ведь
при последующем слиянии Git добавит в файлы служебную информацию, которая нарушит синтаксис.
В итоге пришли к схеме, когда между сервером и разработчиком будет находиться посредник, в данном случае это веб-сервис для хостинга проектов Bitbucket.
Git позволяет выполнять push и pull через SSH или HTTPS. В зависимости от задач подойдут оба способа. HTTPS очень прост в настройке и рекомендуется при нечастом использовании. Выглядит это так. Инициализируем локальный репозиторий, подключаем удаленный и забираем изменения.
1 2 3 |
$ git init $ git clone https://аккаунт@bitbucket.org/тема/репозиторий.git $ git pull origin master |
Но при коммите на Bitbucket необходимо вводить пароль. Поэтому с точки зрения удобства желательно использовать именно SSH.
Для подключения через Git/SSH нужно сгенерировать пару ключей и загрузить публичный ключ на Bitbucket.
1 |
В качестве имени файла можно указать bitbucket, чтобы впоследствии не путаться. Запрос на ввод пароля игнорируем, нажимаем Enter. Меняем права доступа, иначе скрипт будет выдавать ошибку.
1 |
$ chmod 0600 ~/.ssh/bitbucket |
Проверяем, работает ли ssh-agent, и добавляем ключ:
1 |
$ eval "$(ssh-agent -s)" |
Добавляем ключ:
1 2 |
$ ssh-add ~/.ssh/bitbucket $ ssh-add -l |
Можно проверить, чтобы в ~/.ssh/config была информация для идентификации хоста Bitbucket:
1 2 |
Host bitbucket.org IdentityFile ~/.ssh/bitbucket |
Переходим в настройки учетной записи «Безопасность → SSH-ключи» на сайте Bitbucket и добавляем публичный ключ bitbucket.pub, скопировав его содержимое в буфер обмена.
После этого можно попробовать подключиться к серверу без пароля:
1 |
$ ssh -Tvv git@bitbucket.org |
Наполняем сайт
Если сайт пустой, а репозиторий содержит все нужные данные, то просто выполняем стандартное клонирование
1 |
$ git clone git@bitbucket.org:аккаунт/тема/репозитарий.git |
Проблем в этом случае минимум, т.к. ставим с нуля, и не будет конфликтов между локальными файлами и теми, что уже есть в репозитории. Только следует (если нужно) поправить права доступа, чтобы веб-сервер мог читать файлы.
Если подключаемся к уже работающему веб-ресурсу, алгоритм чуть другой. Нужно как-то инициализировать репозиторий. Дело в том, что git не хочет делать репозиторий в каталоге, в котором уже есть какие-то файлы. И после ввода git init просто выдает ошибку. Чтобы выйти из ситуации, нужно инициализировать репозиторий в отдельном каталоге, а затем просто скопировать в рабочий и проверить работу командой git pull. Но файлы в Git и локальные не должны различаться, иначе придется запускать git checkout, и мы можем получить нерабочий сайт. Причем нет необходимости переносить все файлы сайта, достаточно перенести только каталог .git. Не забываем о правах доступа. Так как имя начинается с точки, то шаблон * не сработает, нужно явно указать.
1 |
$ sudo chown -R www-data:www-data /var/www/site/.* |
Подключаем удаленный репозиторий:
1 |
$ git remote add origin git@bitbucket.org:аккаунт/тема/репозитарий.git |
И пробуем работу:
1 |
$ git pull origin master |
Стоит подумать, какие файлы добавить в .gitignore. Обычно разработчику не нужен весь сайт.
Используем хуки
Разработчик может выкладывать код в Bitbucket, а мы забирать вручную на сайт. Но этот процесс легко автоматизировать за счет использования хуков. Хук в Git – это скрипт на любом поддерживаемом языке, выполняющийся в зависимости от наступления определенного события. В Bitbucket также доступны хуки. Реализовано фактически сразу два варианта: вебхук (Webhooks) и Службы. В журналах веб-сервера они выглядят так:
1 2 |
"POST /post.php HTTP/1.0" 200 216 "-" "BitbucketWebhooks/2.0" "POST /post.php HTTP/1.0" 200 713 "-" "Bitbucket.org" |
Проект поддерживает несколько хуков, поэтому можно указать действия буквально для каждого события. Настроить хуки можно через API или веб-интерфейс (меню «Настройка»). Для вебхука следует указать URL и событие (всего 21 событие). Далее при срабатывании на указанный в установках URL отправляется POST-запрос с данными в JSON-формате, при необходимости можно запрос обработать и действовать в зависимости от параметров. В интерфейсе есть возможность просмотра отправленного запроса View requests, что упрощает написание скриптов. В случае Службы можно выбрать несколько вариантов: POST-запрос, сообщение Twitter и обращение к различным сервисам из списка.
Также для управления репозиторием предусмотрено API двух версий – 1 и 2 . В принципе основные функции одинаковы, но, наверное, лучше использовать вторую. В Linux для отправления запроса удобнее применять curl. Создадим приватный репозиторий (параметров можно указать много, все они есть в документации).
1 2 3 4 |
$ curl -X POST -v -u user:pass https://api.bitbucket.org/ ↵ 2.0/repositories/название_репозитория ↵ -H "Content-Type: application/json" ↵ -d '{"is_private": true}' |
В ответ должны получить длинный список параметров с информацией о новом репозитории, там есть и URL для хука (он отличается от основного).
Создаем вебхук на помещение данных в репозиторий (repo:push в веб-интерфейсе Repository push). В качестве URL указываем http://example.org/bitbucket.php.
1 2 3 4 5 |
$ curl -X POST -v -u 'user:pass' -d '{ "description" : ↵ "Autodeploy", "url" : "http://example.org/ ↵ bitbucket.php", "events" : [ "repo:push" ], ↵ "active": "true" } ' https://api.bitbucket.org/ ↵ 2.0/repositories/название_репозитария/hooks |
В самом простом случае один веб-сайт, один проект и т.п., то есть не требуется обработка запроса. Достаточно, чтобы Bitbucket просто обратился по указанному URL. В самом файле поместим команду, которая получит на сайт данные коммита из репозитория. Скрипт, в общем, простой:
1 2 3 |
$ nano bitbucket.php <?php $command = shell_exec("/usr/bin/git pull ↵ origin master 2>&1"); ?> |
Можно на период отладки добавить echo $command. Это поможет сразу увидеть в браузере ошибку.
Теперь Bitbucket пошлет запрос, и команда будет выполнена. Сам Bitbucket использует IP 131.103.20.160/27, 165.254.145.0/26, 104.192.143.0/24, если не нужно запускать скрипт вручную, можно ограничить обращение к скрипту этим диапазоном. В зависимости от настроек сервера для выполнения может не хватить прав доступа. В этом случае выполняем команду через sudo.
1 |
shell_exec("sudo /usr/bin/git pull origin master 2>&1"); |
Далее набираем команду visudo и в /etc/sudoers записываем:
1 |
www-data ALL=(root) NOPASSWD:/usr/bin/git |
Теперь должно работать.
Модернизация вебпанели VESTA
Схема показалась удобной, и было решено сделать сразу хостинг, в котором разработчики могли пробовать свои проекты. Идея такая. При создании домена сразу инициализировался локальный и удаленный репозиторий с именем домена, и устанавливалось соединение, и прописывался вебхук. Веб-хостинг предлагал в качестве веб-панели VESTA, она показалась удобной, так как состоит из отдельных скриптов, выполняющих свои задачи. Хотя наверняка подобное можно реализовать и с помощью других веб-панелей. Предварительные операции те же.
За создание веб-домена отвечает скрипт v-add-webdomain (находится в /usr/local/vesta/bin).
Все нужные переменные $user, $domain берутся из настроек самого скрипта. Единственное, чтобы репозиторий не назывался по полному доменному имени, вроде test. example.org, а просто test, вырежем имя домена и сохраним в переменную repo. В Bitbucket можно создавать темы, если для разработки используется такая тема, то она указывается в URL. Так как инициализировать репозиторий нужно в пустом каталоге, то добавляем в файле после Creating domain logs такие строки:
Теперь осталось скопировать в каталог /usr/local/vesta/ data/templates/web/skel/public_html файл bitbucket.php и, если нужно, .gitignore, и все будет работать.
Схема очень простая, при необходимости ее можно развивать. В сети и на Git в частности есть готовые решения для хуков Bitbucket, но некоторые из них требуют доработки, т.к. API несколько изменился в последнее время.
Если Вам необходимо настроить GIT или Bitbucket или другие продукты, а также услуги DevOps администратора обращайтесь [email protected]