Беглый деплой или как развернуть front-end за 15 минут

Уже очень давно у нас стоял вопрос: как же просто и быстро деплоить front-end проекта?

Мы думали насчет такого инструмента, как 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 каждого разработчика станет удобнее и быстрее.
AdBlock has stolen the banner, but banners are not teeth — they will be back

More
Ads

Comments 8

    0
    Чем shipit не заслужил доверия и пришлось писать свой?
      +1
      Видимо у остального фатальный недостаток. p.s. ещё на вскидку ansible, octopus deploy, тысячи их.
        0
        Всяких деплой-инструментов сейчас действительно столько, что даже подыскать в каждом свой фатальный недостаток (который скорее всего найдется) — это будет длинный квест.
        Подозреваю, что автору просто очень хотелось собственный максимально небольшой велосипед (если он и вправду небольшой). Иногда от этого вполне себе есть некоторая польза.
          0

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

            0
            По-моему, Вы просто не знаете значение выражения фатальный недостаток, но, собственно, повторили мысль, которую озвучил AngusMetall
        0

        Я так понимаю, pm2 deploy вы не осилили?

        • UFO just landed and posted this here
            0
            А чем данное решение принципиально отличается от того же PM2 Deploy Manager?

            Only users with full accounts can post comments. Log in, please.