Очень долгое время у нас была проблема: как быстро задеплоить фронтенд приложение?
Мы рассматривали возможность использования такого инструмента, как Jenkins. Но у него есть проблемы, многие, кто настраивал его, знают: настройка этого инструмента занимает немало времени и, что еще важно — затрачивается много ресурсов системы. Поднять его на сервере значит выделить минимум полтора гигабайта памяти. Такое себе удовольствие, когда у тебя например всего 500 мегабайт.
Альтернативный вариант — Mina. Это отличное решение, и мы используем его в ruby проектах. Но как быть, если у тебя только frontend? Ставить Ruby и делать бандлы? Нет, это слишком сложно. Mina, конечно, имеет большой функционал, но мы хотим это делать на NodeJS без лишних телодвижений.
В итоге мы писали Bash скрипты, но это нас утомило. И нам в голову пришла идея написать свой небольшой сервис для деплоя frontend приложений, который будет:
- npm пакетом
- иметь небольшой и простенький конфиг
- занимать 10 минут для его настройки и 5 минут для деплоя
- иметь систему релизов (если всё-таки что-то пойдет не так и кто-то скажет — «оно само сломалось», то смело и быстро можно вернуться на предыдущий релиз)
И мы сделали Runy — удобный и практичный инструмент для деплоя.
Все что нужно для его настройки и первого использования после установки пакета — это три команды:
init — создает конфиг и после этого вы вносите в него свои данные
setup — создать структуру проекта
deploy — ну и соответственно сам деплой
И это все, реально просто!
Данный модуль упростил нам жизнь и избавил от лишних головняков! Теперь деплой проходит одной командой. Быстро и просто. Когда к нам приходят новые разработчики, можно дать им доступы к dev/stage серверу, чтобы ребята могли сами деплоить. Junior разработчикам тоже будет полезно, для использования не нужен высокий порог вхождения, а в дальнейшем они могут разобраться в модуле и приобрести новые знания.
Немного о технической части (более подробный мануал есть на github). На данный момент, Runy имеет следующие команды: init, setup, deploy, unlock, rollback.
Init
Создает конфиг файл в директории вызова команды. Вам нужно будет ввести в него свои данные. Как видно, мы используем подключение по ssh-agent, так что никакие пароли в конфиге находиться не будут.
// runy.js
module.exports = {
host: '0.0.0.0', // адрес сервера
username: 'username', // имя пользователя для входа на сервер
port: 22, // порт сервера
remotePath: '/your/project/path', // путь структуры релизов и проекта
git: 'link-to-your-git-repository', // ссылка (лучше ssh) на ваш репозиторий
agent: process.env.SSH_AUTH_SOCK, // ключ авторизации
commands: [ // список команд для развертывания проекта
'npm install',
'npm run build',
],
};
Setup
По указанному пути в конфиге, создает папку releases (в ней хранятся релизы по номерам 1, 2, 3 и тд.) и файл .current.release (в нем хранится номер текущего релиза).
Deploy
Данная команда имеет некую защиту, в одно и тоже время только один человек может производить деплой.
Команда делает следующие действия. Создает временную папку, устанавливает проект, выполняет список ваших команд из конфиг файла (commands) для подтягивания зависимостей и сборки приложения, создает новую релиз папку, переносит туда только что собранный проект, проверяет количество релизов и удаляет старые (сейчас хранится 3 релиза), создает символическую ссылку на текущий релиз (текущий релиз всегда будет доступен по данному пути your-remote-path/current), обновляет файл с номером релиза, чистит папки.
Unlock
Удаляет защитный файл, который создается при исполнении команды deploy. Вообще файл и так удаляется автоматически, и даже при обработке ошибок, но на все случае жизни существует данная команда.
Rollback
Возвращает обратно символическую ссылку на предыдущий релиз и удаляет текущий.
P.S. У нас есть еще идеи по развитию этого инструмента. Вы также можете поучаствовать в развитии проекта, создавая/делая задачи здесь.
Всем удачи и пусть ваш деплой будет удобнее и быстрее.