14

我刚刚将我的 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
    • 我不知道这是否是个好主意,或者如果我走这条路,是否还有其他需要注意的事情
  • 删除滚动条中的部署跟踪
    • ‍♂️</li>
4

5 回答 5

8

将以下行放在您的顶部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]
于 2019-09-23T13:42:50.953 回答
5

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 }
于 2018-09-29T11:33:40.307 回答
4

我解决了如下问题:

set :rollbar_token, YAML.load(`rails credentials:show`)['rollbar_token']
于 2018-09-11T09:35:42.883 回答
2
require File.expand_path("./environment", __dir__)
puts App::Application.credentials.rollbar_token
于 2018-08-05T10:29:43.713 回答
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"
于 2018-06-24T19:23:56.077 回答