问题
I've just updated my Rails app to 5.2, and configured it to use the new config/credentials.yml.enc
file.
When I try to deploy, I get this error:
NameError: uninitialized constant Rails
/Users/me/Documents/project/config/deploy.rb:27:in `<top (required)>'
That's pointing to this line in my config/deploy.rb
file:
set :rollbar_token, Rails.application.credentials[:rollbar_token]
So it appears that while capistrano is running, it doesn't have access to Rails.application.credentials
.
How are you all handling this? I've got some ideas...
- Set this one variable as an
ENV
variable- I don't love how this separates/customizes this one setting
- Somehow make it so capistrano has access to
Rails.application.credentials
- I don't know if this is a good idea or if there are other things I need to be aware of if I go this route
- Remove deploy tracking in rollbar
- 🤷♂️
回答1:
1. Upload master.key
the file on the server (user read-only) like so:
namespace :setup do
desc "setup: copy config/master.key to shared/config"
task :copy_linked_master_key do
on roles(fetch(:setup_roles)) do
sudo :mkdir, "-pv", shared_path
upload! "config/master.key", "#{shared_path}/config/master.key"
sudo :chmod, "600", "#{shared_path}/config/master.key"
end
end
before "deploy:symlink:linked_files", "setup:copy_linked_master_key"
end
Put it in your lib/capistrano/tasks/setup.rake
2. Ensure file is linked
In deploy.rb
:
set :linked_files, fetch(:linked_files, []).push("config/master.key")
3. Ensure Capfile loads the task:
Make sure your Capfile
has the line
# Load custom tasks from `lib/capistrano/tasks` if you have any defined
Dir.glob("lib/capistrano/tasks/*.rake").each { |r| import r }
回答2:
I solved the problem as follows:
set :rollbar_token, YAML.load(`rails credentials:show`)['rollbar_token']
回答3:
require File.expand_path("./environment", __dir__)
puts App::Application.credentials.rollbar_token
回答4:
Put the following line(s) on top of your config/deploy.rb
# config/deploy.rb
require File.expand_path("./environment", __dir__)
This include make constants like Rails.application
accessible in files like config/deploy/production.rb
. Now things like the following are possible:
# config/deploy/staging.rb
server "production.lan", user: "production", roles: %w{app db web}
set :stage, :production
set :branch, "development"
set :pg_password, Rails.application.credentials[:staging][:postgres][:password]
回答5:
The way I solve this is to declare a $ROLLBAR_ACCESS_TOKEN
environment variable on the server. I place it at the top of ~deployer/.bashrc
like this:
export ROLLBAR_ACCESS_TOKEN=...
Then I integrate with Capistrano by defining this task:
task :set_rollbar_token do
on release_roles(:all).first do
set :rollbar_token, capture("echo $ROLLBAR_ACCESS_TOKEN").chomp
end
end
before "rollbar:deploy", "set_rollbar_token"
来源:https://stackoverflow.com/questions/51010565/how-can-i-use-rails-5-2-credentials-in-capistranos-deploy-rb-file