capistrano-sentry 0.1.5 → 0.4.2
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 +4 -4
- data/.github/workflows/test.yml +42 -0
- data/.gitignore +2 -1
- data/.rubocop.yml +99 -0
- data/Gemfile +2 -0
- data/README.md +38 -7
- data/Rakefile +2 -0
- data/bin/console +1 -0
- data/capistrano-sentry.gemspec +5 -3
- data/lib/capistrano/sentry.rb +2 -0
- data/lib/capistrano/sentry/version.rb +3 -1
- data/lib/capistrano/tasks/sentry.rake +57 -39
- data/test/capistrano/sentry_test.rb +8 -7
- data/test/test_helper.rb +2 -0
- metadata +11 -11
- data/.travis.yml +0 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: aa08b17ff84fe1b532e61db8eb1523386d1067fdbebb2f1e35e08ea3838321a7
|
4
|
+
data.tar.gz: 37f28cfb7948b2f466459edc77d415df07110792c4aeb195e0c9b9ae3c41ba3a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2f29484e5511e9a3c6a2446c4ce50910e8eeb06ca9bcce512322ea111bfed2ff18e747378deee98389fb34c7e659315d0ff35f512252e6196e627c9bf66574ae
|
7
|
+
data.tar.gz: 7aa867b34a28f3fca952372e847134326df5210872b634db857497ba5e080223302534a28535eeb06e5de2c616d21240c246ea7768c8908c496bdf2e122be0b8
|
@@ -0,0 +1,42 @@
|
|
1
|
+
name: Test
|
2
|
+
|
3
|
+
on: [push]
|
4
|
+
|
5
|
+
jobs:
|
6
|
+
test:
|
7
|
+
|
8
|
+
runs-on: ubuntu-latest
|
9
|
+
|
10
|
+
strategy:
|
11
|
+
matrix:
|
12
|
+
ruby: [ '2.6' ]
|
13
|
+
|
14
|
+
steps:
|
15
|
+
- uses: actions/checkout@v2
|
16
|
+
|
17
|
+
- name: Set up Ruby ${{ matrix.ruby }}
|
18
|
+
uses: actions/setup-ruby@v1
|
19
|
+
with:
|
20
|
+
ruby-version: ${{ matrix.ruby }}
|
21
|
+
|
22
|
+
- name: Retrieve gems cache
|
23
|
+
uses: actions/cache@v1.1.2
|
24
|
+
with:
|
25
|
+
path: vendor/bundle
|
26
|
+
key: ${{ runner.os }}-${{ matrix.ruby }}-gem-${{ hashFiles('**/Gemfile.lock') }}
|
27
|
+
|
28
|
+
- name: Install gems
|
29
|
+
run: |
|
30
|
+
rm -f .ruby-version
|
31
|
+
bundle config path vendor/bundle
|
32
|
+
bundle install --jobs 4 --retry 3
|
33
|
+
|
34
|
+
- name: Run tests
|
35
|
+
run: bundle exec rake test
|
36
|
+
|
37
|
+
- name: Upload log if failure
|
38
|
+
uses: actions/upload-artifact@v1
|
39
|
+
if: failure()
|
40
|
+
with:
|
41
|
+
name: test.log
|
42
|
+
path: log/test.log
|
data/.gitignore
CHANGED
data/.rubocop.yml
ADDED
@@ -0,0 +1,99 @@
|
|
1
|
+
AllCops:
|
2
|
+
TargetRubyVersion: 2.4
|
3
|
+
|
4
|
+
Layout/AccessModifierIndentation:
|
5
|
+
EnforcedStyle: outdent
|
6
|
+
IndentationWidth: 2
|
7
|
+
|
8
|
+
Layout/ArgumentAlignment:
|
9
|
+
EnforcedStyle: with_fixed_indentation
|
10
|
+
IndentationWidth: 2
|
11
|
+
|
12
|
+
Layout/FirstArrayElementIndentation:
|
13
|
+
EnforcedStyle: consistent
|
14
|
+
|
15
|
+
Layout/FirstHashElementIndentation:
|
16
|
+
EnforcedStyle: consistent
|
17
|
+
|
18
|
+
Layout/HashAlignment:
|
19
|
+
EnforcedHashRocketStyle: table
|
20
|
+
EnforcedColonStyle: table
|
21
|
+
|
22
|
+
Layout/MultilineMethodCallIndentation:
|
23
|
+
EnforcedStyle: indented
|
24
|
+
|
25
|
+
Layout/ParameterAlignment:
|
26
|
+
EnforcedStyle: with_fixed_indentation
|
27
|
+
IndentationWidth: 2
|
28
|
+
|
29
|
+
Lint/RaiseException:
|
30
|
+
Enabled: true
|
31
|
+
|
32
|
+
Lint/StructNewOverride:
|
33
|
+
Enabled: true
|
34
|
+
|
35
|
+
Metrics/AbcSize:
|
36
|
+
Max: 65
|
37
|
+
|
38
|
+
Metrics/BlockLength:
|
39
|
+
Max: 70
|
40
|
+
|
41
|
+
Metrics/ClassLength:
|
42
|
+
Max: 300
|
43
|
+
|
44
|
+
Metrics/CyclomaticComplexity:
|
45
|
+
Max: 10
|
46
|
+
|
47
|
+
Metrics/MethodLength:
|
48
|
+
Max: 60
|
49
|
+
|
50
|
+
Metrics/ModuleLength:
|
51
|
+
Max: 300
|
52
|
+
|
53
|
+
Metrics/PerceivedComplexity:
|
54
|
+
Max: 10
|
55
|
+
|
56
|
+
Naming/FileName:
|
57
|
+
Enabled: false
|
58
|
+
|
59
|
+
Style/AsciiComments:
|
60
|
+
Enabled: false
|
61
|
+
|
62
|
+
Style/ClassAndModuleChildren:
|
63
|
+
AutoCorrect: true
|
64
|
+
|
65
|
+
Style/ConditionalAssignment:
|
66
|
+
Enabled: false
|
67
|
+
|
68
|
+
Style/Documentation:
|
69
|
+
Enabled: false
|
70
|
+
|
71
|
+
Style/EmptyMethod:
|
72
|
+
EnforcedStyle: expanded
|
73
|
+
|
74
|
+
Style/GuardClause:
|
75
|
+
MinBodyLength: 3
|
76
|
+
|
77
|
+
Style/HashEachMethods:
|
78
|
+
Enabled: true
|
79
|
+
AutoCorrect: true
|
80
|
+
|
81
|
+
Style/HashTransformKeys:
|
82
|
+
Enabled: true
|
83
|
+
AutoCorrect: true
|
84
|
+
|
85
|
+
Style/HashTransformValues:
|
86
|
+
Enabled: true
|
87
|
+
AutoCorrect: true
|
88
|
+
|
89
|
+
Style/IfUnlessModifier:
|
90
|
+
Enabled: false
|
91
|
+
|
92
|
+
Style/MultipleComparison:
|
93
|
+
Enabled: false
|
94
|
+
|
95
|
+
Style/NumericPredicate:
|
96
|
+
Enabled: false
|
97
|
+
|
98
|
+
Style/SymbolArray:
|
99
|
+
MinSize: 7
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -2,15 +2,12 @@
|
|
2
2
|
|
3
3
|
Simple extension of capistrano for automatic notification of Sentry.
|
4
4
|
|
5
|
-
TODO: Prevent user at deployment start if missing parameter to inform sentry
|
6
|
-
properly
|
7
|
-
|
8
5
|
## Installation
|
9
6
|
|
10
7
|
Add this line to your application's Gemfile:
|
11
8
|
|
12
9
|
```ruby
|
13
|
-
gem 'capistrano-sentry'
|
10
|
+
gem 'capistrano-sentry', require: false
|
14
11
|
```
|
15
12
|
|
16
13
|
Then, add this line to your application's Capfile:
|
@@ -19,9 +16,11 @@ Then, add this line to your application's Capfile:
|
|
19
16
|
require 'capistrano/sentry'
|
20
17
|
```
|
21
18
|
|
22
|
-
And then execute:
|
19
|
+
And then execute from your command line:
|
23
20
|
|
24
|
-
|
21
|
+
```bash
|
22
|
+
bundle
|
23
|
+
```
|
25
24
|
|
26
25
|
## Usage
|
27
26
|
|
@@ -29,14 +28,46 @@ Add these lines to your application's `config/deploy.rb`:
|
|
29
28
|
|
30
29
|
```ruby
|
31
30
|
# Sentry deployment notification
|
32
|
-
set :
|
31
|
+
set :sentry_host, 'https://my-sentry.mycorp.com' # https://sentry.io by default
|
32
|
+
set :sentry_api_token, '0123456789abcdef0123456789abcdef'
|
33
33
|
set :sentry_organization, 'my-org' # fetch(:application) by default
|
34
34
|
set :sentry_project, 'my-proj' # fetch(:application) by default
|
35
35
|
set :sentry_repo, 'my-org/my-proj' # computed from repo_url by default
|
36
|
+
```
|
36
37
|
|
38
|
+
If you want deployments to be published in every Rails environment, put this in `config/deploy.rb`, otherwise put it your environment-specific deploy file (i.e. `config/deploy/production.rb`):
|
39
|
+
```ruby
|
40
|
+
before 'deploy:starting', 'sentry:validate_config'
|
37
41
|
after 'deploy:published', 'sentry:notice_deployment'
|
38
42
|
```
|
39
43
|
|
44
|
+
### Explaination of Configuration Properties
|
45
|
+
|
46
|
+
* `sentry_host`: identifies to which host Sentry submissions are sent. [https://sentry.io by default]
|
47
|
+
|
48
|
+
* `sentry_api_token`: API Auth Tokens are found/created in you Sentry Account Settings (not in the organization or project): `Settings > Account > Api > Auth Tokens`.
|
49
|
+
[https://sentry.io/settings/account/api/auth-tokens/]
|
50
|
+
|
51
|
+
* `sentry_organization`: The "**Name**" ("*A unique ID used to identify this organization*") from Sentry's Organization Settings page.
|
52
|
+
[https://sentry.io/settings/{ORGANIZATION_SLUG}]
|
53
|
+
|
54
|
+
* `sentry_project`: The "**Name**" ("*A unique ID used to identify this project*") from Sentry's Project Settings page.
|
55
|
+
[https://sentry.io/settings/{ORGANIZATION_SLUG}/projects/{PROJECT_SLUG}]
|
56
|
+
|
57
|
+
* `sentry_repo`: The `repository` name to be used when reporting repository details to Sentry [computed from `fetch(:repo_url)` by default -- `https://github.com/codeur/capistrano-sentry` becomes `//github.com/codeur/capistrano-sentry` and `git@github.com:codeur/capistrano-sentry.git` becomes `codeur/capistrano-sentry`]
|
58
|
+
|
59
|
+
* `sentry_repo_integration`: this enables/disables submission of git repo information (`release_refs` below) to Sentry [Enabled (`true`) by default].
|
60
|
+
|
61
|
+
* `sentry_release_refs`: Repository details about this realease (`repository`, `commit`, `previousCommit`) to Sentry [computed from `sentry_repo`, `current_revision`, and `previous_revision`)].
|
62
|
+
|
63
|
+
* `sentry_release_version`: Version number (tag, etc.) used to identify this release to Sentry [computed from `current_revision` or repository `HEAD`)].
|
64
|
+
|
65
|
+
* `deploy_name`: A name (revision, version number, tag, etc.) used to identify this release deploy to Sentry [computed from `sentry_release_version`+`fetch(:release_timestamp)`)].
|
66
|
+
|
67
|
+
### Sentry API Documentation
|
68
|
+
* [Project Releases](https://docs.sentry.io/api/releases/post-project-releases/)
|
69
|
+
* [Release Deploys](https://docs.sentry.io/api/releases/post-release-deploys/)
|
70
|
+
|
40
71
|
## Development
|
41
72
|
|
42
73
|
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
data/Rakefile
CHANGED
data/bin/console
CHANGED
data/capistrano-sentry.gemspec
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
lib = File.expand_path('lib', __dir__)
|
2
4
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
3
5
|
require 'capistrano/sentry/version'
|
@@ -7,8 +9,8 @@ Gem::Specification.new do |spec|
|
|
7
9
|
spec.version = Capistrano::Sentry::VERSION
|
8
10
|
spec.authors = ['Brice Texier']
|
9
11
|
spec.email = ['brice@codeur.com']
|
10
|
-
|
11
|
-
spec.summary = '
|
12
|
+
spec.description = 'Sentry release/deployment integration'
|
13
|
+
spec.summary = 'Push release and deployment information on Sentry on each deploy'
|
12
14
|
spec.homepage = 'https://github.com/codeur/capistrano-sentry'
|
13
15
|
spec.license = 'MIT'
|
14
16
|
|
@@ -26,5 +28,5 @@ Gem::Specification.new do |spec|
|
|
26
28
|
|
27
29
|
spec.add_development_dependency 'bundler', '~> 1.17'
|
28
30
|
spec.add_development_dependency 'minitest', '~> 5.0'
|
29
|
-
spec.add_development_dependency 'rake', '
|
31
|
+
spec.add_development_dependency 'rake', '>= 10'
|
30
32
|
end
|
data/lib/capistrano/sentry.rb
CHANGED
@@ -1,65 +1,88 @@
|
|
1
|
-
#
|
2
|
-
|
3
|
-
#
|
4
|
-
#
|
5
|
-
#
|
6
|
-
# hardcode the values in here if you like living on the edge):
|
7
|
-
#
|
8
|
-
# ENV['SENTRY_API_ENDPOINT'] : API endpoint, https://app.getsentry.com
|
9
|
-
# ENV['SENTRY_ORG'] : the organization for this app
|
10
|
-
# ENV['SENTRY_PROJECT'] : the project for this app
|
11
|
-
# ENV['SENTRY_AUTH_TOKEN'] : a valid Auth token (replaces API Key)
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# This task will notify Sentry via their API[1][2] that you have deployed
|
4
|
+
# a new release. It uses the commit hash as the `version` and the git ref as
|
5
|
+
# the optional `ref` value.
|
12
6
|
#
|
13
|
-
# [1]: https://docs.
|
7
|
+
# [1]: https://docs.sentry.io/api/releases/post-project-releases/
|
8
|
+
# [2]: https://docs.sentry.io/api/releases/post-release-deploys/
|
14
9
|
|
15
10
|
# For Rails app, this goes in config/deploy.rb
|
16
11
|
|
12
|
+
module Capistrano
|
13
|
+
class SentryConfigurationError < StandardError
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
17
|
namespace :sentry do
|
18
|
-
desc '
|
18
|
+
desc 'Confirm configuration for notification to Sentry'
|
19
|
+
task :validate_config do
|
20
|
+
run_locally do
|
21
|
+
info '[sentry:validate_config] Validating Sentry notification config'
|
22
|
+
api_token = ENV['SENTRY_API_TOKEN'] || fetch(:sentry_api_token)
|
23
|
+
if api_token.nil? || api_token.empty?
|
24
|
+
msg = 'Missing SENTRY_API_TOKEN. Please set SENTRY_API_TOKEN environment' \
|
25
|
+
' variable or `set :sentry_api_token` in your `config/deploy.rb` file for your Rails application.'
|
26
|
+
warn msg
|
27
|
+
raise Capistrano::SentryConfigurationError, msg
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
desc 'Notice new deployment in Sentry'
|
19
33
|
task :notice_deployment do
|
20
34
|
run_locally do
|
21
35
|
require 'uri'
|
22
36
|
require 'net/https'
|
23
37
|
require 'json'
|
24
38
|
|
25
|
-
|
26
|
-
|
27
|
-
http.use_ssl = true
|
39
|
+
head_revision = fetch(:current_revision) || `git rev-parse HEAD`.strip
|
40
|
+
prev_revision = fetch(:previous_revision) || `git rev-parse #{fetch(:current_revision)}^`.strip
|
28
41
|
|
29
|
-
|
30
|
-
|
31
|
-
orga_slug = fetch(:sentry_organization) || fetch(:application)
|
42
|
+
sentry_host = ENV['SENTRY_HOST'] || fetch(:sentry_host, 'https://sentry.io')
|
43
|
+
organization_slug = fetch(:sentry_organization) || fetch(:application)
|
32
44
|
project = fetch(:sentry_project) || fetch(:application)
|
33
45
|
environment = fetch(:stage) || 'default'
|
34
46
|
api_token = ENV['SENTRY_API_TOKEN'] || fetch(:sentry_api_token)
|
35
|
-
|
47
|
+
repo_integration_enabled = fetch(:sentry_repo_integration, true)
|
48
|
+
release_refs = fetch(:sentry_release_refs, [{
|
49
|
+
repository: fetch(:sentry_repo) || fetch(:repo_url).split(':').last.delete_suffix('.git'),
|
50
|
+
commit: head_revision,
|
51
|
+
previousCommit: prev_revision
|
52
|
+
}])
|
53
|
+
release_version = fetch(:sentry_release_version) || head_revision
|
54
|
+
deploy_name = fetch(:sentry_deploy_name) || "#{release_version}-#{fetch(:release_timestamp)}"
|
55
|
+
|
56
|
+
uri = URI.parse(sentry_host)
|
57
|
+
http = Net::HTTP.new(uri.host, uri.port)
|
58
|
+
http.use_ssl = true
|
36
59
|
|
37
60
|
headers = {
|
38
|
-
'Content-Type'
|
61
|
+
'Content-Type' => 'application/json',
|
39
62
|
'Authorization' => 'Bearer ' + api_token.to_s
|
40
63
|
}
|
41
64
|
|
42
|
-
req = Net::HTTP::Post.new("/api/0/organizations/#{
|
43
|
-
|
44
|
-
version:
|
45
|
-
refs: [{
|
46
|
-
repository: repo_name,
|
47
|
-
commit: fetch(:current_revision) || `git rev-parse HEAD`.strip,
|
48
|
-
# previousCommit: fetch(:previous_revision)
|
49
|
-
}],
|
65
|
+
req = Net::HTTP::Post.new("/api/0/organizations/#{organization_slug}/releases/", headers)
|
66
|
+
body = {
|
67
|
+
version: release_version,
|
50
68
|
projects: [project]
|
51
|
-
|
69
|
+
}
|
70
|
+
body[:refs] = release_refs if repo_integration_enabled
|
71
|
+
req.body = JSON.generate(body)
|
52
72
|
response = http.request(req)
|
53
73
|
if response.is_a? Net::HTTPSuccess
|
54
|
-
info
|
55
|
-
req = Net::HTTP::Post.new(
|
74
|
+
info "Notified Sentry of new release: #{release_version}"
|
75
|
+
req = Net::HTTP::Post.new(
|
76
|
+
"/api/0/organizations/#{organization_slug}/releases/#{release_version}/deploys/",
|
77
|
+
headers
|
78
|
+
)
|
56
79
|
req.body = JSON.generate(
|
57
80
|
environment: environment,
|
58
|
-
name:
|
81
|
+
name: deploy_name
|
59
82
|
)
|
60
83
|
response = http.request(req)
|
61
84
|
if response.is_a? Net::HTTPSuccess
|
62
|
-
info
|
85
|
+
info "Notified Sentry of new deployment: #{deploy_name}"
|
63
86
|
else
|
64
87
|
warn "Cannot notify sentry for new deployment. Response: #{response.code.inspect}: #{response.body}"
|
65
88
|
end
|
@@ -69,8 +92,3 @@ namespace :sentry do
|
|
69
92
|
end
|
70
93
|
end
|
71
94
|
end
|
72
|
-
|
73
|
-
# If you want deployments to be published in every Rails environment, put this
|
74
|
-
# in config/deploy.rb, otherwise put it your environment-specific deploy file
|
75
|
-
# i.e. config/deploy/production.rb
|
76
|
-
# after 'deploy:published', 'sentry:notice_deployment'
|
@@ -1,11 +1,12 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
refute_nil ::Capistrano::Sentry::VERSION
|
6
|
-
end
|
3
|
+
require 'test_helper'
|
4
|
+
require 'capistrano/sentry/version'
|
7
5
|
|
8
|
-
|
9
|
-
|
6
|
+
module Capistrano
|
7
|
+
class SentryTest < Minitest::Test
|
8
|
+
def test_that_it_has_a_version_number
|
9
|
+
assert !::Capistrano::Sentry::VERSION.nil?
|
10
|
+
end
|
10
11
|
end
|
11
12
|
end
|
data/test/test_helper.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: capistrano-sentry
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Brice Texier
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-05-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: capistrano
|
@@ -56,25 +56,26 @@ dependencies:
|
|
56
56
|
name: rake
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- - "
|
59
|
+
- - ">="
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: '10
|
61
|
+
version: '10'
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
|
-
- - "
|
66
|
+
- - ">="
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version: '10
|
69
|
-
description:
|
68
|
+
version: '10'
|
69
|
+
description: Sentry release/deployment integration
|
70
70
|
email:
|
71
71
|
- brice@codeur.com
|
72
72
|
executables: []
|
73
73
|
extensions: []
|
74
74
|
extra_rdoc_files: []
|
75
75
|
files:
|
76
|
+
- ".github/workflows/test.yml"
|
76
77
|
- ".gitignore"
|
77
|
-
- ".
|
78
|
+
- ".rubocop.yml"
|
78
79
|
- CODE_OF_CONDUCT.md
|
79
80
|
- Gemfile
|
80
81
|
- LICENSE.txt
|
@@ -108,11 +109,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
108
109
|
- !ruby/object:Gem::Version
|
109
110
|
version: '0'
|
110
111
|
requirements: []
|
111
|
-
|
112
|
-
rubygems_version: 2.7.6
|
112
|
+
rubygems_version: 3.0.3
|
113
113
|
signing_key:
|
114
114
|
specification_version: 4
|
115
|
-
summary:
|
115
|
+
summary: Push release and deployment information on Sentry on each deploy
|
116
116
|
test_files:
|
117
117
|
- test/capistrano/sentry_test.rb
|
118
118
|
- test/test_helper.rb
|