Автодеплой сайта WordPress (PHP), с использованием git-deploy, GitHub и TimeWeb

Автодеплой сайта WordPress (PHP), с использованием git-deploy, GitHub и TimeWeb

Рассмотрим настройку автодеплоя кода с использованием контроля версий на примере 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", "git@github.com: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, добавляем вебхук.

Пример конфигурации:

пример конфигурации вебхука gihub

Тут важны 2 параметра:

  • Payload URL — это адрес с нашим скриптом, который мы сделали на предыдущем шаге
  • Secret — это тот секрет который мы записали в константу TOKEN

Сохраняем.

Настройка TimeWeb

Настройки таймвеб особо не трогал. Кроме того что пришлось добавить телефон, чтобы мне дали работать по SSH. И добавил там ~/.ssh/authorized_keys чтобы входить туда без пароля.

  1. Рядом с папкой public_html создал папку repo
  2. Через SSH зашел в папку repo и сделал туда git clone своего репо
cd repo/
git clone git@github.com: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 кода в директорию сайта (обновляются только изменения)
  • минимум ручных действий, максимум автоматизации
  • решение гибкое и может дорабатываться по ходу дела
оцените контент и участвуйте в выборе трендов

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