можно ли использовать bundler в развертываниях rsync? - PullRequest
2 голосов
/ 15 ноября 2011

Можете ли вы развернуть приложение Rails3, используя Gemfile от Bundler БЕЗ bundle install ... т.е. просто скопировав каталог проекта rails в соответствующий каталог в Apache / Passenger?

ИтакУ нас есть устаревшая среда, которая была разработана для внутренних проектов в течение периода Ruby1.8.6 / Rails2, и это зависит от копирования вашего локального каталога rails в сетевое монтирование в Apache / Passenger.Хотя эта модель развертывания отлично работала для Rails2 (с замороженными гемами и т. Д.), Она ломается многими болезненными способами для Rails3 с Bundler.

В частности, я вижу ошибки зависимости от гемов для гемов в: test и:группы разработчиков даже при развертывании в: производство.Сначала мне показалось полезным следующее сообщение SO:

Поэтому я выполнил bundle install --without test development на своем локальном компьютере, а затем попытался вручную скопировать .bundle / config из моего каталога в сетевой каталог, но это не сработало.Bundler все еще пытался загрузить исключенные драгоценные камни.

Это болезненно для нас, потому что у нас нет прав администратора для установки драгоценных камней на эти серверы (то есть нам никогда не разрешается запускать bundle install в любой форме.).Аналогичным образом, администраторы не хотят беспокоиться о развертывании наших приложений каждые 5 минут, поскольку это внутренний сайт прототипирования, а не внешний рабочий сайт.Они также не хотят запускать bundle install, потому что им нужен жесткий контроль над тем, какие гемы развернуты во всех приложениях - например, некоторые приложения все еще основаны на Rails2 и еще не используют Bundler, поэтому они могут сломаться, если неправильноgem установлен.

Есть ли способ использовать Bundler в пассивном / rsync-режиме, или мы должны просто изменить дизайн нашей среды, чтобы позволить разработчикам запускать bundle install через capistrano или что-то подобное?

Помогите?

Спасибо!


ОБНОВЛЕНИЕ: 18.01.2012: После выяснения причины: test и: группа ошибок разработки еще немного, я обнаружил , что Phusion Passenger действительно выполняет Bundle.setup() до того, как приложение Rails получит шанс в boot.rb.Без каких-либо аргументов setup() проверяет все зависимости гемов, что означает, что если он не найдет гем на сервере, он взорвется в Passenger, прежде чем он даже получит шанс загрузить Rails.

Это«Ошибка» может произойти, только если вы развернете через rsync или скопируете вместо запуска bundle install --without test:development на целевом сервере.Большинство приложений Rails3 развернуто с Capistrano, который делает этот шаг для вас, и поэтому никогда не сталкивается с этим конкретным крайним случаем.

Так что я боюсь, что единственный способ заставить «группы» работать правильно вваш файл gem должен использовать bundle install как положено.Это означает, что мы должны изменить наш процесс развертывания!

Ответы [ 3 ]

2 голосов
/ 20 ноября 2011

Не прямой ответ на ваш вопрос, но вам не нужны права администратора для установки гемов - ndash; Вы можете установить их локально в папку вашего приложения:

bundle install --path vendor/bundle

Это также изолировало бы окружение этого приложения от других в отношении драгоценных камней (то есть "системные" драгоценные камни остаются в покое).

Только не забудьте предвосхищать каждый вызов драгоценного камня с помощью bundle exec.

Возможно, вы захотите взглянуть на rvm и gemsets

1 голос
/ 18 января 2012

Некоторые другие разработчики rails и я обсуждали, как эффективно заморозить гемы в Rails 3, и мы разработали это решение. Это похоже на то, что предложил @asymmetric, но отличается в некоторых ключевых аспектах. Как я позже обнаружил на справочной странице gemfile, этот подход также страдает тем же ограничением, о котором @indirect предупреждал с помощью bundle install --deployment, в том смысле, что ваши гемы должны быть либо чистыми ruby ​​(без встроенной компиляции), либо эти шаги должны быть выполнены на идентичная архитектура для ваших серверов stage и prod.

Хорошо, теперь, когда у нас есть предварительные сведения, давайте посмотрим, как «заморозить» некоторые драгоценные камни в Rails 3 ...

Сначала начните с чистой окружающей среды:

$ rvm gemset use fresh
$ rvm gemset empty fresh
$ gem install rails
$ rails new strawman
$ cd strawman/

Затем установите камень, который вы хотите использовать:

$ gem install condi

Затем создайте каталог vendor/gems и распакуйте в него гем:

$ mkdir vendor/gems
$ cd vendor/gems
$ gem unpack condi
Unpacked gem: '/tmp/strawman/vendor/gems/condi-0.0.6'

ДОПОЛНИТЕЛЬНО :

Если ваш гем не имеет файла .gemspec с ним (то есть спецификация является частью встроенной сборки Rakefile), Bundler может быть не в состоянии загрузить его правильно с помощью оператора: path. В этом случае вы должны вывести gemspec из файла gem, используя:

$ gem specification /tmp/condi-0.0.6.gem > condi-0.0.6/condi.gemspec

Или, если у вас уже установлен самоцвет, вы можете:

$ gem specification condi -v=0.0.6 > condi-0.0.6/condi.gemspec

Теперь обновите Gemfile с помощью строки:

gem 'condi', '0.0.6', :path => 'vendor/gems/condi-0.0.6'

ПРИМЕЧАНИЕ : «В отличие от git, bundler не компилирует расширения C для самоцветов, указанных в качестве путей». [man gemfile] Так что только работает для чистых рубиновых самоцветов без собственных расширений! Будьте предупреждены!

Далее удалите драгоценный камень из вашего набора:

$ gem uninstall condi
Successfully uninstalled condi-0.0.6

И, возвращаясь в корневую среду rails, попробуйте запустить консоль rails:

$ cd ../..
$ rails c
Loading development environment (Rails 3.1.3)
1.9.3-p0 :001 > 

Успех !! Ваш чистый рубиновый камень теперь эффективно заморожен в приложении Rails 3.

1 голос
/ 07 декабря 2011

Да, вы можете.Вы должны найти машину с той же комбинацией ОС / архитектуры, что и у ваших производственных серверов, а затем запустить на ней bundle install --deployment.Как только вы это сделаете, вы можете скопировать весь каталог приложения (включая ./vendor/bundle, который содержит все установленные гемы).Поскольку все гемы уже установлены и скомпилированы, ваше приложение просто загрузится.

Тем не менее, это официально не поддерживается.Если у вас есть проблемы с этим подходом, а команда Bundler постарается вам помочь, нет никаких гарантий, что он сработает (или продолжит работать в будущем).Здесь будут драконы и т. Д. И т. Д.

...