Capistrano не устанавливает RAILS_ENV для упаковщика
В моем Gemfile я указываю, какую ветку использовать в репозитории git на основе RAILS_ENV. Однако, когда Capistrano развертывается, он запускает bundle install
команда - и так как он запускается через оболочку, правильная среда (постановка) не установлена. По умолчанию он разрабатывается и выдает ошибку, в которой говорится о несоответствии между Gemfile.lock и тем, что установлено.
Вы пытаетесь установить в режиме развертывания после изменения вашего Gemfile. Бежать
bundle install
в другом месте и добавьте обновленный Gemfile.lock в систему управления версиями.Вы добавили в Gemfile: * source: git@bitbucket.org:MyRepository/manager-engine.git (при разработке)
Вы удалили из Gemfile: * source: git@bitbucket.org:MyRepository/manager-engine.git (у мастера)
Вы изменились в менеджере Gemfile: * из
git@bitbucket.org:MyRepository/manager-engine.git (at develop)
вno specified source
Gemfile:
RAILS_ENV = ENV['RAILS_ENV'] || 'development'
gem 'manager', git: "git@bitbucket.org:MyRepository/manager-engine.git", branch: "#{ [:production, :staging].include?(RAILS_ENV.to_sym) ? :master : :develop }"
т. е. используйте ветвь "разработка", если среда рельсов отличается от "производства" или "постановки".
развернуть /staging.rb:
set :branch, :master
set :keep_releases, 2
set :stage, :staging
set :rails_env, 'staging'
set :bundle_without, [:development, :test]
set :deploy_to, '/home/useraccount/rails_deployments/staging.www'
server 'localhost', user: 'useraccount', roles: %w{web app db}
Итак, чтобы быть наиболее кратким:
В обычном терминале SSH, чтобы установить гем хранилища в правильной среде, я должен выдать RAILS_ENV=staging bundle install
, В противном случае просто работает bundle install
устанавливает репозиторий из разрабатываемой ветки. Так как Капистрано просто бежит bundle install
и не включает в себя RAILS_ENV
эта проблема происходит. Но разве Capistrano не устанавливает:rails_env, или это не настоящая системная переменная окружения?
1 ответ
Я думаю, если нет лучшего способа...
В итоге я использовал метод, проиллюстрированный где-то еще в SO, и изменил его для своих нужд.
Изменить Gemfile, чтобы он содержал:
# Read environment from A) Explicit set through command, B) Existence of override file's contents or C) Default to development
RAILS_ENV = ENV['RAILS_ENV'] || `cat .rails-env`.to_s.split.first || 'development'
Если .rails-env
не содержит ничего или не существует, по умолчанию это разработка. В противном случае оно принимает первое слово как окружение. Чтобы создать файл из командной строки, просто введите echo "your-environment-name-here" > .rails-env
при условии, что вы находитесь в корневом каталоге приложения.
Вы также можете создать файл при каждом развертывании с помощью capistrano, используя приведенную выше команду, или просто создать символическую ссылку на файл и поделиться им между развертываниями:
Deploy.rb:
set :linked_files, %w{ .rails-env }
Так что теперь окружение может быть принудительно настроено через файл в корне вашего приложения, который называется.rails-env. Явные вызовы RAILS_ENV, такие как RAILS_ENV=test bundle exec ...
все равно будет работать как рекламируется.