[英]How can I use Rails 5.2 credentials in capistrano's deploy.rb file?
我刚刚将我的 Rails 应用程序更新到 5.2,并将其配置为使用新的config/credentials.yml.enc
文件。
当我尝试部署时,我收到此错误:
NameError: uninitialized constant Rails
/Users/me/Documents/project/config/deploy.rb:27:in `<top (required)>'
这指向我的config/deploy.rb
文件中的这一行:
set :rollbar_token, Rails.application.credentials[:rollbar_token]
因此,当 capistrano 运行时,它似乎无法访问Rails.application.credentials
。
你们都怎么处理这件事? 我有一些想法...
ENV
变量
Rails.application.credentials
config/deploy.rb
的顶部# config/deploy.rb
require File.expand_path("./environment", __dir__)
这包括让像Rails.application
这样的常量可以在config/deploy/production.rb
等文件中访问。 现在可能会出现以下情况:
# 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]
master.key
文件到服务器(用户只读),如下: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
把它放在你的lib/capistrano/tasks/setup.rake
在deploy.rb
:
set :linked_files, fetch(:linked_files, []).push("config/master.key")
确保您的Capfile
有该行
# Load custom tasks from `lib/capistrano/tasks` if you have any defined
Dir.glob("lib/capistrano/tasks/*.rake").each { |r| import r }
我解决了如下问题:
set :rollbar_token, YAML.load(`rails credentials:show`)['rollbar_token']
require File.expand_path("./environment", __dir__)
puts App::Application.credentials.rollbar_token
我解决这个问题的方法是在服务器上声明一个$ROLLBAR_ACCESS_TOKEN
环境变量。 我把它放在~deployer/.bashrc
的顶部,如下所示:
export ROLLBAR_ACCESS_TOKEN=...
然后我通过定义这个任务与 Capistrano 集成:
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"
在我看来,在这里加载整个 Rails 或必须读取命令行输出似乎并不理想,所以这里有一个替代解决方案:
require "active_support/encrypted_configuration"
require "active_support/core_ext/hash/keys"
module CredentialLoader
def read_credentials(environment:)
YAML.load(
ActiveSupport::EncryptedConfiguration.new(
config_path: "config/credentials/#{environment}.yml.enc",
key_path: "config/credentials/#{environment}.key",
env_key: environment.to_s,
raise_if_missing_key: true
).read
)
end
end
然后您可以在deploy.rb
中执行此操作:
include CredentialLoader
set :rollbar_token, read_credentials(environment: fetch(:stage))["rollbar_access_token"]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.