Всегда деплоил проекты ручками по фтп, сейчас решил автоматизировать процедуру используя хуки (возможно многие подскажут, что это не лучший вариант и лучше капистрано и т.п, но не суть) и понял, что мне не нужны на продакшене папка с блоками и т.п. ведь на боях работает собранная версия.
Как я себе представляю деплой бем проекта:
- собираю билды в том числе склеиваю и фрижу статику
- выкладываю только необходимые файлы из билда, статику и nodejs файлы приложения
Написано бегло, но думаю понятно. К этой схеме хотелось бы добавить то, что хотелось бы выкладывать только измененные файлы, а не все.
Вот первый пришедший в голову довольно простой план деплоя, но он не подходит под ранее описанные требования:
- держать рабочую копию проекта на продакшене и хуками или просто руками пуллить данные, но в этом случаем на проде будет лежать лишние файлы с блоками, которые после сборке уже не нужны.
Подскажите как происходит деплой у вас, может я что-то не понимаю и лишний код на проде не так и плохо. На самом деле я знаю что деплой на гит хуках плохой вариант по ряду причин, но спрашиваю о другом.
На последок есть еще вариант в голове:
- собираем проект bem make, фризим статику в отдельную папку
- все что собрали(ничего лишнего) кладем в другой репозиторий, копия которого лежит на продакшен сервере и на стэджинге
- получаем изменения на стейджинге, прогоняем тесты и остальную лабуду проверяя стабильность
- получаем изменения на продакшене, после чего хук делает архив и копирует все во временную папку, чтобы не прерывать работу сайта. После того как все скопированно подменяем рабочую папку на скопированную. Причем рабочую временно не удаляем для реверта при проблемах после выкладки
Вообщем это то что крутится сейчас в голове, т.к никогда не автоматизировал деплой для меня это пока темный лес, хотелось бы услышать ваши примеры, замечания и советы
если говорить про деплой в Яндексе, то у нас используются deb-пакеты, что предоставляет версионирование и позволяет деплоиться сразу на кластер.
еще одним хорошим вариантом является деплой docker-пакетами.
под докер/деб пакеты нужно окружение
для начала можно использовать shell скрипты, либо capistrano.
рекомендую последний: рецепты пишутся очень просто, после деплоя в рецепт надо будет загнать запуск bem make, и всякие мелочи. в общем, настраивается просто, используется тоже. как рецепты будут готовы — cap deploy, profit. но требует руби
шел скрипты — ssh user@host -i ident_key_file 'cd /home/deploy/staging.site.name/ && git fetch && git checkout production' etc. В этом случае удобно делать алиасы в .ssh/config, чтобы можно было делать ssh host 'command'
если хочется чего-то более сложного — см. ответ tadatuta
1. собираем пакет, который в debian/rules запускает bem make + какие-то дополнительные действия, если необходимо. там же удаляем все source-файлы, которые не нужны в продакшене.
2. пакет пушится в наш внутренний репозиторий проектов
3. выкатываем пакет в тестинг, убеждаемся, что все хорошо. т.к. пакет — это целостная штука, то при установке на одинаковое окружение у нас есть гарантия, что все встанет полностью аналогично.
(4). если что-то пошло не так, можно в один клик откатиться на предыдущую версию.
при необходимости может быть полезно разделять проект на несколько пакетов и катать их отдельно. например, нет смысла перезапускать сервер при обновлении статики, поэтому статику дешевле выкатывать отдельно (и потенциально на отдельные сервера, специально сконфирурированные для отдачи статики).
Капистрано не хочу как раз из-за руби. Хочется все на ноде)
tar -cvzf project.version.tar.gz ./
scp project.version.tar.gz prodhost:~/blabla/
ssh prodhost 'cd ~/deploys && cp ~/blabla/project.version.tar.gz ./ && tar -xvzf ./project.version.tar.gz'
ну и т.д.
p.s. А npm install вы тоже не хотите делать?
Можешь скинуть конфиг капистрано который ты используешь с некими комментами к нему?
Это был пример без капистрано
На капистране как-то так. В Capfile
В config/deploy.rb:
Нужен gem railsless-deploy, может быть есть что-то более удобное.
Все, что в {params} — надо поставить своё.
Не тестировал
На самом деле он простой как 2 пальца. Он просто выносит за скобку все параметры, которые примерно стандартные, и сам делает версионирование, возможность выкатить/откатить, и т.д. Т.е. все mv, rm, git pull, etc. Вам остается только добавить запуск каких-то своих скриптов, типа миграций базы или сборки проекта. npm install тоже часто нужен. Но это выгружает проект на продакшн сервер и там собирает, а вы же хотите деб пакет. Хотя, можно же написать рецепт, который будет вам на finalize_update собирать деб пакет (ну или что там), и дергать еще какую-то ручку, которая запушит этот пакет в деб-репо и после обновит его на нужных хостах и перезапустит. Почему нет
Но я считаю, что деб пакеты удобно, когда у вас десятки похожих или одинаковых серверов, есть свой деб репозиторий, и когда вам надо выкатывать одно и то же на кучу серверов сразу (кластеризация или что-то такое) и т.д. С nodejs на 8-16 ядреном процессоре вы очень не скоро упираетесь в ресурсы и кластеризация нужна разве что для отказоустойчивости. Но это 2-3 площадки, можно и через несколько server их декларировать и выкатывать, не вижу смысла деб пакеты собирать. Кстати, докер мне нравится больше, чем деб пакеты. В нем намного больше смысла. Но опять же — нужно окружение. Нужно подготавливать площадки, чтобы это все работало. А это время.