Рассмотрим настройку автодеплоя кода с использованием контроля версий на примере GitHub, WordPress и PHP скрипта git-deploy. Самое простое решение из найденных.
Ситуация и требования
- нужно минимальное и простое решение, желательно бесплатное
- без использования платных микросервисов типа DeployHQ
- рабочий чат в Телеграм и потому хочется иметь бота, который будет сообщать о результатах автодеплоя чтобы все были в курсе
- код в GitHub и потому хочется всеми настройками управлять как кодом
Выбор и настройка PHP-скрипта git-deploy
Перебрал около 5 вариантов, остановился на решении: https://github.com/vicenteguerra/git-deploy
Оно очень простое по коду и легко настраивается.
Внутри сайта я создал папку _tools/git-deploy — куда разместил сам скрипт.
Далее внутри добавил конфигурационный файл и он же стартер:
_tools/git-deploy/deploy-wp.php
Далее внутри этого файла через константы задал те параметры, которые нужны были для работы автодеплоя:
<?php
// The secret token to add as a GitHub or GitLab secret, or otherwise as https://www.example.com/?token=secret-token
define("TOKEN", "secret-token-key");
// The SSH URL to your repository
define("REMOTE_REPOSITORY", "[email protected]:uptimizt/my-site.git");
// The path to your repostiroy; this must begin with a forward slash (/)
define("DIR", "/home/c/cltw/mysite.ru/repo");
// The branch route
define("BRANCH", "refs/heads/master");
// The name of the file you want to log to.
define("LOGFILE", "deploy.log");
// The path to the git executable
define("GIT", "/usr/bin/git");
// Override for PHP's max_execution_time (may need set in php.ini)
define("MAX_EXECUTION_TIME", 333);
// A command to execute before pulling
define("BEFORE_PULL", "");
// A command to execute after successfully pulling
define("AFTER_PULL", "
cd /home/c/cl36462/wooms.wpcraft.ru/repo/ \
; git clean -xfd \
; git submodule foreach --recursive git clean -xfd \
; git reset --hard \
; git submodule foreach --recursive git reset --hard \
; git submodule update --init --recursive \
&& rsync -av --delete --exclude '.git' --exclude 'wp-content/uploads/*' --exclude '_tools/git-deploy/deploy.log' /home/c/from/repo/app/public/ /home/c/to/public_html/
");
require_once("deployer.php");
Особенности конфигурации:
- TOKEN — это токен, который мы будем использовать затем в GitHub для автоматизации деплоя
- REMOTE_REPOSITORY — из какого репозитория будет происходить обновление кода
- DIR — в какой папке на сервере будет копия репо
- BRANCH — обычно мастер, но может быть своя ветка
- AFTER_PULL — тут писал команды, которые выполняются после обновления кода в репо, для того чтобы далее этот код залить в папку сайта
Важно понимать что на сервере есть 2 папки: папка с git repo и папка с файлами сайта, которые реально работают. Автодеплой идет в 2 шага, сначала обновляется репо, а затем из репо файлы синкаются rsync в папку веб сервера.
Настройка GitHub
В GitHub нам нужно иметь код нашего сайта или приложения.
Например так:
Затем идем в настройки репо, далее раздел Webhooks, добавляем вебхук.
Пример конфигурации:
Тут важны 2 параметра:
- Payload URL — это адрес с нашим скриптом, который мы сделали на предыдущем шаге
- Secret — это тот секрет который мы записали в константу TOKEN
Сохраняем.
Настройка TimeWeb
Настройки таймвеб особо не трогал. Кроме того что пришлось добавить телефон, чтобы мне дали работать по SSH. И добавил там ~/.ssh/authorized_keys чтобы входить туда без пароля.
- Рядом с папкой public_html создал папку repo
- Через SSH зашел в папку repo и сделал туда git clone своего репо
cd repo/
git clone [email protected]:uptimizt/my-site.git
Из веб консоли это выглядит так:
Настраиваем Телеграм Бота
Далее захотелось чтобы при каждом автодеплое нового кода на веб сервер, мы получали какое либо сообщение в чат.
Написал простой скрипт на пхп, который это делает при каждом выполнении веб хука.
Создал бота в телеграм, через botfather его реквизиты вставил в скрипт.
<?php
namespace wpcraft;
// Telegram function which you can call
function telegram($msg) {
// Set your Bot ID and Chat ID.
$telegrambot='fdsfsdfsdf';
$telegramchatid='-34535345';
$url='https://api.telegram.org/bot'.$telegrambot.'/sendMessage';$data=array('chat_id'=>$telegramchatid,'text'=>$msg);
$options=array('http'=>array('method'=>'POST','header'=>"Content-Type:application/x-www-form-urlencoded\r\n",'content'=>http_build_query($data),),);
$context=stream_context_create($options);
$result=file_get_contents($url,false,$context);
return $result;
}
// Function call with your own text or variable
telegram ("Автодеплой на тест! https://wooms.wpcraft.ru/");
Чтобы получить id чата, пригласил туда бота @myidbot и он любезно сообщил его.
Все. Теперь, при каждом деплое получаем уведомление в чат телеграмм.
Настройка GIT сабмодулей (git submodule) с доступом по SSH
Это нужно не для всех. Но у нас сам код сайта и части плагинов находятся в приватных репо. Доступ к которым можно получить через SSH.
Часть команд в скрипте типа git submodule — связаны как раз с этим. Если сабмодулей нет, то их можно смело удалить.
Чтобы работа шла с приватными сабмодулями, надо сгенерировать ssh ключи на хостинге. И далее публичный ключ добавить в свои приватные репо или в настройках своего профиля.
У меня это сделано так:
Итоговый результат
- все настройки процесса лежат в 1 подпапочке сайта
- можно поменять что угодно и любые правила и схемы автоматического деплоя
- как только код попадает в мастер, выполняется вебхук, который запускает обновление кода на сервере
- после обновление репо, выполняется rsync кода в директорию сайта (обновляются только изменения)
- минимум ручных действий, максимум автоматизации
- решение гибкое и может дорабатываться по ходу дела