rollbar 2.8.3 → 3.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (238) hide show
  1. checksums.yaml +5 -5
  2. data/.codeclimate.yml +18 -0
  3. data/.github/pull_request_template.md +34 -0
  4. data/.github/workflows/ci.yml +67 -0
  5. data/.gitignore +3 -1
  6. data/.rubocop.yml +206 -7
  7. data/Appraisals +10 -10
  8. data/CHANGELOG.md +257 -3
  9. data/Gemfile +74 -13
  10. data/README.md +38 -833
  11. data/Rakefile +0 -0
  12. data/THANKS.md +1 -0
  13. data/data/rollbar.snippet.js +1 -1
  14. data/docs/configuration.md +64 -3
  15. data/docs/plugins.md +46 -0
  16. data/gemfiles/rails50.gemfile +56 -0
  17. data/gemfiles/rails51.gemfile +57 -0
  18. data/gemfiles/rails52.gemfile +56 -0
  19. data/gemfiles/rails60.gemfile +52 -0
  20. data/gemfiles/rails61.gemfile +52 -0
  21. data/gemfiles/rails70.gemfile +52 -0
  22. data/gemfiles/rails71.gemfile +52 -0
  23. data/lib/generators/rollbar/rollbar_generator.rb +24 -20
  24. data/lib/generators/rollbar/templates/{initializer.rb → initializer.erb} +19 -5
  25. data/lib/rails/rollbar_runner.rb +26 -22
  26. data/lib/rollbar/capistrano.rb +78 -38
  27. data/lib/rollbar/capistrano3.rb +62 -1
  28. data/lib/rollbar/capistrano_tasks.rb +166 -0
  29. data/lib/rollbar/configuration.rb +291 -71
  30. data/lib/rollbar/delay/active_job.rb +17 -0
  31. data/lib/rollbar/delay/delayed_job.rb +23 -0
  32. data/lib/rollbar/delay/girl_friday.rb +4 -9
  33. data/lib/rollbar/delay/resque.rb +3 -6
  34. data/lib/rollbar/delay/shoryuken.rb +36 -0
  35. data/lib/rollbar/delay/sidekiq.rb +6 -8
  36. data/lib/rollbar/delay/sucker_punch.rb +17 -22
  37. data/lib/rollbar/delay/thread.rb +74 -3
  38. data/lib/rollbar/deploy.rb +91 -0
  39. data/lib/rollbar/encoding/encoder.rb +22 -11
  40. data/lib/rollbar/encoding.rb +2 -7
  41. data/lib/rollbar/exception_reporter.rb +36 -12
  42. data/lib/rollbar/item/backtrace.rb +118 -0
  43. data/lib/rollbar/item/frame.rb +121 -0
  44. data/lib/rollbar/item/locals.rb +103 -0
  45. data/lib/rollbar/item.rb +314 -0
  46. data/lib/rollbar/js.rb +0 -28
  47. data/lib/rollbar/json.rb +7 -55
  48. data/lib/rollbar/language_support.rb +7 -19
  49. data/lib/rollbar/lazy_store.rb +8 -12
  50. data/lib/rollbar/logger.rb +71 -0
  51. data/lib/rollbar/logger_proxy.rb +18 -1
  52. data/lib/rollbar/middleware/js/json_value.rb +36 -0
  53. data/lib/rollbar/middleware/js.rb +297 -0
  54. data/lib/rollbar/middleware/rack/builder.rb +4 -4
  55. data/lib/rollbar/middleware/rack/test_session.rb +4 -4
  56. data/lib/rollbar/middleware/rack.rb +52 -0
  57. data/lib/rollbar/middleware/rails/rollbar.rb +19 -7
  58. data/lib/rollbar/middleware/rails/show_exceptions.rb +21 -9
  59. data/lib/rollbar/middleware/sinatra.rb +2 -40
  60. data/lib/rollbar/notifier/trace_with_bindings.rb +75 -0
  61. data/lib/rollbar/notifier.rb +913 -0
  62. data/lib/rollbar/plugin.rb +126 -0
  63. data/lib/rollbar/plugins/active_job.rb +54 -0
  64. data/lib/rollbar/plugins/basic_socket.rb +31 -0
  65. data/lib/rollbar/plugins/delayed_job/job_data.rb +50 -0
  66. data/lib/rollbar/plugins/delayed_job/plugin.rb +88 -0
  67. data/lib/rollbar/plugins/delayed_job.rb +12 -0
  68. data/lib/rollbar/plugins/error_context.rb +11 -0
  69. data/lib/rollbar/plugins/goalie.rb +65 -0
  70. data/lib/rollbar/plugins/rack.rb +18 -0
  71. data/lib/rollbar/plugins/rails/controller_methods.rb +56 -0
  72. data/lib/rollbar/plugins/rails/error_subscriber.rb +12 -0
  73. data/lib/rollbar/plugins/rails/railtie30.rb +18 -0
  74. data/lib/rollbar/plugins/rails/railtie32.rb +18 -0
  75. data/lib/rollbar/plugins/rails/railtie_mixin.rb +37 -0
  76. data/lib/rollbar/plugins/rails.rb +89 -0
  77. data/lib/rollbar/plugins/rake.rb +73 -0
  78. data/lib/rollbar/plugins/resque/failure.rb +39 -0
  79. data/lib/rollbar/plugins/resque.rb +11 -0
  80. data/lib/rollbar/plugins/sidekiq/plugin.rb +77 -0
  81. data/lib/rollbar/plugins/sidekiq.rb +37 -0
  82. data/lib/rollbar/plugins/thread.rb +14 -0
  83. data/lib/rollbar/plugins/validations.rb +45 -0
  84. data/lib/rollbar/plugins.rb +47 -0
  85. data/lib/rollbar/rails.rb +0 -1
  86. data/lib/rollbar/rake_tasks.rb +4 -66
  87. data/lib/rollbar/request_data_extractor.rb +157 -117
  88. data/lib/rollbar/rollbar_test.rb +38 -0
  89. data/lib/rollbar/scrubbers/params.rb +133 -0
  90. data/lib/rollbar/scrubbers/url.rb +90 -35
  91. data/lib/rollbar/scrubbers.rb +13 -0
  92. data/lib/rollbar/truncation/frames_strategy.rb +2 -1
  93. data/lib/rollbar/truncation/min_body_strategy.rb +3 -4
  94. data/lib/rollbar/truncation/mixin.rb +1 -1
  95. data/lib/rollbar/truncation/remove_any_key_strategy.rb +126 -0
  96. data/lib/rollbar/truncation/remove_extra_strategy.rb +37 -0
  97. data/lib/rollbar/truncation/remove_request_strategy.rb +21 -0
  98. data/lib/rollbar/truncation/strings_strategy.rb +6 -5
  99. data/lib/rollbar/truncation.rb +10 -4
  100. data/lib/rollbar/util/hash.rb +37 -6
  101. data/lib/rollbar/util/ip_anonymizer.rb +33 -0
  102. data/lib/rollbar/util/ip_obfuscator.rb +1 -1
  103. data/lib/rollbar/util.rb +101 -55
  104. data/lib/rollbar/version.rb +1 -1
  105. data/lib/rollbar.rb +91 -879
  106. data/lib/tasks/benchmark.rake +104 -0
  107. data/lib/tasks/tasks.rake +3 -3
  108. data/rollbar.gemspec +21 -32
  109. data/spec/support/rollbar_api.rb +67 -0
  110. metadata +78 -439
  111. data/.travis.yml +0 -155
  112. data/gemfiles/rails30.gemfile +0 -20
  113. data/gemfiles/rails31.gemfile +0 -16
  114. data/gemfiles/rails32.gemfile +0 -17
  115. data/gemfiles/rails40.gemfile +0 -17
  116. data/gemfiles/rails41.gemfile +0 -15
  117. data/gemfiles/rails42.gemfile +0 -15
  118. data/lib/rollbar/active_job.rb +0 -11
  119. data/lib/rollbar/active_record_extension.rb +0 -14
  120. data/lib/rollbar/core_ext/basic_socket.rb +0 -7
  121. data/lib/rollbar/core_ext/thread.rb +0 -9
  122. data/lib/rollbar/delayed_job.rb +0 -78
  123. data/lib/rollbar/encoding/legacy_encoder.rb +0 -20
  124. data/lib/rollbar/goalie.rb +0 -33
  125. data/lib/rollbar/js/frameworks/rails.rb +0 -29
  126. data/lib/rollbar/js/frameworks.rb +0 -6
  127. data/lib/rollbar/js/middleware.rb +0 -129
  128. data/lib/rollbar/js/version.rb +0 -5
  129. data/lib/rollbar/json/default.rb +0 -11
  130. data/lib/rollbar/json/oj.rb +0 -15
  131. data/lib/rollbar/rack.rb +0 -9
  132. data/lib/rollbar/rails/controller_methods.rb +0 -40
  133. data/lib/rollbar/railtie.rb +0 -46
  134. data/lib/rollbar/rake.rb +0 -38
  135. data/lib/rollbar/sidekiq.rb +0 -40
  136. data/lib/rollbar/tasks/rollbar.cap +0 -45
  137. data/spec/cacert.pem +0 -3988
  138. data/spec/controllers/home_controller_spec.rb +0 -455
  139. data/spec/delay/sidekiq_spec.rb +0 -61
  140. data/spec/delay/sucker_punch_spec.rb +0 -25
  141. data/spec/delayed/backend/test.rb +0 -139
  142. data/spec/delayed/serialization/test.rb +0 -0
  143. data/spec/dummyapp/.gitignore +0 -73
  144. data/spec/dummyapp/Rakefile +0 -7
  145. data/spec/dummyapp/app/assets/javascripts/application.js +0 -3
  146. data/spec/dummyapp/app/assets/stylesheets/application.css.scss +0 -37
  147. data/spec/dummyapp/app/controllers/application_controller.rb +0 -3
  148. data/spec/dummyapp/app/controllers/home_controller.rb +0 -60
  149. data/spec/dummyapp/app/controllers/users_controller.rb +0 -17
  150. data/spec/dummyapp/app/helpers/.gitkeep +0 -0
  151. data/spec/dummyapp/app/mailers/.gitkeep +0 -0
  152. data/spec/dummyapp/app/models/.gitkeep +0 -0
  153. data/spec/dummyapp/app/models/user.rb +0 -7
  154. data/spec/dummyapp/app/views/devise/registrations/edit.html.erb +0 -27
  155. data/spec/dummyapp/app/views/devise/registrations/new.html.erb +0 -20
  156. data/spec/dummyapp/app/views/devise/shared/_links.html.erb +0 -25
  157. data/spec/dummyapp/app/views/home/cause_exception.html.erb +0 -1
  158. data/spec/dummyapp/app/views/home/index.html.erb +0 -4
  159. data/spec/dummyapp/app/views/home/report_exception.html.erb +0 -1
  160. data/spec/dummyapp/app/views/js/test.html.erb +0 -1
  161. data/spec/dummyapp/app/views/layouts/_messages.html.erb +0 -5
  162. data/spec/dummyapp/app/views/layouts/_navigation.html.erb +0 -21
  163. data/spec/dummyapp/app/views/layouts/application.html.erb +0 -25
  164. data/spec/dummyapp/app/views/layouts/simple.html.erb +0 -18
  165. data/spec/dummyapp/app/views/users/index.html.erb +0 -8
  166. data/spec/dummyapp/app/views/users/show.html.erb +0 -3
  167. data/spec/dummyapp/config/application.rb +0 -59
  168. data/spec/dummyapp/config/boot.rb +0 -10
  169. data/spec/dummyapp/config/database.yml +0 -25
  170. data/spec/dummyapp/config/environment.rb +0 -5
  171. data/spec/dummyapp/config/environments/development.rb +0 -37
  172. data/spec/dummyapp/config/environments/production.rb +0 -67
  173. data/spec/dummyapp/config/environments/test.rb +0 -37
  174. data/spec/dummyapp/config/initializers/backtrace_silencers.rb +0 -7
  175. data/spec/dummyapp/config/initializers/inflections.rb +0 -15
  176. data/spec/dummyapp/config/initializers/mime_types.rb +0 -5
  177. data/spec/dummyapp/config/initializers/rollbar.rb +0 -23
  178. data/spec/dummyapp/config/initializers/secret_token.rb +0 -7
  179. data/spec/dummyapp/config/initializers/session_store.rb +0 -8
  180. data/spec/dummyapp/config/initializers/wrap_parameters.rb +0 -16
  181. data/spec/dummyapp/config/locales/devise.en.yml +0 -58
  182. data/spec/dummyapp/config/locales/en.yml +0 -5
  183. data/spec/dummyapp/config/routes.rb +0 -17
  184. data/spec/dummyapp/config.ru +0 -4
  185. data/spec/dummyapp/db/migrate/20121121184652_devise_create_users.rb +0 -46
  186. data/spec/dummyapp/db/migrate/20121121184654_add_name_to_users.rb +0 -5
  187. data/spec/dummyapp/db/schema.rb +0 -35
  188. data/spec/dummyapp/db/seeds.rb +0 -12
  189. data/spec/dummyapp/lib/assets/.gitkeep +0 -0
  190. data/spec/dummyapp/public/404.html +0 -26
  191. data/spec/dummyapp/public/422.html +0 -26
  192. data/spec/dummyapp/public/500.html +0 -25
  193. data/spec/dummyapp/public/favicon.ico +0 -0
  194. data/spec/dummyapp/script/rails +0 -6
  195. data/spec/fixtures/file1 +0 -1
  196. data/spec/fixtures/file2 +0 -1
  197. data/spec/fixtures/payloads/message.json +0 -25
  198. data/spec/fixtures/payloads/sample.trace.json +0 -275
  199. data/spec/fixtures/payloads/sample.trace_chain.json +0 -530
  200. data/spec/generators/rollbar/rollbar_generator_spec.rb +0 -24
  201. data/spec/requests/home_spec.rb +0 -49
  202. data/spec/rollbar/active_job_spec.rb +0 -33
  203. data/spec/rollbar/configuration_spec.rb +0 -24
  204. data/spec/rollbar/delay/girl_friday_spec.rb +0 -41
  205. data/spec/rollbar/delay/resque_spec.rb +0 -37
  206. data/spec/rollbar/delay/thread_spec.rb +0 -27
  207. data/spec/rollbar/delayed_job/job_data.rb +0 -35
  208. data/spec/rollbar/delayed_job_spec.rb +0 -90
  209. data/spec/rollbar/encoding/encoder_spec.rb +0 -63
  210. data/spec/rollbar/js/frameworks/rails_spec.rb +0 -19
  211. data/spec/rollbar/js/middleware_spec.rb +0 -162
  212. data/spec/rollbar/json/oj_spec.rb +0 -18
  213. data/spec/rollbar/json_spec.rb +0 -110
  214. data/spec/rollbar/lazy_store_spec.rb +0 -99
  215. data/spec/rollbar/logger_proxy_spec.rb +0 -34
  216. data/spec/rollbar/middleware/rack/builder_spec.rb +0 -151
  217. data/spec/rollbar/middleware/sinatra_spec.rb +0 -197
  218. data/spec/rollbar/rake_spec.rb +0 -34
  219. data/spec/rollbar/request_data_extractor_spec.rb +0 -82
  220. data/spec/rollbar/scrubbers/url_spec.rb +0 -111
  221. data/spec/rollbar/sidekiq_spec.rb +0 -90
  222. data/spec/rollbar/truncation/frames_strategy_spec.rb +0 -70
  223. data/spec/rollbar/truncation/min_body_strategy_spec.rb +0 -57
  224. data/spec/rollbar/truncation/strings_strategy_spec.rb +0 -89
  225. data/spec/rollbar/truncation_spec.rb +0 -27
  226. data/spec/rollbar/util/hash_spec.rb +0 -22
  227. data/spec/rollbar/util_spec.rb +0 -19
  228. data/spec/rollbar_bc_spec.rb +0 -380
  229. data/spec/rollbar_spec.rb +0 -2067
  230. data/spec/spec_helper.rb +0 -49
  231. data/spec/support/cause_exception.rb +0 -1
  232. data/spec/support/encoding_helpers.rb +0 -8
  233. data/spec/support/encodings/iso_8859_9 +0 -1
  234. data/spec/support/fixture_helpers.rb +0 -10
  235. data/spec/support/get_ip_raising.rb +0 -7
  236. data/spec/support/helpers.rb +0 -5
  237. data/spec/support/notifier_helpers.rb +0 -36
  238. data/spec/support/shared_contexts.rb +0 -12
