如何在capistrano的deploy.rb文件中使用Rails 5.2凭证?

时间:2018-06-24 13:53:21

标签: ruby-on-rails ruby-on-rails-5 capistrano capistrano3 rollbar

我刚刚将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变量
    • 我不喜欢它如何分隔/自定义这一设置
  • 以某种方式使capistrano可以访问Rails.application.credentials
    • 我不知道这是个好主意还是走这条路线是否需要注意其他事情
  • 在滚动条中删除部署跟踪
    • ‍♂️

5 个答案:

答案 0 :(得分:3)

1。将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

2。确保文件已链接

deploy.rb中:

set :linked_files, fetch(:linked_files, []).push("config/master.key")

3。确保Capfile加载任务:

确保您的Capfile有一行

# Load custom tasks from `lib/capistrano/tasks` if you have any defined
Dir.glob("lib/capistrano/tasks/*.rake").each { |r| import r }

答案 1 :(得分:2)

我解决了以下问题:

set :rollbar_token, YAML.load(`rails credentials:show`)['rollbar_token']

答案 2 :(得分:2)

将以下几行放在您的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]

答案 3 :(得分:1)

我解决此问题的方法是在服务器上声明一个$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"

答案 4 :(得分:0)

require File.expand_path("./environment", __dir__)
puts App::Application.credentials.rollbar_token
相关问题