Статьи

Как выполнить развертывание с помощью Deployer

Автоматизированный рабочий процесс для развертывания является отличным инструментом, который должен иметь каждый коллектив разработчиков программного обеспечения. Процесс выпуска, когда он быстрый, безопасный и отказоустойчивый, может сэкономить время на разработку более замечательных вещей. И хорошая новость в том, что существует множество отличных инструментов для создания автоматического цикла выпуска.

В этой статье я собираюсь представить вам инструмент развертывания, который называется Deployer. Мне нравится использовать его, потому что он написан на PHP, прост в настройке и имеет много удобных функций для интеграции процесса развертывания в рабочий процесс вашей команды.

Прежде всего, давайте посмотрим структуру процесса развертывания с Deployer. Он состоит из трех основных частей: сервера развертывания для инициации развертывания, рабочего или промежуточного сервера для размещения вашего приложения и репозитория git для хранения кода вашего приложения.

Когда вы запускаете процесс развертывания, вы запускаете сценарий развертывания на сервере развертывания. После этого сервер развертывания подключается к производственному серверу с помощью SSH и выполняет операции обслуживания с рабочего сервера, такие как клонирование кода из репозитория git, обновление зависимостей Composer и другие вещи, необходимые для успешного выпуска.

Процесс развертывания Deployer

Чтобы всем доверяли в этой цепочке, мы создадим и установим сертификаты SSH на серверы и в хранилище.

Нам нужно создать ключ аутентификации SSH на рабочем сервере и отправить его в репозиторий git. Если на вашем сервере развертывания нет ключей аутентификации SSH, запустите ssh-keygen и следуйте инструкциям. Keygen создаст открытый ключ в файле ~/.ssh/id_rsa.pub .

Теперь вы можете установить его на учетную запись вашего хранилища. Если вы не знаете, как это сделать, посмотрите на пример GitHub из соответствующих ссылок в нижней части статьи или обратитесь за помощью к вашему хостинговому сервису.

Кроме того, лучше создать ключ SSH на сервере развертывания, чтобы получить доверие на рабочем компьютере. Используйте эти команды, чтобы установить без пароля пароль SSH между сервером развертывания и производственным сервером.

1
2
vagrant@localserver:~$ ssh-keygen
vagrant@localserver:~$ ssh-copy-id -i ~/.ssh/id_rsa.pub www-data@my_project.com

После установки всех сертификатов мы готовы к установке Deployer.

Установка Deployer так же проста, как и установка Composer. Вам нужно скачать PHP Archive и сделать его глобальной командой:

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

Давайте проверим версию Deployer, чтобы увидеть, все ли установлено правильно:

1
2
vagrant@localserver:~$ dep —version
Deployer 6.0.3

Все выглядит отлично, и мы готовы создать наш первый сценарий развертывания.

Чтобы инициализировать Deployer для вашего проекта, запустите dep init . Это запустит утилиту для генерации сценария развертывания, который запросит у вас тип проекта и ссылку на репозиторий и создаст файл deploy.php в текущем каталоге. Давайте посмотрим на этот файл и основные функции, которые используются в рецепте.

Функции set и get работу со значениями конфигурации, а ярлык получателя можно использовать с командой run :

