bugsnag-capistrano 1.1.2 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA256:
3
- metadata.gz: f6f524f128bab3669bce3a96d112179743da22a18f4d44d428f7ac745714b051
4
- data.tar.gz: 7f60bb949db8f888a5567220a31b9fd90bc4ff18861076e7f89e4f399c37427a
2
+ SHA1:
3
+ metadata.gz: d7777843eff43a04d774d3bdee4d5a88dd73d6b1
4
+ data.tar.gz: 8289fc24a6372a988304b5195458c4d5552e06db
5
5
  SHA512:
6
- metadata.gz: 192f1dbb3273b4861004b49168b1ac11132c2b99fc1adc4114790ff31408581d5efa8d4e029c839869fd690019f61957a04e84679bed57598172af2d8bf4d287
7
- data.tar.gz: e56422aa7e466ca375bb906a48606c40084de29bd8f54abe2b84a2091c41724dafc73fea00d0efbe7f1f3955966311c9c882a419e51f495971c400cea20a1fc8
6
+ metadata.gz: 7aba8fdb6fa4637c860f7648d418bc94c65252b900ff780828389572df7b81bdb82a6de1ed29e6cc7f2f5500ce5b5fe2fd0e5971dbec077e919839a50e7e80e7
7
+ data.tar.gz: 30486a327c9896b6a0d0bb2756f2e35a3e2787cf33a311d5db8f44d6b57358e6a0bd448b3f369bedb47ab6020c470e274c3287c774f30dda88e26529a97bf7ad
@@ -1,9 +1,11 @@
1
- ## 1.1.2 (06-06-2018)
1
+ ## 2.0.0 (03-04-2018)
2
2
 