@@ -1,46 +1,50 @@
1
1
  require 'rails/generators'
2
2
  require 'rails/generators/named_base'
3
+ require 'generators/rollbar/rollbar_generator'
3
4
 
4
5
  module Rollbar
5
6
  module Generators
6
7
  class RollbarGenerator < ::Rails::Generators::Base
7
- argument :access_token, :type => :string, :banner => 'access_token', :default => :use_env_sentinel
8
+ argument :access_token, :type => :string, :banner => 'access_token',
9
+ :default => :use_env_sentinel
8
10
 
9
11
  source_root File.expand_path(File.join(File.dirname(__FILE__), 'templates'))
10
12
 
11
13
  def create_initializer
12
- say "creating initializer..."
14
+ say 'creating initializer...'
13
15
  if access_token_configured?
14
16
  say "It looks like you've already configured Rollbar."
15
- say "To re-create the config file, remove it first: config/initializers/rollbar.rb"
17
+ say 'To re-create the config file, remove it first: ' \
18
+ 'config/initializers/rollbar.rb'
16
19
  exit
17
20
  end
18
21
 
19
22
  begin
20
23
  require 'ey_config'
21
24
  rescue LoadError
25
+ # Skip loading
22
26
  end
23
-
27
+
24
28
  if defined? EY::Config
