Module: Bugsnag::Capistrano

Defined in:
lib/bugsnag/capistrano2.rb

Constant Summary collapse

ALLOWED_ENV_SETTINGS =
%w{BUGSNAG_RELEASE_STAGE BUGSNAG_REPOSITORY BUGSNAG_REVISION BUGSNAG_BRANCH BUGSNAG_API_KEY BUGSNAG_APP_VERSION}

Class Method Summary collapse

Class Method Details

.load_into(configuration) ⇒ Object



5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# File 'lib/bugsnag/capistrano2.rb', line 5

def self.load_into(configuration)
  configuration.load do
    after "deploy",            "bugsnag:deploy"
    after "deploy:migrations", "bugsnag:deploy"

    namespace :bugsnag do
      desc "Notify Bugsnag that new production code has been deployed"
      task :deploy, :except => { :no_release => true }, :on_error => :continue do
        # Build the rake command
        rake         = fetch(:rake, "rake")
        rails_env    = fetch(:rails_env, "production")
        bugsnag_env  = fetch(:bugsnag_env, rails_env)
        rake_command = "cd '#{current_path}' && RAILS_ENV=#{rails_env} #{rake} bugsnag:deploy"

        # Build the new environment to pass through to rake
        new_env = {
          "BUGSNAG_RELEASE_STAGE" => bugsnag_env,
          "BUGSNAG_REVISION"      => fetch(:current_revision, nil),
          "BUGSNAG_REPOSITORY"    => fetch(:repository, nil),
          "BUGSNAG_BRANCH"        => fetch(:branch, nil),
          "BUGSNAG_API_KEY"       => fetch(:bugsnag_api_key, nil)
        }.reject { |_, v| v.nil? }

        # Pass through any existing env variables
        ALLOWED_ENV_SETTINGS.each { |opt| new_env[opt] = ENV[opt] if ENV[opt] }

        # Append the env to the rake command
        rake_command << " #{new_env.map{|k,v| "#{k}=#{v}"}.join(" ")}"

        # Run the rake command (only on one server)
        run(rake_command, :once => true)

        logger.info "Bugsnag deploy notification complete."
      end
    end
  end
end