bugsnag-capistrano 1.0.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.
- checksums.yaml +7 -0
- data/.gitignore +52 -0
- data/.travis.yml +36 -0
- data/CHANGELOG.md +3 -0
- data/CONTRIBUTING.md +70 -0
- data/Gemfile +17 -0
- data/LICENSE.txt +20 -0
- data/README.md +48 -0
- data/Rakefile +40 -0
- data/VERSION +1 -0
- data/bugsnag-capistrano.gemspec +22 -0
- data/lib/bugsnag-capistrano.rb +1 -0
- data/lib/bugsnag-capistrano/capistrano.rb +7 -0
- data/lib/bugsnag-capistrano/capistrano2.rb +32 -0
- data/lib/bugsnag-capistrano/deploy.rb +97 -0
- data/lib/bugsnag-capistrano/tasks/bugsnag-capistrano.rake +33 -0
- data/lib/bugsnag-capistrano/tasks/bugsnag.cap +46 -0
- data/spec/capistrano_spec.rb +65 -0
- data/spec/deploy_spec.rb +66 -0
- metadata +68 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: e6326e309ec379b3386a4dfa4d7b8601dbfe9e12
|
4
|
+
data.tar.gz: 7514f4a2c7af3e3f5302395c143a1295ca94366d
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 4c82887b35306b8fdb478736ecee705b29786318a7a228d5aba24526aac4cf7dd2475a201565625d49e4827df12ce65a95839a52d292245d90e4960ea45b460c
|
7
|
+
data.tar.gz: b8aa67705bfa30e71170444a8dfbed54db1203b06eaf4c18f57be03ea37cc2989a2a57da49d79dfd57d37b9be0fd47567b1f3d2e3b1457ebfe37761ef1d75f01
|
data/.gitignore
ADDED
@@ -0,0 +1,52 @@
|
|
1
|
+
# rcov generated
|
2
|
+
coverage
|
3
|
+
|
4
|
+
# rdoc generated
|
5
|
+
rdoc
|
6
|
+
|
7
|
+
# yard generated
|
8
|
+
doc
|
9
|
+
.yardoc
|
10
|
+
|
11
|
+
# bundler
|
12
|
+
.bundle
|
13
|
+
Gemfile.lock
|
14
|
+
|
15
|
+
# jeweler generated
|
16
|
+
pkg
|
17
|
+
*.gem
|
18
|
+
|
19
|
+
vendor
|
20
|
+
# Have editor/IDE/OS specific files you need to ignore? Consider using a global gitignore:
|
21
|
+
#
|
22
|
+
# * Create a file at ~/.gitignore
|
23
|
+
# * Include files you want ignored
|
24
|
+
# * Run: git config --global core.excludesfile ~/.gitignore
|
25
|
+
#
|
26
|
+
# After doing this, these files will be ignored in all your git projects,
|
27
|
+
# saving you from having to 'pollute' every project you touch with them
|
28
|
+
#
|
29
|
+
# Not sure what to needs to be ignored for particular editors/OSes? Here's some ideas to get you started. (Remember, remove the leading # of the line)
|
30
|
+
#
|
31
|
+
# For MacOS:
|
32
|
+
#
|
33
|
+
#.DS_Store
|
34
|
+
|
35
|
+
# For TextMate
|
36
|
+
#*.tmproj
|
37
|
+
#tmtags
|
38
|
+
|
39
|
+
# For emacs:
|
40
|
+
#*~
|
41
|
+
#\#*
|
42
|
+
#.\#*
|
43
|
+
|
44
|
+
# For vim:
|
45
|
+
#*.swp
|
46
|
+
|
47
|
+
# For redcar:
|
48
|
+
#.redcar
|
49
|
+
|
50
|
+
# For rubinius:
|
51
|
+
#*.rbc
|
52
|
+
bin
|
data/.travis.yml
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
sudo: false
|
2
|
+
language: ruby
|
3
|
+
cache: bundler
|
4
|
+
rvm:
|
5
|
+
- 2.3.0
|
6
|
+
- 2.2.4
|
7
|
+
- 2.1.8
|
8
|
+
- 2.0.0
|
9
|
+
- 1.9.3
|
10
|
+
- jruby-19mode
|
11
|
+
|
12
|
+
before_install:
|
13
|
+
- gem update --system 2.1.11
|
14
|
+
- gem install bundler -v 1.12
|
15
|
+
- bundle --version
|
16
|
+
- gem --version
|
17
|
+
|
18
|
+
before_script:
|
19
|
+
- bundle list | grep 'bugsnag\|capistrano'
|
20
|
+
- bundle exec cap --version
|
21
|
+
script: bundle exec rake spec
|
22
|
+
|
23
|
+
jobs:
|
24
|
+
include:
|
25
|
+
- stage: test
|
26
|
+
env: CAP_2_TEST=true
|
27
|
+
install: bundle install --with test bugsnag
|
28
|
+
- stage: test
|
29
|
+
env: CAP_2_TEST=true
|
30
|
+
install: bundle install --with test --without bugsnag
|
31
|
+
- stage: test
|
32
|
+
env: CAP_2_TEST=false
|
33
|
+
install: bundle install --with test bugsnag
|
34
|
+
- stage: test
|
35
|
+
env: CAP_2_TEST=false
|
36
|
+
install: bundle install --with test --without bugsnag
|
data/CHANGELOG.md
ADDED
data/CONTRIBUTING.md
ADDED
@@ -0,0 +1,70 @@
|
|
1
|
+
# Contribution Guide
|
2
|
+
|
3
|
+
## Development Dependencies
|
4
|
+
|
5
|
+
Install dependencies for testing using bundler:
|
6
|
+
```shell
|
7
|
+
bundle install --with test
|
8
|
+
```
|
9
|
+
|
10
|
+
## Running the Tests
|
11
|
+
|
12
|
+
Run the tests using:
|
13
|
+
|
14
|
+
```shell
|
15
|
+
bundle exec rake
|
16
|
+
```
|
17
|
+
|
18
|
+
This tests Capistrano 3 functionality, without using Bugsnag to make the deployment call. To test Capistrano 2 functionality set the environment variable `CAP_2_TEST` to `true` and re-install and run the tests.
|
19
|
+
|
20
|
+
In order to test using the main Bugsnag notifier to send the deployment notification, include the group `bugsnag` in the install command:
|
21
|
+
```shell
|
22
|
+
bundle install --with test bugsnag
|
23
|
+
```
|
24
|
+
|
25
|
+
## Building/Running Example Apps
|
26
|
+
|
27
|
+
Instructions on running the example apps can be found within the `README.md` files within the respective folders.
|
28
|
+
|
29
|
+
## Submitting a Change
|
30
|
+
|
31
|
+
* [Fork](https://help.github.com/articles/fork-a-repo) the
|
32
|
+
[notifier on github](https://github.com/bugsnag/bugsnag-bugsnag-capistrano)
|
33
|
+
* Commit and push until you are happy with your contribution
|
34
|
+
* Run the tests with and ensure all pass
|
35
|
+
* [Submit a pull request](https://help.github.com/articles/using-pull-requests)
|
36
|
+
* Thank you!
|
37
|
+
|
38
|
+
----
|
39
|
+
|
40
|
+
## Release Guidelines
|
41
|
+
|
42
|
+
If you're a member of the core team, follow these instructions for releasing
|
43
|
+
bugsnag-capistrano.
|
44
|
+
|
45
|
+
### Every time
|
46
|
+
|
47
|
+
* Compile new features, enhancements, and fixes into the CHANGELOG.
|
48
|
+
* Update the project version using [semantic versioning](http://semver.org).
|
49
|
+
Specifically:
|
50
|
+
|
51
|
+
> Given a version number MAJOR.MINOR.PATCH, increment the:
|
52
|
+
>
|
53
|
+
> 1. MAJOR version when you make incompatible API changes,
|
54
|
+
> 2. MINOR version when you add functionality in a backwards-compatible
|
55
|
+
> manner
|
56
|
+
> 3. PATCH version when you make backwards-compatible bug fixes.
|
57
|
+
>
|
58
|
+
> Additional labels for pre-release and build metadata are available as
|
59
|
+
> extensions to the MAJOR.MINOR.PATCH format.
|
60
|
+
|
61
|
+
* Add a git tag with the new version of the library
|
62
|
+
* Commit and push your changes and tag
|
63
|
+
* Create a new release on [the Github repository](https://github.com/bugsnag/bugsnag-capistrano)
|
64
|
+
* Release to RubyGems
|
65
|
+
|
66
|
+
```
|
67
|
+
bundle exec rake release
|
68
|
+
```
|
69
|
+
|
70
|
+
* Update docs.bugsnag.com with any new content
|
data/Gemfile
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
source "https://rubygems.org"
|
2
|
+
|
3
|
+
group :test, optional: true do
|
4
|
+
gem 'rake', '~> 10.1.1'
|
5
|
+
gem 'rspec'
|
6
|
+
gem 'rdoc'
|
7
|
+
gem 'pry'
|
8
|
+
gem 'addressable', '~>2.3.8'
|
9
|
+
gem 'webmock', RUBY_VERSION <= '1.9.3' ? '2.3.2': '>2.3.2'
|
10
|
+
gem 'capistrano', ENV['CAP_2_TEST'] == 'true' ? '~> 2.15': '~> 3.9'
|
11
|
+
end
|
12
|
+
|
13
|
+
group :bugsnag, optional: true do
|
14
|
+
gem 'bugsnag', '~> 6.0'
|
15
|
+
end
|
16
|
+
|
17
|
+
gemspec
|
data/LICENSE.txt
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2016 Bugsnag, Inc.
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,48 @@
|
|
1
|
+
# Bugsnag deploy tracking with Capistrano
|
2
|
+
[](https://travis-ci.org/bugsnag/bugsnag-bugsnag-capistrano)
|
3
|
+
|
4
|
+
|
5
|
+
Bugsnag Capistrano automatically notifies Bugsnag when you deploy your
|
6
|
+
application with [Capistrano](https://github.com/capistrano/capistrano),
|
7
|
+
allowing to correlate deploys with new errors and increased error rates in
|
8
|
+
Bugsnag.
|
9
|
+
|
10
|
+
[Bugsnag](http://bugsnag.com) captures errors in real-time from your web,
|
11
|
+
mobile and desktop applications, helping you to understand and resolve them
|
12
|
+
as fast as possible. [Create a free account](http://bugsnag.com) to start
|
13
|
+
capturing exceptions from your applications.
|
14
|
+
|
15
|
+
## Features
|
16
|
+
|
17
|
+
* Automatically report unhandled exceptions and crashes
|
18
|
+
* Report handled exceptions
|
19
|
+
* Log breadcrumbs which are attached to crash reports and add insight to users' actions
|
20
|
+
* Attach user information and custom diagnostic data to determine how many people are affected by a crash
|
21
|
+
|
22
|
+
## Getting started
|
23
|
+
|
24
|
+
1. [Create a Bugsnag account](https://bugsnag.com)
|
25
|
+
1. Complete the instructions in the [ruby integration guide](https://docs.bugsnag.com/platforms/ruby/) for your ruby application type
|
26
|
+
1. Complete the instructions in the integration guide for [deploy tracking](https://docs.bugsnag.com/platforms/ruby/deploy-tracking/)
|
27
|
+
1. Report handled exceptions using [`Bugsnag.notify()`](http://docs.bugsnag.com/platforms/bugsnag-capistrano/reporting-handled-exceptions/)
|
28
|
+
1. Customize your integration using the [configuration options](http://docs.bugsnag.com/platforms/bugsnag-capistrano/configuration-options/)
|
29
|
+
|
30
|
+
## Support
|
31
|
+
|
32
|
+
* Read the [bugsnag-capistrano](http://docs.bugsnag.com/platforms/bugsnag-capistrano/configuration-options) configuration reference
|
33
|
+
* Read the instructions in the integration guide for [deploy tracking](https://docs.bugsnag.com/platforms/ruby/deploy-tracking/)
|
34
|
+
* [Search open and closed issues](https://github.com/bugsnag/bugsnag-bugsnag-capistrano/issues?utf8=✓&q=is%3Aissue) for similar problems
|
35
|
+
* [Report a bug or request a feature](https://github.com/bugsnag/bugsnag-bugsnag-capistrano/issues/new)
|
36
|
+
|
37
|
+
## Contributing
|
38
|
+
|
39
|
+
All contributors are welcome! For information on how to build, test,
|
40
|
+
and release `bugsnag-bugsnag-capistrano`, see our
|
41
|
+
[contributing guide](https://github.com/bugsnag/bugsnag-bugsnag-capistrano/blob/master/CONTRIBUTING.md).
|
42
|
+
|
43
|
+
|
44
|
+
## License
|
45
|
+
|
46
|
+
The Bugsnag Cocoa library is free software released under the MIT License.
|
47
|
+
See [LICENSE.txt](https://github.com/bugsnag/bugsnag-bugsnag-capistrano/blob/master/LICENSE.txt)
|
48
|
+
for details.
|
data/Rakefile
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'rubygems'
|
4
|
+
require 'bundler'
|
5
|
+
require 'bundler/gem_tasks'
|
6
|
+
begin
|
7
|
+
Bundler.setup(:default)
|
8
|
+
rescue Bundler::BundlerError => e
|
9
|
+
$stderr.puts e.message
|
10
|
+
$stderr.puts "Run `bundle install` to install missing gems"
|
11
|
+
exit e.status_code
|
12
|
+
end
|
13
|
+
|
14
|
+
require 'rdoc/task'
|
15
|
+
RDoc::Task.new do |rdoc|
|
16
|
+
version = File.exist?('VERSION') ? File.read('VERSION') : ""
|
17
|
+
|
18
|
+
rdoc.rdoc_dir = 'rdoc'
|
19
|
+
rdoc.title = "bugsnag-capistrano #{version}"
|
20
|
+
rdoc.rdoc_files.include('README*')
|
21
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
22
|
+
end
|
23
|
+
|
24
|
+
# RSpec tasks
|
25
|
+
require 'rspec/core'
|
26
|
+
require "rspec/core/rake_task"
|
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
|
36
|
+
|
37
|
+
RSpec::Core::RakeTask.new(:spec) do |opts|
|
38
|
+
opts.rspec_opts = tags
|
39
|
+
end
|
40
|
+
task :default => :spec
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
1.0.0
|
@@ -0,0 +1,22 @@
|
|
1
|
+
Gem::Specification.new do |s|
|
2
|
+
s.name = "bugsnag-capistrano"
|
3
|
+
s.version = File.read("VERSION").strip
|
4
|
+
|
5
|
+
s.authors = ["Keegan Lowenstein", "Martin Holman", "Alex Moinet", "Delisa Mason"]
|
6
|
+
s.email = "keegan@bugsnag.com"
|
7
|
+
|
8
|
+
s.summary = "Notify Bugsnag when deploying with Capistrano"
|
9
|
+
s.description = "Correlate Capistrano deploys with new errors and increased error rates in Bugsnag"
|
10
|
+
s.homepage = "http://github.com/bugsnag/bugsnag-capistrano"
|
11
|
+
s.licenses = ["MIT"]
|
12
|
+
|
13
|
+
s.files = `git ls-files`.split("\n").reject {|file| file.start_with? "examples/"}
|
14
|
+
s.extra_rdoc_files = [
|
15
|
+
"LICENSE.txt",
|
16
|
+
"README.md",
|
17
|
+
"CHANGELOG.md"
|
18
|
+
]
|
19
|
+
s.require_paths = ["lib"]
|
20
|
+
s.required_ruby_version = '>= 1.9.2'
|
21
|
+
|
22
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
require 'bugsnag-capistrano/capistrano'
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module Bugsnag
|
2
|
+
module Capistrano
|
3
|
+
def self.load_into(configuration)
|
4
|
+
configuration.load do
|
5
|
+
after "deploy", "bugsnag:deploy"
|
6
|
+
after "deploy:migrations", "bugsnag:deploy"
|
7
|
+
|
8
|
+
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
|
11
|
+
begin
|
12
|
+
Bugsnag::Capistrano::Deploy.notify({
|
13
|
+
:api_key => fetch(:bugsnag_api_key, ENV["BUGSNAG_API_KEY"]),
|
14
|
+
:release_stage => fetch(:bugsnag_env) || ENV["BUGSNAG_RELEASE_STAGE"] || fetch(:rails_env) || fetch(:stage) || "production",
|
15
|
+
:revision => fetch(:current_revision, ENV["BUGSNAG_REVISION"]),
|
16
|
+
: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)
|
20
|
+
})
|
21
|
+
logger.info "Bugsnag deploy notification complete."
|
22
|
+
rescue
|
23
|
+
logger.important("Bugnsag deploy notification failed, #{$!.inspect}")
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
Bugsnag::Capistrano.load_into(Capistrano::Configuration.instance) if Capistrano::Configuration.instance
|
@@ -0,0 +1,97 @@
|
|
1
|
+
require "json"
|
2
|
+
require "net/http"
|
3
|
+
|
4
|
+
module Bugsnag
|
5
|
+
module Capistrano
|
6
|
+
class Deploy
|
7
|
+
|
8
|
+
HEADERS = {"Content-Type" => "application/json"}
|
9
|
+
DEFAULT_DEPLOY_ENDPOINT = "https://notify.bugsnag.com/deploy"
|
10
|
+
|
11
|
+
def self.notify(opts = {})
|
12
|
+
begin
|
13
|
+
require 'bugsnag'
|
14
|
+
self.notify_using_bugsnag(opts)
|
15
|
+
rescue LoadError
|
16
|
+
self.notify_without_bugsnag(opts)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.notify_using_bugsnag(opts = {})
|
21
|
+
|
22
|
+
configuration = Bugsnag.configuration.dup
|
23
|
+
|
24
|
+
[:api_key, :app_version, :release_stage, :endpoint, :use_ssl,
|
25
|
+
:proxy_host, :proxy_port, :proxy_user, :proxy_password].each do |param|
|
26
|
+
unless opts[param].nil?
|
27
|
+
configuration.send :"#{param}=", opts[param]
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
if Gem::Version.new(Bugsnag::VERSION).release >= Gem::Version.new('6.0.0')
|
32
|
+
endpoint = configuration.endpoint
|
33
|
+
else
|
34
|
+
endpoint = (configuration.use_ssl ? "https://" : "http://") + configuration.endpoint
|
35
|
+
end
|
36
|
+
|
37
|
+
parameters = {
|
38
|
+
"apiKey" => configuration.api_key,
|
39
|
+
"releaseStage" => configuration.release_stage,
|
40
|
+
"appVersion" => configuration.app_version,
|
41
|
+
"revision" => opts[:revision],
|
42
|
+
"repository" => opts[:repository],
|
43
|
+
"branch" => opts[:branch]
|
44
|
+
}.reject {|k,v| v == nil}
|
45
|
+
|
46
|
+
raise RuntimeError.new("No API key found when notifying of deploy") if !parameters["apiKey"] || parameters["apiKey"].empty?
|
47
|
+
|
48
|
+
|
49
|
+
payload_string = ::JSON.dump(parameters)
|
50
|
+
Bugsnag::Delivery::Synchronous.deliver(endpoint, payload_string, configuration)
|
51
|
+
end
|
52
|
+
|
53
|
+
def self.notify_without_bugsnag(opts = {})
|
54
|
+
endpoint = (opts[:endpoint].nil? ? DEFAULT_DEPLOY_ENDPOINT : opts[:endpoint])
|
55
|
+
|
56
|
+
parameters = {
|
57
|
+
"apiKey" => opts[:api_key],
|
58
|
+
"releaseStage" => opts[:release_stage],
|
59
|
+
"appVersion" => opts[:app_version],
|
60
|
+
"revision" => opts[:revision],
|
61
|
+
"repository" => opts[:repository],
|
62
|
+
"branch" => opts[:branch]
|
63
|
+
}.reject {|k, v| v == nil}
|
64
|
+
|
65
|
+
raise RuntimeError.new("No API key found when notifying of deploy") if !parameters["apiKey"] || parameters["apiKey"].empty?
|
66
|
+
|
67
|
+
payload_string = ::JSON.dump(parameters)
|
68
|
+
self.deliver(endpoint, payload_string)
|
69
|
+
end
|
70
|
+
|
71
|
+
def self.deliver(url, body)
|
72
|
+
logger = Logger.new(STDOUT)
|
73
|
+
logger.level = Logger::INFO
|
74
|
+
begin
|
75
|
+
request(url, body)
|
76
|
+
rescue StandardError => e
|
77
|
+
logger.warn("Notification to #{url} failed, #{e.inspect}")
|
78
|
+
logger.warn(e.backtrace)
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
def self.request(url, body)
|
83
|
+
uri = URI.parse(url)
|
84
|
+
http = Net::HTTP.new(uri.host, uri.port)
|
85
|
+
http.read_timeout = 15
|
86
|
+
http.open_timeout = 15
|
87
|
+
|
88
|
+
http.use_ssl = uri.scheme == "https"
|
89
|
+
|
90
|
+
uri.path == "" ? "/" : uri.path
|
91
|
+
request = Net::HTTP::Post.new(uri, HEADERS)
|
92
|
+
request.body = body
|
93
|
+
http.request(request)
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require "bugsnag"
|
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
|
+
|
14
|
+
Rake::Task["load"].invoke unless api_key
|
15
|
+
|
16
|
+
Bugsnag::Capistrano::Deploy.notify({
|
17
|
+
:api_key => api_key,
|
18
|
+
:release_stage => release_stage,
|
19
|
+
:app_version => app_version,
|
20
|
+
:revision => revision,
|
21
|
+
:repository => repository,
|
22
|
+
:branch => branch
|
23
|
+
})
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
|
28
|
+
task :load do
|
29
|
+
begin
|
30
|
+
Rake::Task["environment"].invoke
|
31
|
+
rescue
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
namespace :load do
|
2
|
+
|
3
|
+
task :defaults do
|
4
|
+
|
5
|
+
set :bugsnag_default_hooks, ->{ true }
|
6
|
+
|
7
|
+
end
|
8
|
+
|
9
|
+
end
|
10
|
+
|
11
|
+
namespace :deploy do
|
12
|
+
|
13
|
+
before :starting, :bugsnag_hooks do
|
14
|
+
invoke 'bugsnag:add_default_hooks' if fetch(:bugsnag_default_hooks)
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
|
19
|
+
namespace :bugsnag do
|
20
|
+
|
21
|
+
task :add_default_hooks do
|
22
|
+
after 'deploy:published', 'bugsnag:deploy'
|
23
|
+
end
|
24
|
+
|
25
|
+
desc 'Notify Bugsnag that new production code has been deployed'
|
26
|
+
task :deploy do
|
27
|
+
run_locally do
|
28
|
+
begin
|
29
|
+
Bugsnag::Capistrano::Deploy.notify({
|
30
|
+
:api_key => fetch(:bugsnag_api_key, ENV["BUGSNAG_API_KEY"]),
|
31
|
+
:release_stage => fetch(:bugsnag_env) || ENV["BUGSNAG_RELEASE_STAGE"] || fetch(:rails_env) || fetch(:stage) || "production",
|
32
|
+
:revision => fetch(:current_revision, ENV["BUGSNAG_REVISION"]),
|
33
|
+
:repository => fetch(:repo_url, ENV["BUGSNAG_REPOSITORY"]),
|
34
|
+
:branch => fetch(:branch, ENV["BUGSNAG_BRANCH"]),
|
35
|
+
:app_version => fetch(:app_version, ENV["BUGSNAG_APP_VERSION"]),
|
36
|
+
:endpoint => fetch(:bugsnag_endpoint)
|
37
|
+
})
|
38
|
+
info 'Bugsnag deploy notification complete.'
|
39
|
+
rescue
|
40
|
+
error "Bugsnag deploy notification failed, #{$!.inspect}"
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
# vi:ft=ruby
|
@@ -0,0 +1,65 @@
|
|
1
|
+
require 'webmock/rspec'
|
2
|
+
require 'rspec/expectations'
|
3
|
+
require 'rspec/mocks'
|
4
|
+
|
5
|
+
require 'webrick'
|
6
|
+
|
7
|
+
describe "bugsnag capistrano", :always do
|
8
|
+
|
9
|
+
server = nil
|
10
|
+
queue = Queue.new
|
11
|
+
cap_2 = ENV['CAP_2_TEST'] == 'true'
|
12
|
+
fixture_path = cap_2 ? '../examples/capistrano2' : '../examples/capistrano3'
|
13
|
+
exec_string = cap_2 ? 'bundle exec cap deploy' : 'bundle exec cap test deploy'
|
14
|
+
example_path = File.join(File.dirname(__FILE__), fixture_path)
|
15
|
+
|
16
|
+
before do
|
17
|
+
server = WEBrick::HTTPServer.new :Port => 0, :Logger => WEBrick::Log.new(STDOUT), :AccessLog => []
|
18
|
+
server.mount_proc '/deploy' do |req, res|
|
19
|
+
queue.push req.body
|
20
|
+
res.status = 200
|
21
|
+
res.body = "OK\n"
|
22
|
+
end
|
23
|
+
Thread.new{ server.start }
|
24
|
+
end
|
25
|
+
|
26
|
+
after do
|
27
|
+
server.stop
|
28
|
+
queue.clear
|
29
|
+
end
|
30
|
+
|
31
|
+
let(:request) { JSON.parse(queue.pop) }
|
32
|
+
|
33
|
+
it "sends a deploy notification to the set endpoint" do
|
34
|
+
ENV['BUGSNAG_ENDPOINT'] = "http://localhost:" + server.config[:Port].to_s + "/deploy"
|
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
|
+
expect(payload["releaseStage"]).to eq('production')
|
43
|
+
end
|
44
|
+
|
45
|
+
it "allows modifications of deployment characteristics" do
|
46
|
+
ENV['BUGSNAG_ENDPOINT'] = "http://localhost:" + server.config[:Port].to_s + "/deploy"
|
47
|
+
ENV['BUGSNAG_API_KEY'] = "this is a test key"
|
48
|
+
ENV['BUGSNAG_RELEASE_STAGE'] = "test"
|
49
|
+
ENV['BUGSNAG_REVISION'] = "test"
|
50
|
+
ENV['BUGSNAG_APP_VERSION'] = "1"
|
51
|
+
ENV['BUGSNAG_REPOSITORY'] = "test@repo.com:test/test_repo.git"
|
52
|
+
|
53
|
+
Dir.chdir(example_path) do
|
54
|
+
system(exec_string)
|
55
|
+
end
|
56
|
+
|
57
|
+
payload = request()
|
58
|
+
expect(payload["apiKey"]).to eq('this is a test key')
|
59
|
+
expect(payload["releaseStage"]).to eq('test')
|
60
|
+
expect(payload["repository"]).to eq("test@repo.com:test/test_repo.git")
|
61
|
+
expect(payload["appVersion"]).to eq("1")
|
62
|
+
expect(payload["revision"]).to eq("test")
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
data/spec/deploy_spec.rb
ADDED
@@ -0,0 +1,66 @@
|
|
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)
|
29
|
+
Bugsnag::Capistrano::Deploy.notify()
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
describe "without notifier loadable", :without_notifier do
|
34
|
+
it "should call notify_without bugsnag" do
|
35
|
+
expect(Bugsnag::Capistrano::Deploy).to receive(:deliver)
|
36
|
+
Bugsnag::Capistrano::Deploy.notify({:api_key => "test"})
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
describe "the delivery function", :always do
|
41
|
+
it "delivers a request to the given url" do
|
42
|
+
url = "http://localhost:56456"
|
43
|
+
stub_request(:post, url)
|
44
|
+
.to_return(status:200, body: "")
|
45
|
+
Bugsnag::Capistrano::Deploy.deliver(url, nil)
|
46
|
+
end
|
47
|
+
|
48
|
+
it "delivers a body unmodified" do
|
49
|
+
body = ::JSON.dump({
|
50
|
+
"paramA" => 'a',
|
51
|
+
"paramB" => 'b',
|
52
|
+
"paramHash" => {
|
53
|
+
"one" => 1,
|
54
|
+
"two" => 2,
|
55
|
+
"three" => 3
|
56
|
+
}
|
57
|
+
})
|
58
|
+
url = "http://localhost:56456"
|
59
|
+
request = stub_request(:post, url)
|
60
|
+
.with(body: body, headers: { 'Content-Type' => 'application/json'})
|
61
|
+
.to_return(status:200, body: "")
|
62
|
+
Bugsnag::Capistrano::Deploy.deliver(url, body)
|
63
|
+
assert_requested request
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
metadata
ADDED
@@ -0,0 +1,68 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: bugsnag-capistrano
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Keegan Lowenstein
|
8
|
+
- Martin Holman
|
9
|
+
- Alex Moinet
|
10
|
+
- Delisa Mason
|
11
|
+
autorequire:
|
12
|
+
bindir: bin
|
13
|
+
cert_chain: []
|
14
|
+
date: 2017-11-09 00:00:00.000000000 Z
|
15
|
+
dependencies: []
|
16
|
+
description: Correlate Capistrano deploys with new errors and increased error rates
|
17
|
+
in Bugsnag
|
18
|
+
email: keegan@bugsnag.com
|
19
|
+
executables: []
|
20
|
+
extensions: []
|
21
|
+
extra_rdoc_files:
|
22
|
+
- LICENSE.txt
|
23
|
+
- README.md
|
24
|
+
- CHANGELOG.md
|
25
|
+
files:
|
26
|
+
- ".gitignore"
|
27
|
+
- ".travis.yml"
|
28
|
+
- CHANGELOG.md
|
29
|
+
- CONTRIBUTING.md
|
30
|
+
- Gemfile
|
31
|
+
- LICENSE.txt
|
32
|
+
- README.md
|
33
|
+
- Rakefile
|
34
|
+
- VERSION
|
35
|
+
- bugsnag-capistrano.gemspec
|
36
|
+
- lib/bugsnag-capistrano.rb
|
37
|
+
- lib/bugsnag-capistrano/capistrano.rb
|
38
|
+
- lib/bugsnag-capistrano/capistrano2.rb
|
39
|
+
- lib/bugsnag-capistrano/deploy.rb
|
40
|
+
- lib/bugsnag-capistrano/tasks/bugsnag-capistrano.rake
|
41
|
+
- lib/bugsnag-capistrano/tasks/bugsnag.cap
|
42
|
+
- spec/capistrano_spec.rb
|
43
|
+
- spec/deploy_spec.rb
|
44
|
+
homepage: http://github.com/bugsnag/bugsnag-capistrano
|
45
|
+
licenses:
|
46
|
+
- MIT
|
47
|
+
metadata: {}
|
48
|
+
post_install_message:
|
49
|
+
rdoc_options: []
|
50
|
+
require_paths:
|
51
|
+
- lib
|
52
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
53
|
+
requirements:
|
54
|
+
- - ">="
|
55
|
+
- !ruby/object:Gem::Version
|
56
|
+
version: 1.9.2
|
57
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
requirements: []
|
63
|
+
rubyforge_project:
|
64
|
+
rubygems_version: 2.4.5
|
65
|
+
signing_key:
|
66
|
+
specification_version: 4
|
67
|
+
summary: Notify Bugsnag when deploying with Capistrano
|
68
|
+
test_files: []
|