roo_on_rails 1.3.1 → 1.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.codeclimate.yml +20 -0
- data/.gitignore +1 -0
- data/.rubocop.yml +9 -1
- data/CHANGELOG.md +17 -3
- data/Gemfile +3 -0
- data/README.md +16 -3
- data/exe/roo_on_rails +3 -2
- data/gemfiles/rails_3.gemfile +2 -1
- data/gemfiles/rails_3.gemfile.lock +11 -7
- data/gemfiles/rails_4.gemfile +2 -2
- data/gemfiles/rails_4.gemfile.lock +10 -8
- data/gemfiles/rails_5.gemfile +2 -2
- data/gemfiles/rails_5.gemfile.lock +10 -8
- data/gemfiles/rails_5_1.gemfile +2 -2
- data/gemfiles/rails_5_1.gemfile.lock +10 -8
- data/lib/roo_on_rails/checks/base.rb +0 -1
- data/lib/roo_on_rails/checks/env_specific.rb +1 -1
- data/lib/roo_on_rails/checks/environment.rb +2 -0
- data/lib/roo_on_rails/checks/git/origin.rb +1 -2
- data/lib/roo_on_rails/checks/github/branch_protection.rb +17 -7
- data/lib/roo_on_rails/checks/heroku/app_exists.rb +3 -2
- data/lib/roo_on_rails/checks/heroku/drains_metrics.rb +58 -0
- data/lib/roo_on_rails/checks/heroku/login.rb +0 -1
- data/lib/roo_on_rails/checks/heroku/metrics_bridge_configured.rb +79 -0
- data/lib/roo_on_rails/checks/heroku/preboot_enabled.rb +1 -1
- data/lib/roo_on_rails/checks/heroku/toolbelt_installed.rb +0 -1
- data/lib/roo_on_rails/checks.rb +0 -1
- data/lib/roo_on_rails/railties/database.rb +2 -2
- data/lib/roo_on_rails/tasks/db.rake +23 -21
- data/lib/roo_on_rails/tasks/newrelic.rake +25 -0
- data/lib/roo_on_rails/version.rb +1 -1
- data/roo_on_rails.gemspec +1 -1
- metadata +8 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 492f0bf2a7f3112cd466416f709a18c3d3f6180d
|
4
|
+
data.tar.gz: dd2ca58474719751987b21b17d8d65214ed097ad
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3d86029410dca537fd459beb22ee499624c292b02e710627e88a356bb1879949e8e22d1039af3077824d99a7171de76a26534e581d5f36f7483f8ceb2245456e
|
7
|
+
data.tar.gz: d4e3b5635b332ae8d0a238a3ceac0c10c8ef665449d136597344207289b508a26fc2dc405209b9d8bac942ec596b1a85b35fc82e4adee7c2740734b5afb936dd
|
data/.codeclimate.yml
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
---
|
2
|
+
engines:
|
3
|
+
bundler-audit:
|
4
|
+
enabled: false
|
5
|
+
duplication:
|
6
|
+
enabled: true
|
7
|
+
config:
|
8
|
+
languages:
|
9
|
+
- ruby
|
10
|
+
fixme:
|
11
|
+
enabled: true
|
12
|
+
rubocop:
|
13
|
+
enabled: true
|
14
|
+
ratings:
|
15
|
+
paths:
|
16
|
+
- Gemfile.lock
|
17
|
+
- "**.rb"
|
18
|
+
exclude_paths:
|
19
|
+
- spec/
|
20
|
+
- vendor/
|
data/.gitignore
CHANGED
data/.rubocop.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,8 +1,21 @@
|
|
1
|
+
# v1.4.0 (2017-06-05)
|
2
|
+
|
3
|
+
Features:
|
4
|
+
|
5
|
+
- Adds `newrelic:notice_deployment` rake task (#32)
|
6
|
+
- Adds Heroku/Datadog integration checks (#33)
|
7
|
+
- Supports Rails apps without ActiveRecord (#26)
|
8
|
+
|
9
|
+
Fixes:
|
10
|
+
|
11
|
+
- `roo_on_rails` command only loads the checks harness if necessary (#30)
|
12
|
+
- Upgrades outdated `platform-api` gem (#31)
|
13
|
+
|
1
14
|
# v1.3.1 (2017-05-05)
|
2
15
|
|
3
16
|
Features:
|
4
17
|
|
5
|
-
-
|
18
|
+
- Adds Rails 5.1 support (#25)
|
6
19
|
|
7
20
|
Fixes:
|
8
21
|
|
@@ -15,7 +28,7 @@ Features:
|
|
15
28
|
- Sets database statement timeout to 200ms by default (#13).
|
16
29
|
- Sets migration statement timeout to 10s by default (#16, #17)
|
17
30
|
- Adds Sidekiq and Hirefire (workers) integration (#11)
|
18
|
-
- Adds the ability to tag logs with key/value pairs (#20)
|
31
|
+
- Adds the ability to tag logs with key/value pairs (#20, #21)
|
19
32
|
|
20
33
|
Fixes:
|
21
34
|
|
@@ -23,6 +36,7 @@ Fixes:
|
|
23
36
|
- Do not depend on sort order for Codecov GitHub contexts (#12)
|
24
37
|
- Do not add `Rack::SslEnforcer` middleware in test environment (#15)
|
25
38
|
- Fix for "undefined constant: RooOnRails::Rack::Timeout" (#18)
|
39
|
+
- Use correct class name in Sidekiq auto-scaling metric (#22)
|
26
40
|
|
27
41
|
# v1.2.0 (2017-03-21)
|
28
42
|
|
@@ -45,7 +59,7 @@ Features:
|
|
45
59
|
|
46
60
|
# v1.0.1 (2017-01-20)
|
47
61
|
|
48
|
-
|
62
|
+
Fixes:
|
49
63
|
|
50
64
|
- Do not load New Relic in test environments (#2, #3)
|
51
65
|
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -141,9 +141,22 @@ When setting the manager up in the HireFire web ui, the following settings must
|
|
141
141
|
For clearer and machine-parseable log output, there in an extension to be able to add context to your logs which is output as [logfmt](https://brandur.org/logfmt) key/value pairs after the log message.
|
142
142
|
|
143
143
|
```ruby
|
144
|
-
#
|
144
|
+
# application.rb
|
145
145
|
|
146
|
-
|
146
|
+
require 'roo_on_rails/context_logging'
|
147
|
+
|
148
|
+
class Application < Rails::Application
|
149
|
+
|
150
|
+
# add this block somewhere within the application class
|
151
|
+
logger = config.logger
|
152
|
+
if logger.nil?
|
153
|
+
logger = ActiveSupport::Logger.new($stdout)
|
154
|
+
logger.formatter = config.log_formatter
|
155
|
+
end
|
156
|
+
logger = ActiveSupport::TaggedLogging.new(logger) unless logger.respond_to?(:tagged)
|
157
|
+
config.logger = RooOnRails::ContextLogging.new(logger)
|
158
|
+
|
159
|
+
end
|
147
160
|
```
|
148
161
|
|
149
162
|
You can then add context using the `with` method:
|
@@ -154,7 +167,7 @@ logger.with(a: 1) { logger.with(b: 2) { logger.info('Stuff') } }
|
|
154
167
|
logger.with(a: 1, b: 2).info('Stuff')
|
155
168
|
```
|
156
169
|
|
157
|
-
See the [class documentation](
|
170
|
+
See the [class documentation](lib/roo_on_rails/context_logging.rb) for further details.
|
158
171
|
|
159
172
|
## Contributing
|
160
173
|
|
data/exe/roo_on_rails
CHANGED
@@ -1,12 +1,13 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
+
|
2
3
|
require 'rubygems'
|
3
4
|
require 'roo_on_rails/config'
|
4
|
-
require 'roo_on_rails/harness'
|
5
|
-
require 'roo_on_rails/sidekiq/loader'
|
6
5
|
|
7
6
|
if ARGV.include? 'sidekiq'
|
7
|
+
require 'roo_on_rails/sidekiq/loader'
|
8
8
|
RooOnRails::Sidekiq::Loader.run
|
9
9
|
else
|
10
|
+
require 'roo_on_rails/harness'
|
10
11
|
module RooOnRails
|
11
12
|
Harness.new(try_fix: true, context: Config.load).run
|
12
13
|
end
|
data/gemfiles/rails_3.gemfile
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
PATH
|
2
2
|
remote: ..
|
3
3
|
specs:
|
4
|
-
roo_on_rails (1.
|
4
|
+
roo_on_rails (1.4.0)
|
5
5
|
dotenv-rails (~> 2.1)
|
6
6
|
hashie (~> 3.4)
|
7
7
|
hirefire-resource
|
8
8
|
newrelic_rpm (~> 3.17)
|
9
9
|
octokit
|
10
|
-
platform-api (~> 0
|
10
|
+
platform-api (~> 2.0)
|
11
11
|
rack-ssl-enforcer
|
12
12
|
rack-timeout
|
13
13
|
rails (>= 3.2.22, < 5.2)
|
@@ -66,7 +66,7 @@ GEM
|
|
66
66
|
dotenv (= 2.2.1)
|
67
67
|
railties (>= 3.2, < 5.2)
|
68
68
|
erubis (2.7.0)
|
69
|
-
excon (0.
|
69
|
+
excon (0.56.0)
|
70
70
|
faraday (0.12.1)
|
71
71
|
multipart-post (>= 1.2, < 3)
|
72
72
|
ffi (1.9.18)
|
@@ -86,12 +86,12 @@ GEM
|
|
86
86
|
guard-compat (~> 1.1)
|
87
87
|
rspec (>= 2.99.0, < 4.0)
|
88
88
|
hashie (3.5.5)
|
89
|
-
heroics (0.0.
|
89
|
+
heroics (0.0.22)
|
90
90
|
erubis (~> 2.0)
|
91
91
|
excon
|
92
92
|
multi_json (>= 1.9.2)
|
93
93
|
hike (1.2.3)
|
94
|
-
hirefire-resource (0.4.
|
94
|
+
hirefire-resource (0.4.2)
|
95
95
|
i18n (0.8.1)
|
96
96
|
journey (1.0.4)
|
97
97
|
json (1.8.6)
|
@@ -106,6 +106,7 @@ GEM
|
|
106
106
|
memfs (1.0.0)
|
107
107
|
method_source (0.8.2)
|
108
108
|
mime-types (1.25.1)
|
109
|
+
moneta (0.8.1)
|
109
110
|
multi_json (1.12.1)
|
110
111
|
multipart-post (2.0.0)
|
111
112
|
nenv (0.3.0)
|
@@ -115,8 +116,10 @@ GEM
|
|
115
116
|
shellany (~> 0.0)
|
116
117
|
octokit (4.7.0)
|
117
118
|
sawyer (~> 0.8.0, >= 0.5.3)
|
118
|
-
|
119
|
-
|
119
|
+
pg (0.20.0)
|
120
|
+
platform-api (2.0.0)
|
121
|
+
heroics (~> 0.0.22)
|
122
|
+
moneta (~> 0.8.1)
|
120
123
|
polyglot (0.3.5)
|
121
124
|
pry (0.10.4)
|
122
125
|
coderay (~> 1.1.0)
|
@@ -212,6 +215,7 @@ DEPENDENCIES
|
|
212
215
|
guard
|
213
216
|
guard-rspec
|
214
217
|
memfs
|
218
|
+
pg
|
215
219
|
pry-byebug
|
216
220
|
rails (~> 3.2)
|
217
221
|
rake (~> 10.0)
|
data/gemfiles/rails_4.gemfile
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
PATH
|
2
2
|
remote: ..
|
3
3
|
specs:
|
4
|
-
roo_on_rails (1.
|
4
|
+
roo_on_rails (1.4.0)
|
5
5
|
dotenv-rails (~> 2.1)
|
6
6
|
hashie (~> 3.4)
|
7
7
|
hirefire-resource
|
8
8
|
newrelic_rpm (~> 3.17)
|
9
9
|
octokit
|
10
|
-
platform-api (~> 0
|
10
|
+
platform-api (~> 2.0)
|
11
11
|
rack-ssl-enforcer
|
12
12
|
rack-timeout
|
13
13
|
rails (>= 3.2.22, < 5.2)
|
@@ -73,7 +73,7 @@ GEM
|
|
73
73
|
dotenv (= 2.2.1)
|
74
74
|
railties (>= 3.2, < 5.2)
|
75
75
|
erubis (2.7.0)
|
76
|
-
excon (0.
|
76
|
+
excon (0.56.0)
|
77
77
|
faraday (0.12.1)
|
78
78
|
multipart-post (>= 1.2, < 3)
|
79
79
|
ffi (1.9.18)
|
@@ -95,11 +95,11 @@ GEM
|
|
95
95
|
guard-compat (~> 1.1)
|
96
96
|
rspec (>= 2.99.0, < 4.0)
|
97
97
|
hashie (3.5.5)
|
98
|
-
heroics (0.0.
|
98
|
+
heroics (0.0.22)
|
99
99
|
erubis (~> 2.0)
|
100
100
|
excon
|
101
101
|
multi_json (>= 1.9.2)
|
102
|
-
hirefire-resource (0.4.
|
102
|
+
hirefire-resource (0.4.2)
|
103
103
|
i18n (0.8.1)
|
104
104
|
json (2.1.0)
|
105
105
|
listen (3.1.5)
|
@@ -118,6 +118,7 @@ GEM
|
|
118
118
|
mime-types-data (3.2016.0521)
|
119
119
|
mini_portile2 (2.1.0)
|
120
120
|
minitest (5.10.1)
|
121
|
+
moneta (0.8.1)
|
121
122
|
multi_json (1.12.1)
|
122
123
|
multipart-post (2.0.0)
|
123
124
|
nenv (0.3.0)
|
@@ -130,8 +131,9 @@ GEM
|
|
130
131
|
octokit (4.7.0)
|
131
132
|
sawyer (~> 0.8.0, >= 0.5.3)
|
132
133
|
pg (0.20.0)
|
133
|
-
platform-api (0.
|
134
|
-
heroics (~> 0.0.
|
134
|
+
platform-api (2.0.0)
|
135
|
+
heroics (~> 0.0.22)
|
136
|
+
moneta (~> 0.8.1)
|
135
137
|
pry (0.10.4)
|
136
138
|
coderay (~> 1.1.0)
|
137
139
|
method_source (~> 0.8.1)
|
@@ -141,7 +143,7 @@ GEM
|
|
141
143
|
pry (~> 0.10)
|
142
144
|
public_suffix (2.0.5)
|
143
145
|
rack (1.6.5)
|
144
|
-
rack-protection (
|
146
|
+
rack-protection (2.0.0)
|
145
147
|
rack
|
146
148
|
rack-ssl-enforcer (0.2.9)
|
147
149
|
rack-test (0.6.3)
|
data/gemfiles/rails_5.gemfile
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
PATH
|
2
2
|
remote: ..
|
3
3
|
specs:
|
4
|
-
roo_on_rails (1.
|
4
|
+
roo_on_rails (1.4.0)
|
5
5
|
dotenv-rails (~> 2.1)
|
6
6
|
hashie (~> 3.4)
|
7
7
|
hirefire-resource
|
8
8
|
newrelic_rpm (~> 3.17)
|
9
9
|
octokit
|
10
|
-
platform-api (~> 0
|
10
|
+
platform-api (~> 2.0)
|
11
11
|
rack-ssl-enforcer
|
12
12
|
rack-timeout
|
13
13
|
rails (>= 3.2.22, < 5.2)
|
@@ -76,7 +76,7 @@ GEM
|
|
76
76
|
dotenv (= 2.2.1)
|
77
77
|
railties (>= 3.2, < 5.2)
|
78
78
|
erubis (2.7.0)
|
79
|
-
excon (0.
|
79
|
+
excon (0.56.0)
|
80
80
|
faraday (0.12.1)
|
81
81
|
multipart-post (>= 1.2, < 3)
|
82
82
|
ffi (1.9.18)
|
@@ -98,11 +98,11 @@ GEM
|
|
98
98
|
guard-compat (~> 1.1)
|
99
99
|
rspec (>= 2.99.0, < 4.0)
|
100
100
|
hashie (3.5.5)
|
101
|
-
heroics (0.0.
|
101
|
+
heroics (0.0.22)
|
102
102
|
erubis (~> 2.0)
|
103
103
|
excon
|
104
104
|
multi_json (>= 1.9.2)
|
105
|
-
hirefire-resource (0.4.
|
105
|
+
hirefire-resource (0.4.2)
|
106
106
|
i18n (0.8.1)
|
107
107
|
json (2.1.0)
|
108
108
|
listen (3.1.5)
|
@@ -121,6 +121,7 @@ GEM
|
|
121
121
|
mime-types-data (3.2016.0521)
|
122
122
|
mini_portile2 (2.1.0)
|
123
123
|
minitest (5.10.1)
|
124
|
+
moneta (0.8.1)
|
124
125
|
multi_json (1.12.1)
|
125
126
|
multipart-post (2.0.0)
|
126
127
|
nenv (0.3.0)
|
@@ -134,8 +135,9 @@ GEM
|
|
134
135
|
octokit (4.7.0)
|
135
136
|
sawyer (~> 0.8.0, >= 0.5.3)
|
136
137
|
pg (0.20.0)
|
137
|
-
platform-api (0.
|
138
|
-
heroics (~> 0.0.
|
138
|
+
platform-api (2.0.0)
|
139
|
+
heroics (~> 0.0.22)
|
140
|
+
moneta (~> 0.8.1)
|
139
141
|
pry (0.10.4)
|
140
142
|
coderay (~> 1.1.0)
|
141
143
|
method_source (~> 0.8.1)
|
@@ -145,7 +147,7 @@ GEM
|
|
145
147
|
pry (~> 0.10)
|
146
148
|
public_suffix (2.0.5)
|
147
149
|
rack (2.0.1)
|
148
|
-
rack-protection (
|
150
|
+
rack-protection (2.0.0)
|
149
151
|
rack
|
150
152
|
rack-ssl-enforcer (0.2.9)
|
151
153
|
rack-test (0.6.3)
|
data/gemfiles/rails_5_1.gemfile
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
PATH
|
2
2
|
remote: ..
|
3
3
|
specs:
|
4
|
-
roo_on_rails (1.
|
4
|
+
roo_on_rails (1.4.0)
|
5
5
|
dotenv-rails (~> 2.1)
|
6
6
|
hashie (~> 3.4)
|
7
7
|
hirefire-resource
|
8
8
|
newrelic_rpm (~> 3.17)
|
9
9
|
octokit
|
10
|
-
platform-api (~> 0
|
10
|
+
platform-api (~> 2.0)
|
11
11
|
rack-ssl-enforcer
|
12
12
|
rack-timeout
|
13
13
|
rails (>= 3.2.22, < 5.2)
|
@@ -77,7 +77,7 @@ GEM
|
|
77
77
|
railties (>= 3.2, < 5.2)
|
78
78
|
erubi (1.6.0)
|
79
79
|
erubis (2.7.0)
|
80
|
-
excon (0.
|
80
|
+
excon (0.56.0)
|
81
81
|
faraday (0.12.1)
|
82
82
|
multipart-post (>= 1.2, < 3)
|
83
83
|
ffi (1.9.18)
|
@@ -99,11 +99,11 @@ GEM
|
|
99
99
|
guard-compat (~> 1.1)
|
100
100
|
rspec (>= 2.99.0, < 4.0)
|
101
101
|
hashie (3.5.5)
|
102
|
-
heroics (0.0.
|
102
|
+
heroics (0.0.22)
|
103
103
|
erubis (~> 2.0)
|
104
104
|
excon
|
105
105
|
multi_json (>= 1.9.2)
|
106
|
-
hirefire-resource (0.4.
|
106
|
+
hirefire-resource (0.4.2)
|
107
107
|
i18n (0.8.1)
|
108
108
|
json (2.1.0)
|
109
109
|
listen (3.1.5)
|
@@ -122,6 +122,7 @@ GEM
|
|
122
122
|
mime-types-data (3.2016.0521)
|
123
123
|
mini_portile2 (2.1.0)
|
124
124
|
minitest (5.10.1)
|
125
|
+
moneta (0.8.1)
|
125
126
|
multi_json (1.12.1)
|
126
127
|
multipart-post (2.0.0)
|
127
128
|
nenv (0.3.0)
|
@@ -135,8 +136,9 @@ GEM
|
|
135
136
|
octokit (4.7.0)
|
136
137
|
sawyer (~> 0.8.0, >= 0.5.3)
|
137
138
|
pg (0.20.0)
|
138
|
-
platform-api (0.
|
139
|
-
heroics (~> 0.0.
|
139
|
+
platform-api (2.0.0)
|
140
|
+
heroics (~> 0.0.22)
|
141
|
+
moneta (~> 0.8.1)
|
140
142
|
pry (0.10.4)
|
141
143
|
coderay (~> 1.1.0)
|
142
144
|
method_source (~> 0.8.1)
|
@@ -146,7 +148,7 @@ GEM
|
|
146
148
|
pry (~> 0.10)
|
147
149
|
public_suffix (2.0.5)
|
148
150
|
rack (2.0.1)
|
149
|
-
rack-protection (
|
151
|
+
rack-protection (2.0.0)
|
150
152
|
rack
|
151
153
|
rack-ssl-enforcer (0.2.9)
|
152
154
|
rack-test (0.6.3)
|
@@ -4,11 +4,13 @@ require 'roo_on_rails/checks/heroku/app_exists'
|
|
4
4
|
require 'roo_on_rails/checks/heroku/preboot_enabled'
|
5
5
|
require 'roo_on_rails/checks/heroku/app_exists'
|
6
6
|
require 'roo_on_rails/checks/sidekiq/settings'
|
7
|
+
require 'roo_on_rails/checks/heroku/drains_metrics'
|
7
8
|
|
8
9
|
module RooOnRails
|
9
10
|
module Checks
|
10
11
|
class Environment < EnvSpecific
|
11
12
|
requires GitHub::BranchProtection
|
13
|
+
requires Heroku::DrainsMetrics
|
12
14
|
requires Heroku::PrebootEnabled
|
13
15
|
requires Sidekiq::Settings
|
14
16
|
|
@@ -14,7 +14,7 @@ module RooOnRails
|
|
14
14
|
def call
|
15
15
|
status, url = shell.run "git config remote.origin.url"
|
16
16
|
fail! "Origin does not seem to be configured." unless status
|
17
|
-
|
17
|
+
|
18
18
|
org, repo = url.strip.sub(%r{\.git$}, '').split(%r{[:/]}).last(2)
|
19
19
|
context.git_org = org
|
20
20
|
context.git_repo = repo
|
@@ -24,4 +24,3 @@ module RooOnRails
|
|
24
24
|
end
|
25
25
|
end
|
26
26
|
end
|
27
|
-
|
@@ -26,7 +26,8 @@ module RooOnRails
|
|
26
26
|
options.merge(
|
27
27
|
required_status_checks: fixed_required_status_checks,
|
28
28
|
required_pull_request_reviews: fixed_pull_request_reviews,
|
29
|
-
restrictions: fixed_restrictions
|
29
|
+
restrictions: fixed_restrictions,
|
30
|
+
enforce_admins: true
|
30
31
|
)
|
31
32
|
)
|
32
33
|
end
|
@@ -35,7 +36,9 @@ module RooOnRails
|
|
35
36
|
|
36
37
|
def ensure_status_checks!
|
37
38
|
status_checks = protection[:required_status_checks] || {}
|
38
|
-
|
39
|
+
enforce_admins = protection[:enforce_admins]
|
40
|
+
fail! 'status checks are not enforced for admins' unless enforce_admins &&
|
41
|
+
enforce_admins[:enabled]
|
39
42
|
|
40
43
|
contexts = status_checks[:contexts] || []
|
41
44
|
ensure_ci_status_check!(contexts)
|
@@ -44,7 +47,7 @@ module RooOnRails
|
|
44
47
|
end
|
45
48
|
|
46
49
|
def ensure_ci_status_check!(contexts)
|
47
|
-
fail! 'no
|
50
|
+
fail! 'no continuous integration status check' unless contexts.include?(ci_context)
|
48
51
|
end
|
49
52
|
|
50
53
|
def ensure_analysis_status_check!(contexts)
|
@@ -58,20 +61,24 @@ module RooOnRails
|
|
58
61
|
|
59
62
|
def ensure_code_reviews!
|
60
63
|
reviews = protection[:required_pull_request_reviews] || {}
|
61
|
-
fail! 'code
|
64
|
+
fail! 'code approvals should be dismissed on push' unless reviews[:dismiss_stale_reviews]
|
65
|
+
|
66
|
+
users = reviews.dig(:dismissal_restrictions, :users)
|
67
|
+
teams = reviews.dig(:dismissal_restrictions, :teams)
|
68
|
+
fail! 'review dismissal restrictions should be enabled' if users.nil? || teams.nil?
|
69
|
+
fail! 'nobody should be allowed to dismiss reviews' if users.any? || teams.any?
|
62
70
|
end
|
63
71
|
|
64
72
|
def ensure_no_push!
|
65
73
|
users = protection.dig(:restrictions, :users)
|
66
74
|
teams = protection.dig(:restrictions, :teams)
|
67
75
|
fail! 'push restrictions should be enabled' if users.nil? || teams.nil?
|
68
|
-
fail! '
|
76
|
+
fail! 'nobody should be allowed to push to master' if users.any? || teams.any?
|
69
77
|
end
|
70
78
|
|
71
79
|
def fixed_required_status_checks
|
72
80
|
status_checks = protection[:required_status_checks] || {}
|
73
81
|
status_checks.merge(
|
74
|
-
include_admins: true,
|
75
82
|
contexts: (status_checks[:contexts] || []) | [
|
76
83
|
ci_context,
|
77
84
|
analysis_context,
|
@@ -82,7 +89,10 @@ module RooOnRails
|
|
82
89
|
|
83
90
|
def fixed_pull_request_reviews
|
84
91
|
reviews = protection[:required_pull_request_reviews] || {}
|
85
|
-
reviews.merge(
|
92
|
+
reviews.merge(
|
93
|
+
dismiss_stale_reviews: true,
|
94
|
+
dismissal_restrictions: { users: [], teams: [] }
|
95
|
+
)
|
86
96
|
end
|
87
97
|
|
88
98
|
def fixed_restrictions
|
@@ -7,7 +7,7 @@ module RooOnRails
|
|
7
7
|
module Checks
|
8
8
|
module Heroku
|
9
9
|
# Check if a corresponding app exists on Heroku (for a given environment)
|
10
|
-
#
|
10
|
+
#
|
11
11
|
# Input context
|
12
12
|
# - git_repo: the name of the repository
|
13
13
|
# - heroku.api_client: a connected PlatformAPI client
|
@@ -31,7 +31,8 @@ module RooOnRails
|
|
31
31
|
end
|
32
32
|
|
33
33
|
if matches.many?
|
34
|
-
|
34
|
+
list = candidates.map { |c| bold c }.join(', ')
|
35
|
+
final_fail! "multiple matching apps detected: #{list}"
|
35
36
|
end
|
36
37
|
|
37
38
|
context.heroku.app![env] = matches.first
|
@@ -0,0 +1,58 @@
|
|
1
|
+
require 'roo_on_rails/checks/env_specific'
|
2
|
+
require 'roo_on_rails/checks/git/origin'
|
3
|
+
require 'roo_on_rails/checks/heroku/app_exists'
|
4
|
+
require 'roo_on_rails/checks/heroku/metrics_bridge_configured'
|
5
|
+
require 'uri'
|
6
|
+
|
7
|
+
module RooOnRails
|
8
|
+
module Checks
|
9
|
+
module Heroku
|
10
|
+
# Checks that the app is configured to send its logs to the Heroku-Datadog
|
11
|
+
# metrics bridge.
|
12
|
+
#
|
13
|
+
# Input context
|
14
|
+
# - heroku.api_client: a connected PlatformAPI client
|
15
|
+
# - heroku.app.{env}: an existing app name.
|
16
|
+
# - heroku.metric_bridge_token.{env}: the password for the metrics bridge
|
17
|
+
class DrainsMetrics < EnvSpecific
|
18
|
+
requires Heroku::AppExists, MetricsBridgeConfigured
|
19
|
+
|
20
|
+
def intro
|
21
|
+
"Checking for metrics drain on #{bold app_name}"
|
22
|
+
end
|
23
|
+
|
24
|
+
def call
|
25
|
+
url = client.log_drain.list(app_name).
|
26
|
+
map { |h| h['url'] }.
|
27
|
+
find { |u| u.include? MetricsBridgeConfigured::BRIDGE_APP }
|
28
|
+
|
29
|
+
fail! 'No matching drain found' if url.nil?
|
30
|
+
final_fail! 'Misconfigured drain found' if url != drain_uri
|
31
|
+
pass 'Drain is connected'
|
32
|
+
end
|
33
|
+
|
34
|
+
private
|
35
|
+
|
36
|
+
def fix
|
37
|
+
client.log_drain.create(app_name, url: drain_uri)
|
38
|
+
end
|
39
|
+
|
40
|
+
def drain_uri
|
41
|
+
'https://%s:%s@%s.herokuapp.com' % [
|
42
|
+
app_name,
|
43
|
+
context.heroku.metric_bridge_token![env],
|
44
|
+
MetricsBridgeConfigured::BRIDGE_APP
|
45
|
+
]
|
46
|
+
end
|
47
|
+
|
48
|
+
def app_name
|
49
|
+
context.heroku.app[env]
|
50
|
+
end
|
51
|
+
|
52
|
+
def client
|
53
|
+
context.heroku.api_client
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
require 'roo_on_rails/checks/env_specific'
|
2
|
+
require 'roo_on_rails/checks/git/origin'
|
3
|
+
require 'roo_on_rails/checks/heroku/app_exists'
|
4
|
+
require 'securerandom'
|
5
|
+
require 'set'
|
6
|
+
|
7
|
+
module RooOnRails
|
8
|
+
module Checks
|
9
|
+
module Heroku
|
10
|
+
# Checks that the Heroku-Datadog metrics bridge is configured to accept
|
11
|
+
# logs from the app.
|
12
|
+
#
|
13
|
+
# Input context
|
14
|
+
# - heroku.api_client: a connected PlatformAPI client
|
15
|
+
# - heroku.app.{env}: an existing app name.
|
16
|
+
#
|
17
|
+
# Output context:
|
18
|
+
# - heroku.metric_bridge_token.{env}: the password for the metrics bridge
|
19
|
+
class MetricsBridgeConfigured < EnvSpecific
|
20
|
+
requires Heroku::AppExists
|
21
|
+
|
22
|
+
BRIDGE_APP = 'roo-dd-bridge-production'.freeze
|
23
|
+
|
24
|
+
def intro
|
25
|
+
"Checking whether metrics bridge is configured for #{bold app_name}"
|
26
|
+
end
|
27
|
+
|
28
|
+
def call
|
29
|
+
config = current_config
|
30
|
+
names = config[app_list_var].split(',')
|
31
|
+
|
32
|
+
fail! 'Bridge does not allow this app' unless names.include? app_name
|
33
|
+
fail! 'Bridge lacks credentials for this app' unless config[token_var]
|
34
|
+
fail! 'Bridge lacks tags for this app' unless config[tags_var]
|
35
|
+
|
36
|
+
pass 'Bridge is configured'
|
37
|
+
context.heroku.metric_bridge_token![env] = config[token_var]
|
38
|
+
end
|
39
|
+
|
40
|
+
private
|
41
|
+
|
42
|
+
def fix
|
43
|
+
app_list = Set.new current_config.fetch(app_list_var, '').split(',')
|
44
|
+
app_list << app_name
|
45
|
+
client.config_var.update(
|
46
|
+
BRIDGE_APP,
|
47
|
+
tags_var => "app:#{app_name}",
|
48
|
+
token_var => SecureRandom.hex(16),
|
49
|
+
app_list_var => app_list.to_a.join(',')
|
50
|
+
)
|
51
|
+
end
|
52
|
+
|
53
|
+
def current_config
|
54
|
+
client.config_var.info_for_app(BRIDGE_APP)
|
55
|
+
end
|
56
|
+
|
57
|
+
def app_list_var
|
58
|
+
'ALLOWED_APPS'
|
59
|
+
end
|
60
|
+
|
61
|
+
def tags_var
|
62
|
+
'%s_TAGS' % app_name.upcase
|
63
|
+
end
|
64
|
+
|
65
|
+
def token_var
|
66
|
+
'%s_PASSWORD' % app_name.upcase
|
67
|
+
end
|
68
|
+
|
69
|
+
def app_name
|
70
|
+
context.heroku.app[env]
|
71
|
+
end
|
72
|
+
|
73
|
+
def client
|
74
|
+
context.heroku.api_client
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
data/lib/roo_on_rails/checks.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
module RooOnRails
|
2
2
|
module Railties
|
3
3
|
class Database < Rails::Railtie
|
4
|
-
|
5
|
-
|
4
|
+
initializer 'roo_on_rails.database', after: 'active_record.initialize_database' do
|
5
|
+
ActiveSupport.on_load :active_record do
|
6
6
|
$stderr.puts 'initializer roo_on_rails.database'
|
7
7
|
|
8
8
|
config = ActiveRecord::Base.configurations[Rails.env]
|
@@ -1,27 +1,29 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
1
|
+
if defined?(ActiveRecord)
|
2
|
+
namespace :db do
|
3
|
+
desc 'Prints out the database statement timeout'
|
4
|
+
task statement_timeout: :environment do
|
5
|
+
result = ActiveRecord::Base.connection.execute('SHOW statement_timeout').first
|
6
|
+
puts result['statement_timeout']
|
7
|
+
end
|
7
8
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
9
|
+
namespace :migrate do
|
10
|
+
task extend_statement_timeout: :environment do
|
11
|
+
if ActiveRecord::VERSION::MAJOR >= 4
|
12
|
+
config = ActiveRecord::Base.configurations[Rails.env]
|
13
|
+
config['variables'] ||= {}
|
14
|
+
config['variables']['statement_timeout'] = ENV.fetch('MIGRATION_STATEMENT_TIMEOUT', 10_000)
|
15
|
+
ActiveRecord::Base.establish_connection
|
16
|
+
end
|
15
17
|
end
|
16
18
|
end
|
17
19
|
end
|
18
|
-
end
|
19
20
|
|
20
|
-
%i[
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
].each do |task|
|
26
|
-
|
21
|
+
%i[
|
22
|
+
db:create
|
23
|
+
db:migrate
|
24
|
+
db:migrate:down
|
25
|
+
db:rollback
|
26
|
+
].each do |task|
|
27
|
+
Rake::Task[task].enhance(%i[db:migrate:extend_statement_timeout])
|
28
|
+
end
|
27
29
|
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
namespace :newrelic do
|
2
|
+
desc 'Notifies New Relic that a deployment has occurred'
|
3
|
+
task notice_deployment: :environment do
|
4
|
+
begin
|
5
|
+
require 'newrelic_rpm'
|
6
|
+
require 'new_relic/cli/command'
|
7
|
+
|
8
|
+
appname = ENV.fetch('NEW_RELIC_APP_NAME')
|
9
|
+
|
10
|
+
Rails.logger.info("Notifying New Relic of deployment to #{appname}")
|
11
|
+
NewRelic::Cli::Deployments.new(
|
12
|
+
environment: Rails.env.to_s,
|
13
|
+
revision: ENV.fetch('SOURCE_VERSION', 'unknown'),
|
14
|
+
changelog: '',
|
15
|
+
description: '',
|
16
|
+
appname: appname,
|
17
|
+
user: '',
|
18
|
+
license_key: ENV.fetch('NEW_RELIC_LICENSE_KEY')
|
19
|
+
).run
|
20
|
+
rescue => e
|
21
|
+
Rails.logger.error("Failed to notify New Relic (#{e.class.name}: #{e.message})")
|
22
|
+
Rails.logger.info(e.backtrace.take(10).join("\n"))
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
data/lib/roo_on_rails/version.rb
CHANGED
data/roo_on_rails.gemspec
CHANGED
@@ -24,7 +24,7 @@ Gem::Specification.new do |spec|
|
|
24
24
|
spec.add_runtime_dependency 'dotenv-rails', '~> 2.1'
|
25
25
|
spec.add_runtime_dependency 'newrelic_rpm', '~> 3.17'
|
26
26
|
spec.add_runtime_dependency 'rails', '>= 3.2.22', '< 5.2'
|
27
|
-
spec.add_runtime_dependency 'platform-api', '~> 0
|
27
|
+
spec.add_runtime_dependency 'platform-api', '~> 2.0'
|
28
28
|
spec.add_runtime_dependency 'hashie', '~> 3.4'
|
29
29
|
spec.add_runtime_dependency 'rack-timeout'
|
30
30
|
spec.add_runtime_dependency 'rack-ssl-enforcer'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: roo_on_rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Julien Letessier
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-06-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: dotenv-rails
|
@@ -64,14 +64,14 @@ dependencies:
|
|
64
64
|
requirements:
|
65
65
|
- - "~>"
|
66
66
|
- !ruby/object:Gem::Version
|
67
|
-
version: '0
|
67
|
+
version: '2.0'
|
68
68
|
type: :runtime
|
69
69
|
prerelease: false
|
70
70
|
version_requirements: !ruby/object:Gem::Requirement
|
71
71
|
requirements:
|
72
72
|
- - "~>"
|
73
73
|
- !ruby/object:Gem::Version
|
74
|
-
version: '0
|
74
|
+
version: '2.0'
|
75
75
|
- !ruby/object:Gem::Dependency
|
76
76
|
name: hashie
|
77
77
|
requirement: !ruby/object:Gem::Requirement
|
@@ -276,6 +276,7 @@ executables:
|
|
276
276
|
extensions: []
|
277
277
|
extra_rdoc_files: []
|
278
278
|
files:
|
279
|
+
- ".codeclimate.yml"
|
279
280
|
- ".codecov.yml"
|
280
281
|
- ".gitignore"
|
281
282
|
- ".rspec"
|
@@ -311,7 +312,9 @@ files:
|
|
311
312
|
- lib/roo_on_rails/checks/github/token.rb
|
312
313
|
- lib/roo_on_rails/checks/helpers.rb
|
313
314
|
- lib/roo_on_rails/checks/heroku/app_exists.rb
|
315
|
+
- lib/roo_on_rails/checks/heroku/drains_metrics.rb
|
314
316
|
- lib/roo_on_rails/checks/heroku/login.rb
|
317
|
+
- lib/roo_on_rails/checks/heroku/metrics_bridge_configured.rb
|
315
318
|
- lib/roo_on_rails/checks/heroku/preboot_enabled.rb
|
316
319
|
- lib/roo_on_rails/checks/heroku/token.rb
|
317
320
|
- lib/roo_on_rails/checks/heroku/toolbelt_installed.rb
|
@@ -336,6 +339,7 @@ files:
|
|
336
339
|
- lib/roo_on_rails/sidekiq/settings.rb
|
337
340
|
- lib/roo_on_rails/sidekiq/sla_metric.rb
|
338
341
|
- lib/roo_on_rails/tasks/db.rake
|
342
|
+
- lib/roo_on_rails/tasks/newrelic.rake
|
339
343
|
- lib/roo_on_rails/version.rb
|
340
344
|
- roo_on_rails.gemspec
|
341
345
|
homepage: https://github.com/deliveroo/roo_on_rails
|