25
- say "Access token will be read from Engine Yard configuration"
29
+ say 'Access token will be read from Engine Yard configuration'
30
+ elsif access_token === :use_env_sentinel
31
+ say 'Generator run without an access token; assuming you want to ' \
32
+ 'configure using an environment variable.'
33
+ say "You'll need to add an environment variable ROLLBAR_ACCESS_TOKEN " \
34
+ 'with your access token:'
35
+ say "\n$ export ROLLBAR_ACCESS_TOKEN=yourtokenhere"
36
+ say "\nIf that's not what you wanted to do:"
37
+ say "\n$ rm config/initializers/rollbar.rb"
38
+ say '$ rails generate rollbar yourtokenhere'
39
+ say "\n"
26
40
  else
27
- if access_token === :use_env_sentinel
28
- say "Generator run without an access token; assuming you want to configure using an environment variable."
29
- say "You'll need to add an environment variable ROLLBAR_ACCESS_TOKEN with your access token:"
30
- say "\n$ export ROLLBAR_ACCESS_TOKEN=yourtokenhere"
31
- say "\nIf that's not what you wanted to do:"
32
- say "\n$ rm config/initializers/rollbar.rb"
33
- say "$ rails generate rollbar yourtokenhere"
34
- say "\n"
35
- else
36
- say "access token: " << access_token
37
- end
41
+ say 'access token: ' << access_token
38
42
  end