3
- ### Fixes
3
+ Major changes have been made with the 2.0.0 release. For a full list please consult the [upgrading guide](https://github.com/bugsnag/bugsnag-capistrano/blob/master/UPGRADING.md).
4
+
5
+ ### Enhancements
4
6
 
5
- * Fixes a case where deployment notifications were delivered to an incorrect
6
- endpoint, causing them to not appear on the dashboard timeline
7
+ * Rewritten tool to notify [Bugsnag Build API](https://docs.bugsnag.com/build-integrations/)
8
+ | [#13](https://github.com/bugsnag/bugsnag-capistrano/pull/13)
7
9
 
8
10
  ## 1.1.1 (14-12-2017)
9
11
 
data/Gemfile CHANGED
@@ -10,8 +10,4 @@ group :test, optional: true do
10
10
  gem 'capistrano', ENV['CAP_2_TEST'] == 'true' ? '~> 2.15.0': '~> 3.9.0'
11
11
  end
12
12
 
13
- group :bugsnag, optional: true do
14
- gem 'bugsnag', '~> 6.0'
15
- end
16
-
17
13
  gemspec
data/README.md CHANGED
@@ -16,8 +16,7 @@ capturing exceptions from your applications.
16
16
 
17
17
  ## Getting started
18
18
 
19
- * [Integrating with Capistrano](https://docs.bugsnag.com/api/deploy-tracking/capistrano/)
20
- * [Integrating with Rake](https://docs.bugsnag.com/api/deploy-tracking/rake/)
19
+ * [Integrating with Capistrano](https://docs.bugsnag.com/build-integrations/capistrano/)
21
20
 
22
21
  ## Contributing
23
22
 
data/Rakefile CHANGED
@@ -25,14 +25,7 @@ end
25
25
  require 'rspec/core'
26
26
  require "rspec/core/rake_task"
27
27
 
28
- tags = '--format documentation --tag always '
29
-
30
- begin
31
- require 'bugsnag'
32
- tags += '--tag with_notifier '
33
- rescue LoadError
34
- tags += '--tag without_notifier '
35
- end
28
+ tags = '--format documentation'
36
29
 
37
30
  RSpec::Core::RakeTask.new(:spec) do |opts|
38
31
  opts.rspec_opts = tags
@@ -0,0 +1,27 @@
1
+ # Upgrade Guide
2
+
3
+ ## 1.x to 2.x
4
+
5
+ _Our Capistrano build-integration has changed to accommodate changes to our [Build API](https://docs.bugsnag.com/build-integrations/), and there may be changes required to continue to notify of your Capistrano releases_
6
+
7
+ #### Heroku
8
+
9
+ Heroku deployment notifications have been removed from this gem. You can find information on how to set up a Heroku deploy hook at [our documentation](https://docs.bugsnag.com/build-integrations/heroku/).
10
+
11
+ #### Rake
12
+
13
+ Rake deployment notifications have been removed from this gem. While we don't have an explicit replacement for the Rake tasks, information on how to send a build notification can be found in [our Build API documentation](https://docs.bugsnag.com/build-integrations/).
14
+
15
+ #### Task names
16
+
17
+ The task `:deploy` has been renamed to `:release`. Any references to it should be renamed accordingly.
18
+
19
+ #### Configuration
20
+
21
+ - `branch` has been removed.
22
+ - `bugsnag_builder` has been added. This should be the name of the person or machine that has triggered the release. Can also be set using the environment variables `BUGSNAG_BUILDER_NAME` or `USER`. Will default to the result of the `whoami` command on the releasing machine.
23
+ - `bugsnag_auto_assign_release` has been added. Thi#s will ensure **all** event notifications received will be assigned to this release. This should only be used if you are not using the `app_version` configuration option within your application. Can be set using the environment variable `BUGSNAG_AUTO_ASSIGN_RELEASE`. Will default to `false`.
24
+ - `bugsnag_source_control_provider` has been added. This contains the type of on-premise server the application uses for source-control, and therefore should only be used if an on-premise source-control solution is used. Valid settings are: `github-enterprise`, `gitlab-onpremise`, and `bitbucket-server`. Can be set using the environment variable `BUGSNAG_SOURCE_CONTROL_PROVIDER`. Defaults to `nil`.
25
+ - `bugsnag-metadata` has been added. This should be a hash containing any additional data you wish to attach to your release notification.
26
+
27
+ A full list of configuration options can be found at the [Capistrano build-integration guide](https://docs.bugsnag.com/build-integrations/capistrano/).
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.1.2
1
+ 2.0.0
@@ -1,4 +1,4 @@
1
- require_relative "deploy"
1
+ require_relative "release"
2
2
 
3
3
  if defined?(Capistrano::VERSION) && Gem::Version.new(Capistrano::VERSION).release >= Gem::Version.new('3.0.0')
4
4
  load File.expand_path('../tasks/bugsnag.cap', __FILE__)
@@ -2,25 +2,28 @@ module Bugsnag
2
2
  module Capistrano
3
3
  def self.load_into(configuration)
4
4
  configuration.load do
5
- after "deploy", "bugsnag:deploy"
6
- after "deploy:migrations", "bugsnag:deploy"
5
+ after "deploy", "bugsnag:release"
7
6
 
8
7
  namespace :bugsnag do
9
- desc "Notify Bugsnag that new production code has been deployed"
10
- task :deploy, :except => { :no_release => true }, :on_error => :continue do
8
+ desc "Notify Bugsnag that new production code has been released"
9
+ task :release, :except => { :no_release => true }, :on_error => :continue do
11
10
  begin
12
- Bugsnag::Capistrano::Deploy.notify({
11
+ auto_assign_release_bool = ENV["BUGSNAG_AUTO_ASSIGN_RELEASE"] == 'true'
12
+ Bugsnag::Capistrano::Release.notify({
13
13
  :api_key => fetch(:bugsnag_api_key, ENV["BUGSNAG_API_KEY"]),
14
+ :app_version => fetch(:app_version, ENV["BUGSNAG_APP_VERSION"]),
15
+ :auto_assign_release => fetch(:bugsnag_auto_assign_release, auto_assign_release_bool),
16
+ :builder_name => fetch(:bugsnag_builder, ENV["BUGSNAG_BUILDER_NAME"] || ENV["USER"]),
17
+ :metadata => fetch(:bugsnag_metadata, nil),
14
18
  :release_stage => fetch(:bugsnag_env) || ENV["BUGSNAG_RELEASE_STAGE"] || fetch(:rails_env) || fetch(:stage) || "production",
15
19
  :revision => fetch(:current_revision, ENV["BUGSNAG_REVISION"]),
16
20
  :repository => fetch(:repo_url, ENV["BUGSNAG_REPOSITORY"]),
17
- :branch => fetch(:branch, ENV["BUGSNAG_BRANCH"]),
18
- :app_version => fetch(:app_version, ENV["BUGSNAG_APP_VERSION"]),
19
- :endpoint => fetch(:bugsnag_endpoint)
21
+ :source_control_provider => fetch(:bugsnag_source_control_provider, ENV["BUGSNAG_SOURCE_CONTROL_PROVIDER"]),
22
+ :endpoint => fetch(:bugsnag_endpoint, nil)
20
23
  })
21
- logger.info "Bugsnag deploy notification complete."
24
+ logger.info "Bugsnag release notification complete."
22
25
  rescue
23
- logger.important("Bugnsag deploy notification failed, #{$!.inspect}")
26
+ logger.important("Bugsnag release notification failed, #{$!.inspect}")
24
27
  end
25
28
  end
26
29
  end
@@ -0,0 +1,85 @@
1
+ require "json"
2
+ require "net/http"
3
+ require "logger"
4
+
5
+ module Bugsnag
6
+ module Capistrano
7
+ class Release
8
+
9
+ HEADERS = {"Content-Type" => "application/json"}
10
+ DEFAULT_BUILD_ENDPOINT = "https://build.bugsnag.com/"
11
+ DEFAULT_BUILD_TOOL_NAME = "bugsnag-capistrano"
12
+
13
+ def self.notify(opts = {})
14
+ # Try and get some config from Bugsnag
15
+ begin
16
+ require 'bugsnag'
17
+
18
+ opts[:api_key] ||= Bugsnag.configuration.api_key
19
+ opts[:app_version] ||= Bugsnag.configuration.app_version
20
+ opts[:release_stage] ||= Bugsnag.configuration.release_stage
21
+ rescue LoadError
22
+ end
23
+
24
+ opts[:endpoint] ||= DEFAULT_BUILD_ENDPOINT
25
+ opts[:builder_name] ||= `whoami`
26
+ opts[:build_tool] ||= DEFAULT_BUILD_TOOL_NAME
27
+
28
+ parameters = {
29
+ "apiKey" => opts[:api_key],
30
+ "appVersion" => opts[:app_version],
31
+ "autoAssignRelease" => opts[:auto_assign_release],
32
+ "builderName" => opts[:builder_name],
33
+ "buildTool" => opts[:build_tool],
34
+ "metadata" => opts[:metadata],
35
+ "releaseStage" => opts[:release_stage],
36
+ "sourceControl" => {
37
+ "provider" => opts[:source_control_provider],
38
+ "revision" => opts[:revision],
39
+ "repository" => opts[:repository]
40
+ }
41
+ }
42
+
43
+ if parameters["apiKey"].nil?
44
+ logger.warn("Cannot deliver notification. Missing required apiKey")
45
+ elsif parameters["appVersion"].nil?
46
+ logger.warn("Cannot deliver notification. Missing required appVersion")
47
+ else
48
+ payload_string = ::JSON.dump(parameters)
49
+ self.deliver(opts[:endpoint], payload_string)
50
+ end
51
+ end
52
+
53
+ def self.deliver(url, body)
54
+ begin
55
+ request(url, body)
56
+ rescue StandardError => e
57
+ logger.warn("Notification to #{url} failed, #{e.inspect}")
58
+ logger.warn(e.backtrace)
59
+ end
60
+ end
61
+
62
+ def self.request(url, body)
63
+ uri = URI.parse(url)
64
+ http = Net::HTTP.new(uri.host, uri.port)
65
+ http.read_timeout = 15
66
+ http.open_timeout = 15
67
+
68
+ http.use_ssl = uri.scheme == "https"
69
+
70
+ uri.path == "" ? "/" : uri.path
71
+ request = Net::HTTP::Post.new(uri, HEADERS)
72
+ request.body = body
73
+ http.request(request)
74
+ end
75
+
76
+ def self.logger
77
+ if @logger.nil?
78
+ @logger = Logger.new(STDOUT)
79
+ @logger.level = Logger::INFO
80
+ end
81
+ @logger
82
+ end
83
+ end
84
+ end
85
+ end
@@ -1,46 +1,42 @@
1
1
  namespace :load do
2
-
3
2
  task :defaults do
4
-
5
3
  set :bugsnag_default_hooks, ->{ true }
6
-
7
4
  end
8
-
9
5
  end
10
6
 
11
7
  namespace :deploy do
12
-
13
8
  before :starting, :bugsnag_hooks do
14
9
  invoke 'bugsnag:add_default_hooks' if fetch(:bugsnag_default_hooks)
15
10
  end
16
-
17
11
  end
18
12
 
19
13
  namespace :bugsnag do
20
-
21
14
  task :add_default_hooks do
22
- after 'deploy:published', 'bugsnag:deploy'
15
+ after 'deploy:published', 'bugsnag:release'
23
16
  end
24
17
 
25
- desc 'Notify Bugsnag that new production code has been deployed'
26
- task :deploy do
18
+ desc 'Notify Bugsnag that new production code has been released'
19
+ task :release do
27
20
  run_locally do
28
21
  begin
29
- Bugsnag::Capistrano::Deploy.notify({
22
+ auto_assign_release_bool = ENV["BUGSNAG_AUTO_ASSIGN_RELEASE"] == 'true'
23
+ Bugsnag::Capistrano::Release.notify({
30
24
  :api_key => fetch(:bugsnag_api_key, ENV["BUGSNAG_API_KEY"]),
25
+ :app_version => fetch(:app_version, ENV["BUGSNAG_APP_VERSION"]),
26
+ :auto_assign_release => fetch(:bugsnag_auto_assign_release, auto_assign_release_bool),
27
+ :builder_name => fetch(:bugsnag_builder, ENV["BUGSNAG_BUILDER_NAME"] || ENV["USER"]),
28
+ :metadata => fetch(:bugsnag_metadata),
31
29
  :release_stage => fetch(:bugsnag_env) || ENV["BUGSNAG_RELEASE_STAGE"] || fetch(:rails_env) || fetch(:stage) || "production",
32
30
  :revision => fetch(:current_revision, ENV["BUGSNAG_REVISION"]),
33
31
  :repository => fetch(:repo_url, ENV["BUGSNAG_REPOSITORY"]),
34
- :branch => fetch(:branch, ENV["BUGSNAG_BRANCH"]),
35
- :app_version => fetch(:app_version, ENV["BUGSNAG_APP_VERSION"]),
32
+ :source_control_provider => fetch(:bugsnag_source_control_provider, ENV["BUGSNAG_SOURCE_CONTROL_PROVIDER"]),
36
33
  :endpoint => fetch(:bugsnag_endpoint)
37
34
  })
38
- info 'Bugsnag deploy notification complete.'
35
+ info 'Bugsnag release notification complete.'
39
36
  rescue
40
- error "Bugsnag deploy notification failed, #{$!.inspect}"
37
+ error "Bugsnag release notification failed, #{$!.inspect}"
41
38
  end
42
39
  end
43
40
  end
44
-
45
41
  end
46
42
  # vi:ft=ruby
@@ -4,7 +4,7 @@ require 'rspec/mocks'
4
4
 
5
5
  require 'webrick'
6
6
 
7
- describe "bugsnag capistrano", :always do
7
+ describe "bugsnag capistrano" do
8
8
 
9
9
  server = nil
10
10
  queue = Queue.new
@@ -29,16 +29,18 @@ describe "bugsnag capistrano", :always do
29
29
  end
30
30
 
31
31
  let(:request) { JSON.parse(queue.pop) }
32
-
32
+
33
33
  it "sends a deploy notification to the set endpoint" do
34
34
  ENV['BUGSNAG_ENDPOINT'] = "http://localhost:" + server.config[:Port].to_s + "/deploy"
35
-
35
+ ENV['BUGSNAG_APP_VERSION'] = "1"
36
+
36
37
  Dir.chdir(example_path) do
37
38
  system(exec_string)
38
39
  end
39
40
 
40
41
  payload = request()
41
42
  expect(payload["apiKey"]).to eq('YOUR_API_KEY')
43
+ expect(payload["appVersion"]).to eq("1")
42
44
  expect(payload["releaseStage"]).to eq('production')
43
45
  end
44
46
 
@@ -49,6 +51,8 @@ describe "bugsnag capistrano", :always do
49
51
  ENV['BUGSNAG_REVISION'] = "test"
50
52
  ENV['BUGSNAG_APP_VERSION'] = "1"
51
53
  ENV['BUGSNAG_REPOSITORY'] = "test@repo.com:test/test_repo.git"
54
+ ENV['BUGSNAG_SOURCE_CONTROL_PROVIDER'] = "github"
55
+ ENV['BUGSNAG_AUTO_ASSIGN_RELEASE'] = 'true'
52
56
 
53
57
  Dir.chdir(example_path) do
54
58
  system(exec_string)
@@ -57,9 +61,12 @@ describe "bugsnag capistrano", :always do
57
61
  payload = request()
58
62
  expect(payload["apiKey"]).to eq('this is a test key')
59
63
  expect(payload["releaseStage"]).to eq('test')
60
- expect(payload["repository"]).to eq("test@repo.com:test/test_repo.git")
61
64
  expect(payload["appVersion"]).to eq("1")
62
- expect(payload["revision"]).to eq("test")
65
+ expect(payload["sourceControl"]).to_not be_nil
66
+ expect(payload["sourceControl"]["revision"]).to eq("test")
67
+ expect(payload["sourceControl"]["repository"]).to eq("test@repo.com:test/test_repo.git")
68
+ expect(payload["sourceControl"]["provider"]).to eq("github")
69
+ expect(payload["autoAssignRelease"]).to eq(true)
63
70
  end
64
71
  end
65
72
 
@@ -0,0 +1,96 @@
1
+ require 'webmock/rspec'
2
+ require 'rspec/expectations'
3
+ require 'rspec/mocks'
4
+ require 'logger'
5
+ require 'json'
6
+
7
+ require 'webrick'
8
+
9
+ require 'bugsnag-capistrano/release'
10
+
11
+ module Bugsnag::Capistrano
12
+ class Release
13
+ attr_accessor :logger
14
+ end
15
+ end
16
+
17
+ describe Bugsnag::Capistrano::Release do
18
+ it "should call notify_without bugsnag" do
19
+ expect(Bugsnag::Capistrano::Release).to receive(:deliver)
20
+ Bugsnag::Capistrano::Release.notify({:api_key => "test", :app_version => "1"})
21
+ end
22
+
23
+ it "delivers a request to the given url" do
24
+ url = "http://localhost:56456"
25
+ stub_request(:post, url)
26
+ .to_return(status:200, body: "")
27
+ Bugsnag::Capistrano::Release.deliver(url, nil)
28
+ end
29
+
30
+ it "delivers a body unmodified" do
31
+ body = ::JSON.dump({
32
+ "paramA" => 'a',
33
+ "paramB" => 'b',
34
+ "paramHash" => {
35
+ "one" => 1,
36
+ "two" => 2,
37
+ "three" => 3
38
+ }
39
+ })
40
+ url = "http://localhost:56456"
41
+ request = stub_request(:post, url)
42
+ .with(body: body, headers: { 'Content-Type' => 'application/json'})
43
+ .to_return(status:200, body: "")
44
+ Bugsnag::Capistrano::Release.deliver(url, body)
45
+ assert_requested request
46
+ end
47
+
48
+ it "cannot send without an apikey" do
49
+ expect(Bugsnag::Capistrano::Release).to_not receive(:deliver)
50
+ expect(Bugsnag::Capistrano::Release.logger).to receive(:warn).with("Cannot deliver notification. Missing required apiKey")
51
+
52
+ Bugsnag::Capistrano::Release.notify()
53
+ end
54
+
55
+ it "cannot send without an appVersion" do
56
+ expect(Bugsnag::Capistrano::Release).to_not receive(:deliver)
57
+ expect(Bugsnag::Capistrano::Release.logger).to receive(:warn).with("Cannot deliver notification. Missing required appVersion")
58
+
59
+ Bugsnag::Capistrano::Release.notify({:api_key => "test"})
60
+ end
61
+
62
+ context "with bugsnag installed" do
63
+ before do
64
+ module Kernel
65
+ alias_method :old_require, :require
66
+ def require(path)
67
+ old_require(path) unless /^bugsnag/.match(path)
68
+ end
69
+ end
70
+ end
71
+
72
+ it "gets information from bugsnag configuration if available" do
73
+ config = double
74
+ allow(config).to receive(:api_key).and_return("bugsnag_api_key")
75
+ allow(config).to receive(:app_version).and_return("bugsnag_app_version")
76
+ allow(config).to receive(:release_stage).and_return("bugsnag_release_stage")
77
+
78
+ allow(Bugsnag).to receive(:configuration).and_return(config)
79
+ expect(Bugsnag::Capistrano::Release).to receive(:deliver) do |uri, body_string|
80
+ expect(uri).to eq(Bugsnag::Capistrano::Release::DEFAULT_BUILD_ENDPOINT)
81
+ body = ::JSON.parse(body_string)
82
+ expect(body["apiKey"]).to eq("bugsnag_api_key")
83
+ expect(body["appVersion"]).to eq("bugsnag_app_version")
84
+ expect(body["releaseStage"]).to eq("bugsnag_release_stage")
85
+ end
86
+
87
+ Bugsnag::Capistrano::Release.notify()
88
+ end
89
+
90
+ after do
91
+ module Kernel
92
+ alias_method :require, :old_require
93
+ end
94
+ end
95
+ end
96
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bugsnag-capistrano
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.2
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Keegan Lowenstein
@@ -11,7 +11,7 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2018-06-06 00:00:00.000000000 Z
14
+ date: 2018-04-03 00:00:00.000000000 Z
15
15
  dependencies: []
16
16
  description: Correlate Capistrano deploys with new errors and increased error rates
17
17
  in Bugsnag
@@ -31,18 +31,16 @@ files:
31
31
  - LICENSE.txt
32
32
  - README.md
33
33
  - Rakefile
34
+ - UPGRADING.md
34
35
  - VERSION
35
36
  - bugsnag-capistrano.gemspec
36
37
  - lib/bugsnag-capistrano.rb
37
38
  - lib/bugsnag-capistrano/capistrano.rb
38
39
  - lib/bugsnag-capistrano/capistrano2.rb
39
- - lib/bugsnag-capistrano/deploy.rb
40
- - lib/bugsnag-capistrano/tasks.rb
41
- - lib/bugsnag-capistrano/tasks/bugsnag-capistrano.rake
40
+ - lib/bugsnag-capistrano/release.rb
42
41
  - lib/bugsnag-capistrano/tasks/bugsnag.cap
43
42
  - spec/capistrano_spec.rb
44
- - spec/deploy_spec.rb
45
- - spec/rake_spec.rb
43
+ - spec/release_spec.rb
46
44
  homepage: http://github.com/bugsnag/bugsnag-capistrano
47
45
  licenses:
48
46
  - MIT
@@ -63,7 +61,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
63
61
  version: '0'
64
62
  requirements: []
65
63
  rubyforge_project:
66
- rubygems_version: 2.7.7
64
+ rubygems_version: 2.6.11
67
65
  signing_key:
68
66
  specification_version: 4
69
67
  summary: Notify Bugsnag when deploying with Capistrano
@@ -1,98 +0,0 @@
1
- require "json"
2
- require "net/http"
3
- require "logger"
4
-
5
- module Bugsnag
6
- module Capistrano
7
- class Deploy
8
-
9
- HEADERS = {"Content-Type" => "application/json"}
10
- DEFAULT_DEPLOY_ENDPOINT = "https://notify.bugsnag.com/deploy"
11
-
12
- def self.notify(opts = {})
13
- begin
14
- require 'bugsnag'
15
- self.notify_using_bugsnag(opts)
16
- rescue LoadError
17
- self.notify_without_bugsnag(opts)
18
- end
19
- end
20
-
21
- def self.notify_using_bugsnag(opts = {})
22
-
23
- configuration = Bugsnag.configuration.dup
24
-
25
- [:api_key, :app_version, :release_stage, :endpoint, :use_ssl,
26
- :proxy_host, :proxy_port, :proxy_user, :proxy_password].each do |param|
27
- unless opts[param].nil?
28
- configuration.send :"#{param}=", opts[param]
29
- end
30
- end
31
-
32
- if Gem::Version.new(Bugsnag::VERSION).release >= Gem::Version.new('6.0.0')
33
- endpoint = configuration.endpoint + '/deploy'
34
- else
35
- endpoint = (configuration.use_ssl ? "https://" : "http://") + configuration.endpoint + '/deploy'
36
- end
37
-
38
- parameters = {
39
- "apiKey" => configuration.api_key,
40
- "releaseStage" => configuration.release_stage,
41
- "appVersion" => configuration.app_version,
42
- "revision" => opts[:revision],
43
- "repository" => opts[:repository],
44
- "branch" => opts[:branch]
45
- }.reject {|k,v| v == nil}
46
-
47
- raise RuntimeError.new("No API key found when notifying of deploy") if !parameters["apiKey"] || parameters["apiKey"].empty?
48
-
49
-
50
- payload_string = ::JSON.dump(parameters)
51
- Bugsnag::Delivery::Synchronous.deliver(endpoint, payload_string, configuration)
52
- end
53
-
54
- def self.notify_without_bugsnag(opts = {})
55
- endpoint = (opts[:endpoint].nil? ? DEFAULT_DEPLOY_ENDPOINT : opts[:endpoint])
56
-
57
- parameters = {
58
- "apiKey" => opts[:api_key],
59
- "releaseStage" => opts[:release_stage],
60
- "appVersion" => opts[:app_version],
61
- "revision" => opts[:revision],
62
- "repository" => opts[:repository],
63
- "branch" => opts[:branch]
64
- }.reject {|k, v| v == nil}
65
-
66
- raise RuntimeError.new("No API key found when notifying of deploy") if !parameters["apiKey"] || parameters["apiKey"].empty?
67
-
68
- payload_string = ::JSON.dump(parameters)
69
- self.deliver(endpoint, payload_string)
70
- end
71
-
72
- def self.deliver(url, body)
73
- logger = Logger.new(STDOUT)
74
- logger.level = Logger::INFO
75
- begin
76
- request(url, body)
77
- rescue StandardError => e
78
- logger.warn("Notification to #{url} failed, #{e.inspect}")
79
- logger.warn(e.backtrace)
80
- end
81
- end
82
-
83
- def self.request(url, body)
84
- uri = URI.parse(url)
85
- http = Net::HTTP.new(uri.host, uri.port)
86
- http.read_timeout = 15
87
- http.open_timeout = 15
88
-
89
- http.use_ssl = uri.scheme == "https"
90
-
91
- uri.path == "" ? "/" : uri.path
92
- request = Net::HTTP::Post.new(uri, HEADERS)
93
- request.body = body
94
- http.request(request)
95
- end
96
- end
97
- end
98
- end
@@ -1,2 +0,0 @@
1
- require_relative 'deploy'
2
- load File.join(File.dirname(File.expand_path(__FILE__)), 'tasks/bugsnag-capistrano.rake')
@@ -1,85 +0,0 @@
1
- require "bugsnag-capistrano/deploy"
2
-
3
- namespace :bugsnag do
4
-
5
- desc "Notify Bugsnag of a new deploy."
6
- task :deploy do
7
- api_key = ENV["BUGSNAG_API_KEY"]
8
- release_stage = ENV["BUGSNAG_RELEASE_STAGE"]
9
- app_version = ENV["BUGSNAG_APP_VERSION"]
10
- revision = ENV["BUGSNAG_REVISION"]
11
- repository = ENV["BUGSNAG_REPOSITORY"]
12
- branch = ENV["BUGSNAG_BRANCH"]
13
- endpoint = ENV["BUGSNAG_ENDPOINT"]
14
-
15
- Rake::Task["load"].invoke unless api_key
16
-
17
- Bugsnag::Capistrano::Deploy.notify({
18
- :api_key => api_key,
19
- :release_stage => release_stage,
20
- :app_version => app_version,
21
- :revision => revision,
22
- :repository => repository,
23
- :branch => branch,
24
- :endpoint => endpoint,
25
- })
26
- end
27
-
28
- namespace :heroku do
29
- desc "Add a heroku deploy hook to notify Bugsnag of deploys"
30
- task :add_deploy_hook => :load do
31
- # Wrapper to run command safely even in bundler
32
- run_command = lambda { |command|
33
- defined?(Bundler.with_clean_env) ? Bundler.with_clean_env { `#{command}` } : `#{command}`
34
- }
35
-
36
- # Fetch heroku config settings
37
- config_command = "heroku config --shell"
38
- config_command += " --app #{ENV["HEROKU_APP"]}" if ENV["HEROKU_APP"]
39
- heroku_env = run_command.call(config_command).split(/[\n\r]/).each_with_object({}) do |c, obj|
40
- k,v = c.split("=")
41
- obj[k] = (v.nil? || v.strip.empty?) ? nil : v
42
- end
43
-
44
- # Check for Bugsnag API key (required) using Bugsnag configuration only if available
45
- begin
46
- require 'bugsnag'
47
- api_key = heroku_env["BUGSNAG_API_KEY"] || Bugsnag.configuration.api_key || ENV["BUGSNAG_API_KEY"]
48
- rescue LoadError
49
- api_key = heroku_env["BUGSNAG_API_KEY"] || ENV["BUGSNAG_API_KEY"]
50
- end
51
-
52
- unless api_key
53
- puts "Error: No API key found, have you run 'heroku config:set BUGSNAG_API_KEY=your-api-key'?"
54
- next
55
- end
56
-
57
- # Build the request, making use of deploy hook variables
58
- # (https://devcenter.heroku.com/articles/deploy-hooks#customizing-messages)
59
- params = {
60
- :apiKey => api_key,
61
- :branch => "master",
62
- :revision => "{{head_long}}",
63
- :releaseStage => heroku_env["BUGSNAG_RELEASE_STAGE"] || heroku_env["RAILS_ENV"] || ENV["RAILS_ENV"] || "production"
64
- }
65
- repo = `git config --get remote.origin.url`.strip
66
- params[:repository] = repo unless repo.empty?
67
-
68
- # Add the hook
69
- url = "https://notify.bugsnag.com/deploy?" + params.map {|k,v| "#{k}=#{v}"}.join("&")
70
- command = "heroku addons:add deployhooks:http --url=\"#{url}\""
71
- command += " --app #{ENV["HEROKU_APP"]}" if ENV["HEROKU_APP"]
72
-
73
- puts "$ #{command}"
74
- run_command.call(command)
75
- end
76
- end
77
-
78
- end
79
-
80
- task :load do
81
- begin
82
- Rake::Task["environment"].invoke
83
- rescue
84
- end
85
- end
@@ -1,97 +0,0 @@
1
- require 'webmock/rspec'
2
- require 'rspec/expectations'
3
- require 'rspec/mocks'
4
- require 'logger'
5
- require 'json'
6
-
7
- require 'webrick'
8
-
9
- require 'bugsnag-capistrano/deploy'
10
-
11
- describe Bugsnag::Capistrano::Deploy do
12
- describe "with notifier loadable", :with_notifier do
13
-
14
- before do
15
- require "bugsnag"
16
- Bugsnag.configure do |config|
17
- config.api_key = "TEST_API_KEY"
18
- config.release_stage = "production"
19
- config.logger = Logger.new(StringIO.new)
20
- end
21
- end
22
-
23
- after do
24
- Bugsnag.configuration.clear_request_data
25
- end
26
-
27
- it "should call notify_with_bugsnag" do
28
- expect(Bugsnag::Delivery::Synchronous).to receive(:deliver).with(
29
- "https://notify.bugsnag.com/deploy",
30
- "{\"apiKey\":\"TEST_API_KEY\",\"releaseStage\":\"production\"}",
31
- instance_of(Bugsnag::Configuration)
32
- )
33
- Bugsnag::Capistrano::Deploy.notify()
34
- end
35
-
36
- context "provide custom endpoint" do
37
- before do
38
- Bugsnag.configure do |config|
39
- config.endpoint = "http://localhost:56302"
40
- end
41
- end
42
-
43
- after do
44
- Bugsnag.configure do |config|
45
- config.endpoint = nil
46
- end
47
- end
48
-
49
- it "uses the custom endpoint" do
50
- expect(Bugsnag::Delivery::Synchronous).to receive(:deliver).with(
51
- "http://localhost:56302/deploy",
52
- "{\"apiKey\":\"TEST_API_KEY\",\"releaseStage\":\"production\"}",
53
- instance_of(Bugsnag::Configuration)
54
- )
55
- Bugsnag::Capistrano::Deploy.notify()
56
- end
57
- end
58
- end
59
-
60
- describe "without notifier loadable", :without_notifier do
61
- it "should call notify_without bugsnag" do
62
- stub_request(:post, "https://notify.bugsnag.com/deploy").to_return(status:200, body: "")
63
- expect(Bugsnag::Capistrano::Deploy).to receive(:deliver).with(
64
- "https://notify.bugsnag.com/deploy",
65
- "{\"apiKey\":\"test\"}"
66
- )
67
- Bugsnag::Capistrano::Deploy.notify({:api_key => "test"})
68
- end
69
- end
70
-
71
- describe "the delivery function", :always do
72
- it "delivers a request to the given url" do
73
- url = "http://localhost:56456"
74
- stub_request(:post, url)
75
- .to_return(status:200, body: "")
76
- Bugsnag::Capistrano::Deploy.deliver(url, nil)
77
- end
78
-
79
- it "delivers a body unmodified" do
80
- body = ::JSON.dump({
81
- "paramA" => 'a',
82
- "paramB" => 'b',
83
- "paramHash" => {
84
- "one" => 1,
85
- "two" => 2,
86
- "three" => 3
87
- }
88
- })
89
- url = "http://localhost:56456"
90
- request = stub_request(:post, url)
91
- .with(body: body, headers: { 'Content-Type' => 'application/json'})
92
- .to_return(status:200, body: "")
93
- Bugsnag::Capistrano::Deploy.deliver(url, body)
94
- assert_requested request
95
- end
96
- end
97
- end
@@ -1,64 +0,0 @@
1
- require 'webmock/rspec'
2
- require 'rspec/expectations'
3
- require 'rspec/mocks'
4
-
5
- require 'webrick'
6
-
7
- describe "bugsnag rake", :always do
8
-
9
- server = nil
10
- queue = Queue.new
11
- fixture_path = '../examples/rake'
12
- exec_string = 'bundle exec rake bugsnag:deploy'
13
- example_path = File.join(File.dirname(__FILE__), fixture_path)
14
-
15
- before do
16
- server = WEBrick::HTTPServer.new :Port => 0, :Logger => WEBrick::Log.new(STDOUT), :AccessLog => []
17
- server.mount_proc '/deploy' do |req, res|
18
- queue.push req.body
19
- res.status = 200
20
- res.body = "OK\n"
21
- end
22
- Thread.new{ server.start }
23
- end
24
-
25
- after do
26
- server.stop
27
- queue.clear
28
- end
29
-
30
- let(:request) { JSON.parse(queue.pop) }
31
-
32
- it "sends a deploy notification to the set endpoint" do
33
- ENV['BUGSNAG_ENDPOINT'] = "http://localhost:" + server.config[:Port].to_s + "/deploy"
34
- ENV['BUGSNAG_API_KEY'] = "YOUR_API_KEY"
35
-
36
- Dir.chdir(example_path) do
37
- system(exec_string)
38
- end
39
-
40
- payload = request()
41
- expect(payload["apiKey"]).to eq('YOUR_API_KEY')
42
- end
43
-
44
- it "allows modifications of deployment characteristics" do
45
- ENV['BUGSNAG_ENDPOINT'] = "http://localhost:" + server.config[:Port].to_s + "/deploy"
46
- ENV['BUGSNAG_API_KEY'] = "this is a test key"
47
- ENV['BUGSNAG_RELEASE_STAGE'] = "test"
48
- ENV['BUGSNAG_REVISION'] = "test"
49
- ENV['BUGSNAG_APP_VERSION'] = "1"
50
- ENV['BUGSNAG_REPOSITORY'] = "test@repo.com:test/test_repo.git"
51
-
52
- Dir.chdir(example_path) do
53
- system(exec_string)
54
- end
55
-
56
- payload = request()
57
- expect(payload["apiKey"]).to eq('this is a test key')
58
- expect(payload["releaseStage"]).to eq('test')
59
- expect(payload["repository"]).to eq("test@repo.com:test/test_repo.git")
60
- expect(payload["appVersion"]).to eq("1")
61
- expect(payload["revision"]).to eq("test")
62
- end
63
- end
64
-