Отправка электронных писем во время развертывания Capistrano с использованием Rails 5, Ruby 2.4 и Capistrano 3

Capistrano 3.7.2, Rails 5.0.2 и Ruby 2.4.0, если быть точным. Ошибка, которую я получаю, возникает после Execute load:defaults:

** Execute load:defaults
cap aborted!
NameError: uninitialized constant ActiveSupport::Rescuable
/Users/username/.rvm/gems/ruby-2.4.0/gems/actionmailer-5.0.2/lib/action_mailer/rescuable.rb:6:in `<module:Rescuable>'
/Users/username/.rvm/gems/ruby-2.4.0/gems/actionmailer-5.0.2/lib/action_mailer/rescuable.rb:4:in `<module:ActionMailer>'
/Users/username/.rvm/gems/ruby-2.4.0/gems/actionmailer-5.0.2/lib/action_mailer/rescuable.rb:1:in `<top (required)>'
/Users/username/.rvm/gems/ruby-2.4.0/gems/actionmailer-5.0.2/lib/action_mailer/base.rb:8:in `require'
/Users/username/.rvm/gems/ruby-2.4.0/gems/actionmailer-5.0.2/lib/action_mailer/base.rb:8:in `<top (required)>'
/Users/username/rails_5_test_app/config/deploy/notify/cap_mailer.rb:5:in `require'
/Users/username/rails_5_test_app/config/deploy/notify/cap_mailer.rb:5:in `<top (required)>'
config/deploy.rb:4:in `require'
config/deploy.rb:4:in `<top (required)>'
/Users/username/.rvm/gems/ruby-2.4.0/gems/capistrano-3.7.2/lib/capistrano/setup.rb:27:in `load'
/Users/username/.rvm/gems/ruby-2.4.0/gems/capistrano-3.7.2/lib/capistrano/setup.rb:27:in `block (3 levels) in <top (required)>'
/Users/username/.rvm/gems/ruby-2.4.0/gems/capistrano-3.7.2/lib/capistrano/configuration/variables.rb:32:in `untrusted!'
/Users/username/.rvm/rubies/ruby-2.4.0/lib/ruby/2.4.0/delegate.rb:83:in `method_missing'
/Users/username/.rvm/gems/ruby-2.4.0/gems/capistrano-3.7.2/lib/capistrano/setup.rb:26:in `block (2 levels) in <top (required)>'
/Users/username/.rvm/gems/ruby-2.4.0@global/gems/rake-12.0.0/lib/rake/task.rb:250:in `block in execute'
/Users/username/.rvm/gems/ruby-2.4.0@global/gems/rake-12.0.0/lib/rake/task.rb:250:in `each'
/Users/username/.rvm/gems/ruby-2.4.0@global/gems/rake-12.0.0/lib/rake/task.rb:250:in `execute'
/Users/username/.rvm/gems/ruby-2.4.0@global/gems/rake-12.0.0/lib/rake/task.rb:194:in `block in invoke_with_call_chain'
/Users/username/.rvm/rubies/ruby-2.4.0/lib/ruby/2.4.0/monitor.rb:214:in `mon_synchronize'
/Users/username/.rvm/gems/ruby-2.4.0@global/gems/rake-12.0.0/lib/rake/task.rb:187:in `invoke_with_call_chain'
/Users/username/.rvm/gems/ruby-2.4.0@global/gems/rake-12.0.0/lib/rake/task.rb:180:in `invoke'
/Users/username/.rvm/gems/ruby-2.4.0@global/gems/rake-12.0.0/lib/rake/application.rb:152:in `invoke_task'
/Users/username/.rvm/gems/ruby-2.4.0@global/gems/rake-12.0.0/lib/rake/application.rb:108:in `block (2 levels) in top_level'
/Users/username/.rvm/gems/ruby-2.4.0@global/gems/rake-12.0.0/lib/rake/application.rb:108:in `each'
/Users/username/.rvm/gems/ruby-2.4.0@global/gems/rake-12.0.0/lib/rake/application.rb:108:in `block in top_level'
/Users/username/.rvm/gems/ruby-2.4.0@global/gems/rake-12.0.0/lib/rake/application.rb:117:in `run_with_threads'
/Users/username/.rvm/gems/ruby-2.4.0@global/gems/rake-12.0.0/lib/rake/application.rb:102:in `top_level'
/Users/username/.rvm/gems/ruby-2.4.0@global/gems/rake-12.0.0/lib/rake/application.rb:80:in `block in run'
/Users/username/.rvm/gems/ruby-2.4.0@global/gems/rake-12.0.0/lib/rake/application.rb:178:in `standard_exception_handling'
/Users/username/.rvm/gems/ruby-2.4.0@global/gems/rake-12.0.0/lib/rake/application.rb:77:in `run'
/Users/username/.rvm/gems/ruby-2.4.0/gems/capistrano-3.7.2/lib/capistrano/application.rb:14:in `run'
/Users/username/.rvm/gems/ruby-2.4.0/gems/capistrano-3.7.2/bin/cap:3:in `<top (required)>'
/Users/username/.rvm/gems/ruby-2.4.0/bin/cap:22:in `load'
/Users/username/.rvm/gems/ruby-2.4.0/bin/cap:22:in `<main>'
/Users/username/.rvm/gems/ruby-2.4.0/bin/ruby_executable_hooks:15:in `eval'
/Users/username/.rvm/gems/ruby-2.4.0/bin/ruby_executable_hooks:15:in `<main>'
Tasks: TOP => staging

