Развертывание приложения Perl
Каковы лучшие практики для развертывания приложения Perl? Предположим, что вы развертываете на ванильной коробке с небольшой установкой модуля CPAN. Каковы идеальные сборки, методы развертывания? Модуль:: Сборка, ExtUtils::MakeMaker, другое? Я ищу идеи передового опыта от тех, кто неоднократно делал это для крупномасштабных приложений.
Приложение развертывается на сервере. Это не CPAN или сценарий. Это на самом деле веб-приложение PSGI. То есть тонна пакетов Perl.
В настоящее время у меня есть сценарий развертывания, который использует Net::SSH::Expect для SSH на новые серверы, устанавливаю некоторые инструменты и настраиваю сервер, а затем извлекаю нужную ветку приложения из системы контроля версий. Это кажется правильным, но это лучшая практика?
Следующим шагом является создание приложения. Каковы лучшие практики для отслеживания и управления зависимостями, установки этих зависимостей из CPAN и обеспечения готовности приложения к работе?
Спасибо
3 ответа
Компания, над которой я сейчас работаю, создает RPM для каждой зависимости CPAN и Internal приложения (довольно много пакетов!), Которое устанавливается в каталог system site_perl. Это имеет ряд проблем:
- Построение RPM занимает много времени, так как версии сталкиваются с CPAN.
- Привязка себя к системному Perl означает, что вы находитесь в зависимости от своего дистрибутива, чтобы создать или сломать свой Perl (в Centos 5 у нас максимальная версия Perl 5.8.8!).
- Если на одном хосте развернуто несколько приложений, наличие единой библиотеки perl для всех приложений означает, что обновление зависимостей может быть опасным без повторного тестирования каждого приложения хоста. Мы развернули довольно много отдельных дистрибутивов, все с разной степенью внимательности к обслуживанию, поэтому для нас это большое дело.
Мы отходим от создания RPM для каждой зависимости и вместо этого планируем использовать carton [1] для создания полностью автономной библиотеки perl для каждого приложения, которое мы развертываем. Мы встраиваем эти библиотеки в системные пакеты, но вы также можете легко их собрать и скопировать вручную, если не хотите иметь дело с менеджером пакетов.
Проблема с коробкой заключается в том, что вам нужно настроить внутреннее зеркало CPAN, в которое вы можете установить свои внутренние зависимости, если ваше приложение зависит от модулей, не входящих в CPAN. Если вы не хотите иметь с этим дело, вы всегда можете просто вручную установить нужные библиотеки в local::lib [2] или perlbrew [3] и упаковать полученные библиотеки для развертывания на ваших производственных блоках.
Со всеми предписанными решениями, будьте очень осторожны с XS perl libs. Вам нужно будет собрать ваши cartons/local:libs/perlbrews на той же архитектуре, что и хост, на который вы развертываете, и убедиться, что ваши производственные блоки имеют те же бинарные зависимости, что и те, которые вы использовали для сборки.
Чтобы ответить на обновление вашего вопроса о том, является ли наилучшей практикой исходная проверка и установка на ваш рабочий хост; Я лично не думаю, что это хорошая идея. Причины, по которым я считаю, что это рискованно, кроются в том, что трудно быть полностью уверенным в том, что набор устанавливаемых вами библиотек точно соответствует тем библиотекам, с которыми вы тестировали, поэтому развертывания могут быть непредсказуемыми. Эта проблема может усугубляться веб-приложениями, поскольку вы, скорее всего, будете иметь один и тот же код, развернутый на нескольких производственных блоках, которые также могут быть не синхронизированы. В то время как сообщество Perl делает замечательную работу, пытаясь выпустить качественный код с обратной совместимостью, когда что-то идет не так, как правило, довольно сложно разобраться. Вот почему коробка разрабатывается, так как она создает кеш всех дистрибутивов дистрибутива, которые вам нужно установить, замороженных в определенных версиях, чтобы вы могли предсказуемо развернуть свой код. Все это сказал, хотя; Если вы счастливы принять этот риск и исправить ситуацию, когда она сломается, локальная установка подойдет вам. Однако, как минимум, я настоятельно рекомендую установить на локальную:: lib, чтобы вы могли сделать резервную копию старой локальной lib перед установкой обновлений, чтобы у вас была точка отката, если что-то испортилось.
- [1] https://metacpan.org/module/Carton (будьте осторожны, он все еще находится в стадии разработки)
- [2] https://metacpan.org/module/local::lib
- [3] https://metacpan.org/module/perlbrew
Если у этого есть некоторые существенные зависимости CPAN, тогда вы могли бы хотеть написать небольшой скрипт, который использует CPAN::Shell
установить необходимые модули или отредактировать Makefile.PL
вашего приложения, чтобы он отражал необходимые зависимости в BUILD_REQUIRES
часть файла.
Вы можете взглянуть на sparrow - инструмент управления конфигурацией perl6, он поставляется с несколькими удобными плагинами, связанными с развертыванием perl5, такими как установка пакетов cpan или развертывание приложения psgi.
Обновление: эта ссылка https://dev.to/melezhik/deploying-perl5-application-by-sparrowdo-9mb может быть полезной.
Раскрытие - я автор инструмента.