Новый инструмент - Deployer

В предыдущей статье мы рассмотрели простую синхронизацию локальных файлов с удаленным сервером через SSH и Rsync. Это несколько упрощает нам задачу по заливке сайта на хостинг. Но остаются проблемы. Необходимо вводить длинную строку со всеми путями и опциями. Малейшая ошибка может привести к некорректному поведению программы rsync. Мы можем залить файлы не в ту папку и поломать работу сайта. А что делать, если сайт не один? А если сайты расположены на разных хостингах?

Нам нужен инструмент, в который мы могли бы занести настройки каждого сайта и все часто используемые команды. На помощь приходит консольная программа Deployer. Установим её и проверим возможности.

Установка и настройка Deployer

Linux и Mac OS

В случае с Linux и Mac OS всё достаточно просто, процесс установки хорошо описан на сайте программы:

curl -LO https://deployer.org/deployer.phar
mv deployer.phar /usr/local/bin/dep
chmod +x /usr/local/bin/dep

После чего в консоли будет доступна команда dep.

Windows

В случае Windows Deployer быстрее и проще установить как глобальный пакет Composer командой:

composer global require deployer/deployer

После успешной установки команда dep будет доступна как в нашей стандартной консоли CMD, так и в Git Bash.

Настроим проект на работу с Deployer. Для этого из папки WordPress-проекта откроем консоль Git Bash и введём следующую команду:

dep init

При запросе типа проекта отвечаем Common. Команда создаст новый файл deployer.php, который является файлом конфигурации Deployer. Откроем его и настроим под наши задачи. Допустим мы хотим отправлять измененные файлы проекта на удаленный сервер, как в прошлом проекте.

Для начала заменим адрес хоста project.com на адрес нашего сервера из панели управления, указав также имя пользователя: ВАШЛОГИН@ВАШЕИМЯ_СЕРВЕРА в разделе Hosts. Также в случае использования Windows установим настройку git_tty в false. В разделе Project name заменим параметр application на наши данные: ВАШЕИМЯСЕРВЕРА или имя другого сайта на сервере.

Посмотрим на раздел Tasks. Основная команда в нём - deploy и она занимается полным циклом разворачивания проекта из репозитория. Отложим рассмотрение этой команды на следующую статью, а пока напишем свою задачу, например тест для просмотра текущей директории на удалённом сервере. Добавим следующий код в раздел Tasks:

/**
 * Test task
 */
task('test', function () {
    $result = run('pwd');
    writeln("Current dir: $result");
});

Команда run запускает указанную консольную команду на удаленном сервере, а её результат попадает в переменную $result. Запускаем задачу, просто введя её имя:

dep test

Увидим примерно следующее:

➤ Executing task test
Current dir: /home/w/w91136je
✔ Ok

Отлично! Теперь проверим версию PHP на сервере, видоизменив задачу:

/**
 * Test task
 */
task('test', function () {
    $result = run('php -v');
    writeln("Current PHP version: $result");
});

Выполнив команду, получим информацию о версии консольной PHP:

➤ Executing task test
Current PHP version: PHP 5.6.40 (cli) (built: Dec 19 2019 16:32:44)
Copyright (c) 1997-2016 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies
    with the ionCube PHP Loader + ionCube24 v10.3.9, Copyright (c) 2002-2019, by ionCube Ltd.
    with Zend Guard Loader v3.3, Copyright (c) 1998-2015, by Zend Technologies
✔ Ok

Теперь провернём кейс из предыдущей статьи - синхронизируем локальный проект с удаленным, написав новую задачу push:code:

/**
 * Push code from local folder to remote server
 */
task('push:code', function () {
    $project_path = runLocally('pwd');
    upload($project_path . '/', '{{deploy_path}}/public_html');
});

В этой задаче мы уже используем другую команду: runLocally, которая выполняет консольную команду на локальном компьютере. Запустим её:

dep push:code

Теперь попробуем залить базу данных локального проекта на хостинг. Для этого нам понадобится локально установленная программа WP-CLI. В случае с Windows установим ее как глобальный пакет Composer:

composer global require wp-cli/wp-cli-bundle

Проверим установку:

wp --version

Напишем нашу задачу:

/**
 * Push database task
 */
task('push:db', function () {
    runLocally('wp db export --add-drop-table current.sql');
    upload('current.sql', '{{deploy_path}}/public_html/current.sql');
    run('cd {{deploy_path}}/public_html && wp db import current.sql');
    run('cd {{deploy_path}}/public_html && wp search-replace "//'.get('domain_local').'" "//'.get('domain_remote').'"');
});

Здесь мы запускаем экспорт локальной базы данных, копируем дамп на удаленный сервер и импортируем её. После чего осуществляем подмену локального домена на удаленный. Но мы забыли внести параметры для замены: имя локального домена и имя удаленного домена. Добавим эти две опции перед разделом Hosts, заменив параметры нашими данными:

// Local and remote domain names
set('domain_local', 'example.test');
set('domain_remote', 'example.com');

Теперь запустим задачу:

dep push:db

Локальная база данных будет залита на удаленный сервер и импортирована.

Теперь объединим обе наши задачи в одну: dep push, добавив такой код:

desc('Push code and files from local to remote server');
task('push', [
    'push:code',
    'push:db',
]);

Прекрасно! Теперь всего одной командой в консоли мы можем отправлять сайт на удаленный сервер, включая код и базу данных!

Иногда возникает ситуация, когда необходимо получить на локальном сайте базу данных с удаленного сервера. Процесс будет протекать зеркально push:db, по аналогии с командами Git назовём задачу pull:db. Напишем такую задачу:

/**
 * Pull database task
 */
task('push:db', function () {
    run('cd {{deploy_path}}/public_html && wp db export --add-drop-table current.sql');
    download('{{deploy_path}}/public_html/current.sql', 'current.sql');
    runLocally('wp db import current.sql');
    run('wp search-replace "//'.get('domain_remote').'" "//'.get('domain_local').'"');
});

Полная версия файла конфига deployer.php.

P.S. Мы не учли очень важный момент. При каждом деплое вместе со всеми файлами на удаленный сервер улетает и файл конфига: wp-config.php. Эти файлы конечно же отличаются на локалке и на удаленном сервере и они не должны включаться в процесс деплоя. Выход достаточно простой - перенос файла wp-config.php директорией выше на локалке и на удаленном сервере. Теперь в процессе деплоя эти файлы не будут синхронизироваться.

В следующей статье мы пойдем еще дальше и автоматизируем описанные задачи.