39
43
 
40
- template 'initializer.rb', 'config/initializers/rollbar.rb',
41
- :assigns => { :access_token => access_token_expr }
44
+ template 'initializer.erb', 'config/initializers/rollbar.rb',
45
+ :assigns => { :access_token => access_token_expr }
42
46
 
43
- # TODO run rake test task
47
+ # TODO: run rake test task
44
48
  end
45
49
 
46
50
  def access_token_expr
@@ -52,7 +56,7 @@ module Rollbar
52
56
  end
53
57
 
54
58
  def access_token_configured?
55
- File.exists?('config/initializers/rollbar.rb')
59
+ File.exist?('config/initializers/rollbar.rb')
56
60
  end
57
61
  end
58
62
  end
@@ -19,12 +19,14 @@ Rollbar.configure do |config|
19
19
  <%- end -%>
20
20
 
21
21
  # By default, Rollbar will try to call the `current_user` controller method
22
- # to fetch the logged-in user object, and then call that object's `id`,
23
- # `username`, and `email` methods to fetch those properties. To customize:
22
+ # to fetch the logged-in user object, and then call that object's `id`
23
+ # method to fetch this property. To customize:
24
24
  # config.person_method = "my_current_user"
25
25
  # config.person_id_method = "my_id"
26
- # config.person_username_method = "my_username"
27
- # config.person_email_method = "my_email"
26
+
27
+ # Additionally, you may specify the following:
28
+ # config.person_username_method = "username"
29
+ # config.person_email_method = "email"
28
30
 
