Уже очень давно у нас стоял вопрос: как же просто и быстро деплоить front-end проекта?
Мы думали насчет такого инструмента, как Jenkins. Многие, кто настраивал его, знают: настройка занимает немало времени и, что еще важно — затрачивается много ресурсов системы. Поднять его на сервере значит выделить полтора гигабайта памяти. Такое себе удовольствие, когда у тебя 500 мегабайт на всё, например.
Альтернативный вариант — Mina. Это отличное решение, и мы используем его в Ruby проектах. Но как быть, если у тебя только front-end? Ставить Ruby и делать Bundle? Нет, это слишком сложно. Mina, конечно, имеет большой функционал, но мы хотим это делать на NodeJS без лишних телодвижений.
В итоге мы писали Bash скрипты, но это нас утомило. И нам в голову пришла идея написать свой небольшой сервис для деплоя front-end приложений, который будет:
И мы сделали Runy — удобный и практичный инструмент для деплоя front-end.
Все что нужно для его настройки и первого деплоя после установки пакета — это три команды:
init — создать конфиг и внести свои данные в него
setup — создать структуру проекта
deploy — задеплоить ваш проект
И это все!
Данный модуль упростил нам жизнь! Теперь деплой проходит одной командой. Быстро и просто. Когда к нам приходят новые разработчики, можно дать им доступы к dev/stage серверу, чтобы ребята могли сами деплоить. Junior разработчикам тоже будет полезно, для использования не нужен порог вхождения, а в дальнейшем они могут разобраться в модуле и приобрести новые знания.
Немного о технической части (более подробный мануал есть на github). На данный момент, Runy имеет следующие команды: init, setup, deploy, unlock, rollback.
Создает конфиг файл в месте вызова команды. Вам следуют внести в него свои данные. Как видно, мы используем подключение по ssh-agent, так что никакие пароли в конфиге находиться не будут.
По указанному пути в конфиге, создает папку releases (в ней хранятся релизы по номерам 1, 2, 3 и тд.) и файл .current.release (в нем хранится номер текущего релиза).
Данная команда имеет некую защиту, в одно и тоже время только один человек может производить деплой.
Команда делает следующие действия. Создает временную папку, устанавливает проект, выполняет список ваших команд из конфиг файла (commands) для подтягивания зависимостей и сборки приложения, создает новую релиз папку, переносит туда только что собранный проект, проверяет количество релизов и удаляет старые (сейчас хранится 3 релиза), создает символическую ссылку на текущий релиз (текущий релиз всегда будет доступен по данному пути your-remote-path/current), обновляет файл с цифрой релиза, чистит папки.
Удаляет защитный файл, который создается при исполнении команды deploy. Вообще файл удаляется автоматически и даже при обработке ошибок, но на все случае жизни существует данная команда.
Возвращает обратно символическую ссылку на предыдущий релиз и удаляет текущий.
P.S. У нас еще есть идеи по развитию этого инструмента, вы также можете поучаствовать в развитии проекта, создавая/делая задачи здесь.
Пусть deployment каждого разработчика станет удобнее и быстрее.
Мы думали насчет такого инструмента, как Jenkins. Многие, кто настраивал его, знают: настройка занимает немало времени и, что еще важно — затрачивается много ресурсов системы. Поднять его на сервере значит выделить полтора гигабайта памяти. Такое себе удовольствие, когда у тебя 500 мегабайт на всё, например.
Альтернативный вариант — Mina. Это отличное решение, и мы используем его в Ruby проектах. Но как быть, если у тебя только front-end? Ставить Ruby и делать Bundle? Нет, это слишком сложно. Mina, конечно, имеет большой функционал, но мы хотим это делать на NodeJS без лишних телодвижений.
В итоге мы писали Bash скрипты, но это нас утомило. И нам в голову пришла идея написать свой небольшой сервис для деплоя front-end приложений, который будет:
- npm пакетом
- иметь небольшой и простенький конфиг
- занимать 10 минут для его настройки и 5 минут для деплоя
- иметь систему релизов (если всё-таки что-то пойдет не так и кто-то скажет — «оно само
И мы сделали Runy — удобный и практичный инструмент для деплоя front-end.
Все что нужно для его настройки и первого деплоя после установки пакета — это три команды:
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. У нас еще есть идеи по развитию этого инструмента, вы также можете поучаствовать в развитии проекта, создавая/делая задачи здесь.
Пусть deployment каждого разработчика станет удобнее и быстрее.
Комментарии (6)
WitcherGeralt
09.06.2018 09:59Очень годно, люблю минималистичные универсальные решения. Первый инструмент для деплоя, который мне захотелось использовать (предпочитаю пакеты и пакетные менеджеры). А ненавистники велосипедов не замечают очевидного преимущества вашего решения: крошечный плоский конфиг и порог вхождения — 30 секунд на его прочтение.
webdevium
Чем shipit не заслужил доверия и пришлось писать свой?
AngusMetall
Видимо у остального фатальный недостаток. p.s. ещё на вскидку ansible, octopus deploy, тысячи их.
JustDont
Всяких деплой-инструментов сейчас действительно столько, что даже подыскать в каждом свой фатальный недостаток (который скорее всего найдется) — это будет длинный квест.
Подозреваю, что автору просто очень хотелось собственный максимально небольшой велосипед (если он и вправду небольшой). Иногда от этого вполне себе есть некоторая польза.
staticlab
Небольшой велосипед, который ребята писали вдвоём с середины апреля. Кажется, за это время можно было разобраться в любом из перечисленных инструментов, а не тратить рабочее время на создание велосипеда.