1
2
set(‘current_path’, ‘~/my_application’);
run(‘rm {{current_path}}/runtime/*’);

Каждое значение конфигурации может быть переопределено для каждого хоста. Мы можем настроить путь развертывания и пользователя SSH для нашего приложения в нашем сценарии развертывания:

1
2
3
host(‘my_project.com’)
   ->user(‘www-data’)
   ->set(‘deploy_path’, ‘~/{{application}}’);

Чтобы определить свои собственные задачи, используйте функцию task и run для запуска команды на производственном сервере:

1
2
3
4
task(‘disk_free’, function() {
    $df = run(‘df -h /’);
    writeln($df);
});

А затем запустите его с помощью dep и имени функции в качестве параметра:

1
2
3
4
5
vagrant@localserver:/vagrant/deployer$ dep disk_free
➤ Executing task disk_free
Filesystem Size Used Avail Use% Mounted on
/dev/md0 7.4G 4.7G 2.4G 67% /
✔ Ok

Теперь вы можете просмотреть файл развертывания и изменить все необходимые параметры в конфигурации вашего приложения.

Мы уже установили Deployer, установили SSL-сертификаты на серверы развертывания и производства и создали сценарий развертывания, так что, наконец, пришло время собрать все вместе и сделать первое развертывание в производство.

Чтобы развернуть ваше приложение, просто вызовите dep deploy :

Развертывание в производство

Если что-то пошло не так, вы можете вернуться к ранее развернутой версии всего за один шаг:

1
2
vagrant@localserver:~$ dep rollback
✔ Executing task rollback

Выглядит просто, не так ли?

Теперь давайте проверим, что было создано на нашем производственном сервере. Благодаря Deployer мы можем сделать это легко с помощью команд быстрого доступа. Попробуйте dep ssh подключиться к серверу напрямую, используя конфигурацию из сценария развертывания, или удаленно выполнить команду через туннель SSH с помощью dep run . Также эта команда поддерживает переменные, которые мы установили в скрипте.

Итак, давайте посмотрим на путь развертывания:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
vagrant@localserver:~$ dep run «tree {{deploy_path}}»
.
├── current -> /home/user/my_project/releases/3
├── releases
│  ├── 1
│  │  ├── composer.json
│  │  ├── config.php -> /home/user/my_project/shared/config.php
│  │  ├── README.md
│  │  ├── runtime -> /home/user/data/my_project/shared/runtime
│  │  ├── vendor
│  │  └── …
│  │  └── web
│  │  └── index.php
│  ├── 2
│  │  …
│  └── 3
│  …
└── shared
    ├── config.php
    └── runtime

Главное — это каталог releases , где Deployer хранит последние версии нашего приложения. После каждого успешного развертывания или отката он связывает current с включенным выпуском. Наконец, у нас есть shared каталог, в котором хранятся файлы и папки из файлов shared_dirs и shared_files которые мы установили в файле сценария.

При первом развертывании Deployer скопирует эти файлы в общий каталог и создаст ссылку из releases на shared каталог. В следующий раз он просто добавит ссылку из файлов релиза на файлы и папки в общем каталоге. Кроме того, вы можете изменить любой файл в общем каталоге, и Deployer будет сохранять его без изменений при каждом развертывании — например, это полезно для файлов конфигурации.

Кроме того, если у вас есть файл composer.json в корне вашего хранилища, Deployer вызовет Composer для создания каталога поставщика и обновления всех необходимых зависимостей. Если вы не храните файл Composer в корневом каталоге, вы можете создать пользовательское задание для его обновления.

И теперь пришло время интегрировать развертывание приложения в наши процессы.

Каждая группа имеет свои собственные конфигурации развертывания и процессы для автоматизации, поэтому у Deployer есть простые инструменты для расширения стандартной конфигурации и добавления пользовательских задач. Например, на вашем хостинге может быть правило хранить приложения и webroot в разных местах, без прав на изменение конфигурации Apache или Nginx.

Но есть способ преодолеть это правило — использовать символические ссылки. Поэтому мы добавим задачу для этого:

1
2
3
task(‘deploy:public_html’, function() {
    run(‘ln -sf {{deploy_path}}/current/web /var/www/my_application.com’);
});

А затем добавьте его в основную задачу развертывания в рамках цикла выпуска:

1
2
3
4
5
task(‘deploy’, [
    // …
    ‘deploy:public_html’,
    // …
]);

Теперь снова запустите сценарий развертывания и проверьте, все ли правильно с dep ssh .

У Deployer есть много рецептов для интеграции с третьими лицами, которые могут расширить базовую функциональность. Мы можем использовать Composer для их установки:

1
composer require deployer/recipes —dev

Мне нравится использовать рецепт уведомлений Slack. Чтобы включить его, нужно перейти на страницу рецепта Slack , нажать кнопку « Добавить в Slack» и выбрать канал для отправки уведомлений. Затем мы получим Slack webhook и добавим этот код в развертывание.

1
2
3
4
5
6
7
8
// require slack recipe
require ‘recipe/slack.php’;
 
// set slack webhook
set(‘slack_webhook’, /* your slack webhook*/);
 
// notify slack after successful deploy
after(‘success’, ‘slack:notify:success’);

После этих изменений Deployer отправит следующее сообщение на канал развертывания:

Просмотр Deployer в Slack

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

В этом руководстве мы установили Deployer и создали сценарий развертывания, который можно использовать для развертывания нашего приложения из репозитория git на производственном или промежуточном сервере всего одним щелчком мыши.

Кроме того, он может быть интегрирован в командные процессы — например, приложение может быть развернуто автоматически после изменений в основной ветке, и на канале Slack можно сделать уведомление об успешном развертывании.

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