29
31
  # If you want to attach custom data to all exception and message reports,
30
32
  # provide a lambda like the following. It should return a hash.
@@ -57,10 +59,22 @@ Rollbar.configure do |config|
57
59
  # You can supply custom Sidekiq options:
58
60
  # config.use_sidekiq 'queue' => 'default'
59
61
 
62
+ # If your application runs behind a proxy server, you can set proxy parameters here.
63
+ # If https_proxy is set in your environment, that will be used. Settings here have precedence.
64
+ # The :host key is mandatory and must include the URL scheme (e.g. 'http://'), all other fields
65
+ # are optional.
66
+ #
67
+ # config.proxy = {
68
+ # host: 'http://some.proxy.server',
69
+ # port: 80,
70
+ # user: 'username_if_auth_required',
71
+ # password: 'password_if_auth_required'
72
+ # }
73
+
60
74
  # If you run your staging application instance in production environment then
61
75
  # you'll want to override the environment reported by `Rails.env` with an
62
76
  # environment variable like this: `ROLLBAR_ENV=staging`. This is a recommended
63
77
  # setup for Heroku. See:
64
78
  # https://devcenter.heroku.com/articles/deploying-to-a-custom-rails-environment
65
- config.environment = ENV['ROLLBAR_ENV'] || Rails.env
79
+ config.environment = ENV['ROLLBAR_ENV'].presence || Rails.env
66
80
  end
@@ -1,23 +1,16 @@
1
1
  require 'rails'
2
2
  require 'rollbar'
3
3
 
4
- APP_PATH = File.expand_path('config/application', Dir.pwd)
4
+ # Rails.root is not present here.
5
+ # RSpec needs ENV['DUMMYAPP_PATH'] in order to have a valid path.
6
+ # Dir.pwd is used in normal operation.
7
+ APP_PATH = File.expand_path(
8
+ 'config/application',
9
+ (ENV['DUMMYAPP_PATH'] || Dir.pwd)
10
+ )
5
11
 
6
12
  module Rails
7
13
  class RollbarRunner
8
- class GemResolver
9
- def railties_gem
10
- Gem::Specification.find_by_name('railties')
11
- end
12
- end
13
-
14
- class LegacyGemResolver
15
- def railties_gem
16
- searcher = Gem::GemPathSearcher.new
17
- searcher.find('rails')
18
- end
19
- end
20
-
21
14
  attr_reader :command
22
15
 
23
16
  def initialize
@@ -36,27 +29,40 @@ module Rails
36
29
  end
37
30
 
38
31
  def eval_runner
32
+ if Gem::Version.new(Rails.version) >= Gem::Version.new('5.1.0')
33
+ rails5_runner
34
+ else
35
+ legacy_runner
36
+ end
37
+ end
38
+
39
+ def legacy_runner
39
40
  string_to_eval = File.read(runner_path)
40
41
 
41
- ::Rails.module_eval(<<-EOL,__FILE__,__LINE__ + 2)
42
+ ::Rails.module_eval(<<-FILE, __FILE__, __LINE__ + 1)
42
43
  #{string_to_eval}
43
- EOL
44
+ FILE
45
+ end
46
+
47
+ def rails5_runner
48
+ require 'rails/command'
49
+
50
+ Rails::Command.invoke 'runner', ARGV
44
51
  end