Я собираюсь начать обновление своих приложений Rails 4 до Rails 5 и решил сделать небольшое тестовое приложение, чтобы убедиться, что все мои драгоценные камни работают. Все в порядке, за исключением кода, который я использовал с Rails 2 для отправки электронных писем во время развертывания Capistrano, что приводит к этой ошибке, когда я пытаюсь запросить или загрузить код почтовой программы; строка 4 файла deploy.rb — это требование. Если я прокомментирую это и установлю флаг, чтобы не отправлять электронное письмо, развертывание работает отлично.

Код почтовой программы (основанный на том, что много лет назад опубликовал Мислав Маронич):

cap_mailer.rb:

require "action_mailer"

yaml_config = File.read("config/email.yml")
email_config = YAML.load(yaml_config)
ActionMailer::Base.delivery_method = email_config['delivery_method'] # currently set to :smtp
ActionMailer::Base.smtp_settings = {
    address: email_config['smtp_settings']['address'],
    port: email_config['smtp_settings']['port'],
    notify_emails: email_config['notify_emails']
}
ActionMailer::Base.view_paths = File.dirname(__FILE__)

class CapMailer < ActionMailer::Base
  default :from => 'App Deployment <[email protected]>'

  def deploy_notification(cap_vars)
    @now = Time.now

    set :body, ENV['comment']

    mail(:to => fetch(:notify_emails),
         :subject => "#{fetch(:human_readable_application_name)} - Changes to application on #{fetch(:stage)} server at #{fetch(:host)}"
    )
  end

  def test_email
    @now = Time.now

    mail(:to => "[email protected]",
         :subject => "#{fetch(:human_readable_application_name)} - Capistrano test email #{@now.strftime("on %m/%d/%Y at %I:%M %p")}"
    )

  end

end

Все, что я могу найти в Интернете, — это ссылки на очень похожие настройки рассылки (например, https://gist.github.com/johnthetherth/955917), которые были написаны для более старых версий всего. Есть несколько гемов, написанных для отправки почты во время развертывания Capistrano, но у них та же проблема, что они действительно старые (capistrano -notifier, capistrano_mailer).

Так что на данный момент я застрял. Погуглив NameError: uninitialized constant ActiveSupport::Rescuable предположил, что это проблема с конфигурацией, но я не знаю, что там искать. ActiveSupport::Rescable ЕСТЬ в моей установке Rails; Я перепроверил. Любые идеи были бы хорошы.


person Maltiriel    schedule 08.03.2017    source источник


Ответы (1)


Похоже, вам нужно сначала загрузить ActiveSupport, например:

require "active_support"
require "action_mailer"
person Matt Brictson    schedule 09.03.2017
comment
Это сработало отлично. Можете объяснить, зачем это нужно? И/или почему это стало необходимо только в Rails 5? Я не сталкивался с чем-то подобным раньше. - person Maltiriel; 09.03.2017
comment
Ну, судя по ошибке, ActionMailer зависит от ActiveSupport::Rescuable, но, видимо, сам его не загружает. Это похоже на недосмотр (ошибку) в ActionMailer 5.0.2, и я бы сообщил об этом на Rails GitHub. - person Matt Brictson; 09.03.2017