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 ... все равно будет работать как рекламируется.

Другие вопросы по тегам