45
52
 
46
53
  def rollbar_managed
47
54
  yield
48
- rescue => e
55
+ rescue StandardError => e
49
56
  Rollbar.scope(:custom => { :command => command }).error(e)
50
57
  raise
51
58
  end
52
59
 
53
60
  def runner_path
54
- railties_gem_dir + '/lib/rails/commands/runner.rb'
61
+ "#{railties_gem_dir}/lib/rails/commands/runner.rb"
55
62
  end
56
63
 
57
64
  def railties_gem
58
- resolver_class = Gem::Specification.respond_to?(:find_by_name) ? GemResolver : LegacyGemResolver
59
- gem = resolver_class.new.railties_gem
65
+ gem = Gem::Specification.find_by_name('railties')
60
66
 
61
67
  abort 'railties gem not found' unless gem
62
68
 
@@ -68,5 +74,3 @@ module Rails
68
74
  end
69
75
  end
70
76
  end
71
-
72
-
@@ -1,43 +1,83 @@
1
+ # This is a tasks file to use with Capistrano 2
2
+
1
3
  require 'capistrano'
4
+ require 'rollbar/deploy'
5
+ require 'net/http'
6
+ require 'rubygems'
7
+ require 'json'
8
+ require 'rollbar/capistrano_tasks'
2
9
 
3
10
  module Rollbar
4
- module Capistrano
5
- def self.load_into(configuration)
6
- configuration.load do
7
- after 'deploy', 'rollbar:deploy'
8
- after 'deploy:migrations', 'rollbar:deploy'
9
- after 'deploy:cold', 'rollbar:deploy'
10
-
11
- namespace :rollbar do
12
- desc 'Send the deployment notification to Rollbar.'
13
- task :deploy, :except => { :no_release => true } do
14
- require 'net/http'
15
- require 'rubygems'
16
- require 'json'
17
-
18
- _cset(:rollbar_user) { ENV['USER'] || ENV['USERNAME'] }
19
- _cset(:rollbar_env) { fetch(:rails_env, 'production') }
20
- _cset(:rollbar_token) { abort("Please specify the Rollbar access token, set :rollbar_token, 'your token'") }
21
-
22
- unless configuration.dry_run
23
- uri = URI.parse('https://api.rollbar.com/api/1/deploy/')
24
-
25
- params = {
26
- :local_username => rollbar_user,
27
- :access_token => rollbar_token,
28
- :environment => rollbar_env,
29
- :revision => current_revision
30
- }
31
-
32
- request = Net::HTTP::Post.new(uri.request_uri)
33
- request.body = ::JSON.dump(params)
34
-
35
- Net::HTTP.start(uri.host, uri.port, :use_ssl => true) do |http|
36
- http.request(request)
37
- end
38
- end
39
-
40
- logger.info('Rollbar notification complete')
11
+ # Module for loading Rollbar Capistrano tasks into Capistrano 2
12
+ module Capistrano2
13
+ class << self
14
+ def load_into(configuration)
15
+ load_tasks(configuration)
16
+ load_tasks_flow(configuration)
17
+ load_properties(configuration)
18
+ end
19
+
20
+ private
21
+
22
+ def load_tasks_flow(configuration)
23
+ configuration.load do
24
+ before 'deploy', 'rollbar:deploy_started'
25
+
26
+ after 'deploy', 'rollbar:deploy_succeeded'
27
+ after 'deploy:migrations', 'rollbar:deploy_succeeded'
28
+ after 'deploy:cold', 'rollbar:deploy_succeeded'
29
+ end
30
+ end
31
+
32
+ def load_properties(configuration)
33
+ configuration.load do
34
+ _cset(:rollbar_role) { :app }
35
+ _cset(:rollbar_user) { ENV['USER'] || ENV['USERNAME'] }
36
+ _cset(:rollbar_env) { fetch(:rails_env, 'production') }
37
+ _cset(:rollbar_token) do
38
+ abort(
39
+ "Please specify the Rollbar access token, set :rollbar_token, 'your token'"
40
+ )
41
+ end
42
+ _cset(:rollbar_revision) { real_revision }
43
+ _cset(:rollbar_comment) { nil }
44
+ end
45
+ end
46
+
47
+ def load_tasks(configuration)
48
+ load_deploy_started(configuration)
49
+ load_deploy_succeeded(configuration)
50
+ end
51
+
52
+ def load_deploy_started(configuration)
53
+ load_task(
54
+ :desc => 'Send deployment started notification to Rollbar.',
55
+ :task => :deploy_started,
56
+ :configuration => configuration
57
+ ) do
58
+ ::Rollbar::CapistranoTasks.deploy_started(
59
+ configuration, configuration.logger, configuration.dry_run
60
+ )
61
+ end
62
+ end
63
+
64
+ def load_deploy_succeeded(configuration)
65
+ load_task(
66
+ :desc => 'Send deployment succeeded notification to Rollbar.',
67
+ :task => :deploy_succeeded,
68
+ :configuration => configuration
69
+ ) do
70
+ ::Rollbar::CapistranoTasks.deploy_succeeded(
71
+ configuration, configuration.logger, configuration.dry_run
72
+ )
73
+ end
74
+ end
75
+
76
+ def load_task(configuration:, desc:, task:, &block)
77
+ configuration.load do
78
+ namespace :rollbar do
79
+ desc(desc)
80
+ task(task, &block)
41
81
  end
