【问题标题】:How can I use Rails 5.2 credentials in capistrano's deploy.rb file?如何在 capistrano 的 deploy.rb 文件中使用 Rails 5.2 凭据?
【发布时间】:2018-06-24 13:53:21
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      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 }
      

      【讨论】:

      • 我有一个与您在上面回答的问题非常相似的问题 (stackoverflow.com/questions/52749047/…)。如果使用mina 部署代码,大概与您在此处概述的非常相似的方法会起作用?我想知道我是否需要在第 1 部分中更改 before "deploy:symlink:linked_files", "setup:copy_linked_master_key",并可能调整 capfile 的等效项?
      【解决方案3】:

      我解决的问题如下:

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

      【讨论】:

        【解决方案4】:
        require File.expand_path("./environment", __dir__)
        puts App::Application.credentials.rollbar_token
        

        【讨论】:

        • require File.expand_path("./environment", __dir__) 放入您的config/deploy.rb 文件中。
        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-11-19
          • 1970-01-01
          • 2013-12-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-10-28
          • 2010-09-20
          相关资源
          最近更新 更多