Автоматизированный рабочий процесс для развертывания является отличным инструментом, который должен иметь каждый коллектив разработчиков программного обеспечения. Процесс выпуска, когда он быстрый, безопасный и отказоустойчивый, может сэкономить время на разработку более замечательных вещей. И хорошая новость в том, что существует множество отличных инструментов для создания автоматического цикла выпуска.
В этой статье я собираюсь представить вам инструмент развертывания, который называется Deployer. Мне нравится использовать его, потому что он написан на PHP, прост в настройке и имеет много удобных функций для интеграции процесса развертывания в рабочий процесс вашей команды.
Процесс развертывания с помощью Deployer
Прежде всего, давайте посмотрим структуру процесса развертывания с Deployer. Он состоит из трех основных частей: сервера развертывания для инициации развертывания, рабочего или промежуточного сервера для размещения вашего приложения и репозитория git для хранения кода вашего приложения.
Когда вы запускаете процесс развертывания, вы запускаете сценарий развертывания на сервере развертывания. После этого сервер развертывания подключается к производственному серверу с помощью SSH и выполняет операции обслуживания с рабочего сервера, такие как клонирование кода из репозитория git, обновление зависимостей Composer и другие вещи, необходимые для успешного выпуска.
Чтобы всем доверяли в этой цепочке, мы создадим и установим сертификаты SSH на серверы и в хранилище.
Установить сертификаты 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
Установка 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 и создали сценарий развертывания, который можно использовать для развертывания нашего приложения из репозитория git на производственном или промежуточном сервере всего одним щелчком мыши.
Кроме того, он может быть интегрирован в командные процессы — например, приложение может быть развернуто автоматически после изменений в основной ветке, и на канале Slack можно сделать уведомление об успешном развертывании.
Если у вас есть какие-либо вопросы, не стесняйтесь задавать вопросы в комментариях к статье.