42
82
  end
43
83
  end
@@ -46,5 +86,5 @@ module Rollbar
46
86
  end
47
87
 
48
88
  if Capistrano::Configuration.instance
49
- Rollbar::Capistrano.load_into(Capistrano::Configuration.instance)
89
+ Rollbar::Capistrano2.load_into(Capistrano::Configuration.instance)
50
90
  end
@@ -1 +1,62 @@
1
- load File.expand_path("../tasks/rollbar.cap", __FILE__)
1
+ # This is a tasks file to use with Capistrano 3
2
+
3
+ require 'net/http'
4
+ require 'rubygems'
5
+ require 'json'
6
+ require 'rollbar/deploy'
7
+ require 'rollbar/capistrano_tasks'
8
+
9
+ namespace :rollbar do
10
+ # dry_run? wasn't introduced till Capistrano 3.5.0; use the old fetch(:sshkit_backed)
11
+ set :dry_run, (proc {
12
+ ::Capistrano::Configuration.env.fetch(:sshkit_backend) ==
13
+ ::SSHKit::Backend::Printer
14
+ })
15
+
16
+ desc 'Send deployment started notification to Rollbar.'
17
+ task :deploy_started do
18
+ on primary fetch(:rollbar_role) do
19
+ ::Rollbar::CapistranoTasks.deploy_started(self, self, fetch(:dry_run))
20
+ end
21
+ end
22
+
23
+ desc 'Send deployment succeeded notification to Rollbar.'
24
+ task :deploy_succeeded do
25
+ on primary fetch(:rollbar_role) do
26
+ ::Rollbar::CapistranoTasks.deploy_succeeded(self, self, fetch(:dry_run))
27
+ end
28
+ end
29
+
30
+ desc 'Send deployment failed notification to Rollbar.'
31
+ task :deploy_failed do
32
+ on primary fetch(:rollbar_role) do
33
+ ::Rollbar::CapistranoTasks.deploy_failed(self, self, fetch(:dry_run))
34
+ end
35
+ end
36
+
37
+ task :fail do
38
+ raise StandardError
39
+ end
40
+ end
41
+
42
+ namespace :deploy do
43
+ after 'deploy:set_current_revision', 'rollbar:deploy_started'
44
+ after 'deploy:finished', 'rollbar:deploy_succeeded'
45
+ after 'deploy:failed', 'rollbar:deploy_failed'
46
+
47
+ # Used for testing :deploy_failed task
48
+ # after 'rollbar:deploy_started', 'rollbar:fail'
49
+ end
50
+
51
+ namespace :load do
52
+ task :defaults do
53
+ set :rollbar_user, (proc { fetch :local_user, ENV['USER'] || ENV['USERNAME'] })
54
+ set :rollbar_env, (proc { fetch :rails_env, 'production' })
55
+ set :rollbar_token, (proc {
56
+ abort 'Please specify the Rollbar access token, ' \
57
+ "set :rollbar_token, 'your token'"
58
+ })
59
+ set :rollbar_role, (proc { :app })
60
+ set :rollbar_revision, (proc { fetch :current_revision })
61
+ end
62
+ end
@@ -0,0 +1,166 @@
1
+ require 'rollbar/deploy'
2
+
3
+ module Rollbar
4
+ # Module containing the logic of Capistrano tasks for deploy tracking
5
+ module CapistranoTasks
6
+ class << self
7
+ def deploy_started(capistrano, logger, dry_run)
8
+ deploy_task(logger, :desc => 'Notifying Rollbar of deployment start') do
9
+ result = report_deploy_started(capistrano, dry_run)
10
+
11
+ debug_request_response(logger, result)
12
+
13
+ capistrano.set(:rollbar_deploy_id, 123) if dry_run
14
+
15
+ skip_in_dry_run(logger, dry_run) do
16
+ if result[:success] &&
17
+ (deploy_id = result[:data] &&
18
+ result[:data][:deploy_id])
19
+ capistrano.set :rollbar_deploy_id, deploy_id
20
+ else
21
+ message = format_message('Unable to report deploy to Rollbar',
22
+ result[:message])
23
+ log_error(logger, message)
24
+ end
25
+ end
26
+ end
27
+ end
28
+
29
+ def deploy_succeeded(capistrano, logger, dry_run)
30
+ deploy_update(
31
+ capistrano, logger, dry_run,
32
+ :desc => 'Setting deployment status to `succeeded` in Rollbar'
33
+ ) do
34
+ report_deploy_succeeded(capistrano, dry_run)
35
+ end
36
+ end
37
+
38
+ def deploy_failed(capistrano, logger, dry_run)
39
+ deploy_update(capistrano, logger, dry_run,
40
+ :desc => 'Setting deployment status to `failed` in Rollbar') do
41
+ report_deploy_failed(capistrano, dry_run)
42
+ end
43
+ end
44
+
45
+ private
46
+
47
+ def deploy_task(logger, opts = {})
48
+ capistrano_300_warning(logger)
49
+ logger.info opts[:desc] if opts[:desc]
50
+ yield
51
+ rescue StandardError => e
52
+ log_error logger, "Error reporting to Rollbar: #{e.inspect}"
53
+ end
54
+
55
+ def deploy_update(capistrano, logger, dry_run, opts = {})
56
+ deploy_task(logger, opts) do
57
+ depend_on_deploy_id(capistrano, logger) do
58
+ result = yield
59
+
60
+ debug_request_response(logger, result)
61
+
62
+ skip_in_dry_run(logger, dry_run) do
63
+ if result[:success]
64
+ logger.info 'Updated deploy status in Rollbar'
65
+ else
66
+ message = format_message('Unable to update deploy status in Rollbar',
67
+ result[:message])
68
+ log_error(logger, message)
69
+ end
70
+ end
71
+ end
72
+ end
73
+ end
74
+
75
+ def capistrano_300_warning(logger)
76
+ unless ::Capistrano.const_defined?('VERSION') && ::Capistrano::VERSION =~ /^3\.0/
77
+ return
78
+ end
79
+
80
+ logger.warn('You need to upgrade capistrano to >= 3.1 version in order'\
81
+ 'to correctly report deploys to Rollbar. (On 3.0, the reported revision'\
82
+ 'will be incorrect.)')
83
+ end
84
+
85
+ def report_deploy_started(capistrano, dry_run)
86
+ ::Rollbar::Deploy.report(
87
+ {
88
+ :rollbar_username => capistrano.fetch(:rollbar_user),
89
+ :local_username => capistrano.fetch(:rollbar_user),
90
+ :comment => capistrano.fetch(:rollbar_comment),
91
+ :status => :started,
92
+ :proxy => :ENV,
93
+ :dry_run => dry_run
94
+ },
95
+ capistrano.fetch(:rollbar_token),
96
+ capistrano.fetch(:rollbar_env),
97
+ capistrano.fetch(:rollbar_revision)
98
+ )
99
+ end
100
+
101
+ def report_deploy_succeeded(capistrano, dry_run)
102
+ ::Rollbar::Deploy.update(
103
+ {
104
+ :comment => capistrano.fetch(:rollbar_comment),
105
+ :proxy => :ENV,
106
+ :dry_run => dry_run
107
+ },
108
+ capistrano.fetch(:rollbar_token),
109
+ capistrano.fetch(:rollbar_deploy_id),
110
+ :succeeded
111
+ )
112
+ end
113
+
114
+ def report_deploy_failed(capistrano, dry_run)
115
+ ::Rollbar::Deploy.update(
116
+ {
117
+ :comment => capistrano.fetch(:rollbar_comment),
118
+ :proxy => :ENV,
119
+ :dry_run => dry_run
120
+ },
121
+ capistrano.fetch(:rollbar_token),
122
+ capistrano.fetch(:rollbar_deploy_id),
123
+ :failed
124
+ )
125
+ end
126
+
127
+ def depend_on_deploy_id(capistrano, logger)
128
+ if capistrano.fetch(:rollbar_deploy_id)
129
+ yield
130
+ else
131
+ log_error logger,
132
+ 'Failed to update the deploy in Rollbar. No deploy id available.'
133
+ end
134
+ end
135
+
136
+ def skip_in_dry_run(logger, dry_run)
137
+ if dry_run
138
+ logger.info 'Skipping sending HTTP requests to Rollbar in dry run.'
139
+ else
140
+ yield
141
+ end
142
+ end
143
+
144
+ def debug_request_response(logger, result)
145
+ # NOTE: in Capistrano debug messages go to log/capistrano.log but not to
146
+ # stdout even if log_level == :debug
147
+ logger.debug result[:request_info]
148
+ logger.debug result[:response_info] if result[:response_info]
149
+ end
150
+
151
+ def format_message(*args)
152
+ args.compact.join(': ')
153
+ end
154
+
155
+ def log_error(logger, message)
156
+ # Capistrano 2.x doesn't have the #error method,
157
+ # so we use #important if #error isn't present
158
+ if logger.respond_to?(:error)
159
+ logger.error message
160
+ elsif logger.respond_to?(:important)
161
+ logger.important message
162
+ end
163
+ end
164
+ end
165
+ end
166
+ end