dont_deploy_debug 0.1.1
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 +15 -0
- data/.gitignore +17 -0
- data/Gemfile +3 -0
- data/LICENSE.txt +22 -0
- data/README.md +200 -0
- data/Rakefile +1 -0
- data/dont_deploy_debug.gemspec +23 -0
- data/lib/capistrano/dont_deploy_debug.rb +92 -0
- data/lib/dont_deploy_debug.rb +1 -0
- metadata +94 -0
checksums.yaml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
---
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
ZGM1OTAxZWEwM2M2Y2VlOGQ2MDI0MjE5OTA0Y2VkMmM1NzczODAwZg==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
MTRmY2JlODhmNTRjYzkwZmE0MjRkMjY2ZWJkZGNlZTcwYjdiYmNlNQ==
|
7
|
+
SHA512:
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
MDZkZDFhNjA2ZmU0OTA2NzQ3YzdiM2Y3MGVjODI1M2ViOWQwMThmMmEzZTFj
|
10
|
+
MzNiMzUzN2M4YjJkMTJiZGFlZDNkMWJjMjgxZjU2ODc0YWU3ZTAxMDgzNjk2
|
11
|
+
ZWQ3MDc4NDkyNTYyNzQ2MTIyNWY5MzQ5MmM2ZGI0MjA3Y2FkMjc=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
MzZlYjM5NzE5YWFhNWJiYWM0ZmI1NGI3ZjRmMjg4NTY0YTI0YThjNTAxZTQ2
|
14
|
+
ODI3OWY3ZjdmOWI2OTg2NWVmYTk2OTZlYTZhNjZkYjEyNjFmMjFmMzNkMjgy
|
15
|
+
NTc4Y2JiMDIwMGQ5NzJjZGE3MmI1MDNjZDFkZDFmY2RhZmI3ODI=
|
data/.gitignore
ADDED
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2013 Matthew Nielsen
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,200 @@
|
|
1
|
+
# DontDeployDebug
|
2
|
+
## A gem against brain-farts.
|
3
|
+
|
4
|
+
How many times have you accidentally committed a debug statement and deployed
|
5
|
+
it? To production? Ugh! I've been there, brothers and sisters! I've done it
|
6
|
+
more times than I care to remember. So many that I finally decided to do
|
7
|
+
something about it.
|
8
|
+
|
9
|
+
## What?
|
10
|
+
|
11
|
+
It prevents code that has debug statements included from being deployed by
|
12
|
+
Capistrano, along with a message about what was found and where to find it.
|
13
|
+
|
14
|
+
Example:
|
15
|
+
|
16
|
+
```
|
17
|
+
triggering after callbacks for `deploy:finalize_update'
|
18
|
+
* 2013-11-05 16:38:44 executing `deploy:find_ruby_breakpoints'
|
19
|
+
* executing "find /home/deploy/app/releases/20131105233842 -name \"*.rb\" -exec grep -Hn --regex \"[debugger|binding\\.pry]\" {} \\;"
|
20
|
+
servers: ["server.example.org"]
|
21
|
+
[server.example.org] executing command
|
22
|
+
command finished in 621ms
|
23
|
+
|
24
|
+
*** Ruby debugger breakpoint found in deployed code. Deploy halted. ***
|
25
|
+
|
26
|
+
There was code found that contains debugging breakpoints:
|
27
|
+
|
28
|
+
/testfile.rb:3:require 'ruby-debug'; debugger
|
29
|
+
|
30
|
+
Please remove the code, commit the change and try your deploy again.
|
31
|
+
If you feel you have reached this message in error, please consult
|
32
|
+
https://github.com/xunker/dont_deploy_debug to learn how to exclude
|
33
|
+
certain files, or how to tune the detection parameters. To override
|
34
|
+
this check, set the 'IGNORE_RUBY_BREAKPOINTS' variable to true:
|
35
|
+
|
36
|
+
$ IGNORE_RUBY_BREAKPOINTS=true cap <environment> deploy
|
37
|
+
|
38
|
+
*** [deploy:update_code] rolling back
|
39
|
+
* executing "rm -rf /home/deploy/app/releases/20131105233842; true"
|
40
|
+
servers: ["server.example.org"]
|
41
|
+
[server.example.org] executing command
|
42
|
+
command finished in 159ms
|
43
|
+
```
|
44
|
+
|
45
|
+
## Why?
|
46
|
+
|
47
|
+
Because even the rockstar-iest of ninjas sometimes forget to remove a 'debug'.
|
48
|
+
|
49
|
+
## How?
|
50
|
+
|
51
|
+
It's a gem that hooks in to your Capistrano deploy process. After the code is
|
52
|
+
updated on the server, but before it's made "live", the gem scans the release
|
53
|
+
path for ruby source files that have "debug" statements in them. If any are
|
54
|
+
found, the deploy is halted and rolled back, and a list of the offending files
|
55
|
+
is displayed to the user.
|
56
|
+
|
57
|
+
By default, the gem looks for statements in `*.rb` that are like:
|
58
|
+
|
59
|
+
```ruby
|
60
|
+
require 'ruby-debug'; debugger
|
61
|
+
|
62
|
+
require 'ruby-debug'
|
63
|
+
debugger
|
64
|
+
|
65
|
+
debugger;
|
66
|
+
|
67
|
+
binding.pry
|
68
|
+
```
|
69
|
+
|
70
|
+
The gem will ignore `test/*`, `spec/*`, `features/*` and `config/deploy.rb`.
|
71
|
+
|
72
|
+
## Ruby only?
|
73
|
+
|
74
|
+
Yes, for now. But if there is any interest it could be easily modified for
|
75
|
+
any language where the source was parsable on the deployment server.
|
76
|
+
|
77
|
+
## Installation
|
78
|
+
|
79
|
+
Add this line to your application's Gemfile:
|
80
|
+
|
81
|
+
gem 'dont_deploy_debug', :require => false
|
82
|
+
|
83
|
+
Or from the command line if you aren't using bunder:
|
84
|
+
|
85
|
+
$ gem install dont_deploy_debug
|
86
|
+
|
87
|
+
Then, add the following to your Capistrano `deploy.rb`:
|
88
|
+
|
89
|
+
require 'capistrano/dont_deploy_debug'
|
90
|
+
|
91
|
+
For basic usage, this is all that is required.
|
92
|
+
|
93
|
+
## Configuration
|
94
|
+
|
95
|
+
### Enable or disable the check
|
96
|
+
|
97
|
+
Be default, every deploy will be checked regardless of environment. This can
|
98
|
+
be set programmatically by altering the 'skip_ruby_breakpoint_check' setting
|
99
|
+
in your deloy.rb file:
|
100
|
+
|
101
|
+
```ruby
|
102
|
+
# turn off for all
|
103
|
+
set :skip_ruby_breakpoint_check, true
|
104
|
+
|
105
|
+
# skip on stage
|
106
|
+
set :skip_ruby_breakpoint_check, (fetch(:rails_env) == 'stage')
|
107
|
+
|
108
|
+
# on for everyone (default)
|
109
|
+
set :skip_ruby_breakpoint_check, false
|
110
|
+
```
|
111
|
+
|
112
|
+
### Files to exclude from check
|
113
|
+
|
114
|
+
By default, `test/*`, `spec/*`, `features/*` and `config/deploy.rb` are
|
115
|
+
ignored. You can modify this behaviour by changing the
|
116
|
+
'exclude_from_ruby_breakpoint_check' setting in your deploy.rb and adding or
|
117
|
+
removing regular expressions:
|
118
|
+
|
119
|
+
```ruby
|
120
|
+
set :exclude_from_ruby_breakpoint_check, [
|
121
|
+
/^\.\/config\/deploy\.rb$/,
|
122
|
+
/^\.\/spec\//,
|
123
|
+
/^\.\/test\//,
|
124
|
+
/^\.\/features\//,
|
125
|
+
/^\.\/something_else_here\//,
|
126
|
+
]
|
127
|
+
```
|
128
|
+
|
129
|
+
### Breakpoint patterns
|
130
|
+
|
131
|
+
By default, the gem will look for variations of:
|
132
|
+
|
133
|
+
```ruby
|
134
|
+
require 'ruby-debug'; debugger
|
135
|
+
|
136
|
+
binding.pry
|
137
|
+
```
|
138
|
+
|
139
|
+
This can be changed by altering the "ruby_breakpoint_patterns" setting in your
|
140
|
+
`deploy.rb` and adding or removing regular expressions:
|
141
|
+
|
142
|
+
```ruby
|
143
|
+
set :ruby_breakpoint_patterns, [
|
144
|
+
/require [\'\"]ruby-debug[\'\"][;\n]\s*debugger/,
|
145
|
+
/^\s*debugger[;\n]/,
|
146
|
+
/^\s*debugger\s*$/,
|
147
|
+
/\bbinding\.pry\b/,
|
148
|
+
/some_other_debugger/
|
149
|
+
]
|
150
|
+
```
|
151
|
+
|
152
|
+
### Server-side grep command
|
153
|
+
|
154
|
+
To first find the files, the gem executes a grep() of the release path to get
|
155
|
+
"coarse" list of files and then lets ruby do the actual check. The command
|
156
|
+
used by default is:
|
157
|
+
|
158
|
+
```
|
159
|
+
find #{release_path} -name "*.rb" -exec grep -Hn --regex "[debugger|binding\.pry]" {} \\;
|
160
|
+
```
|
161
|
+
|
162
|
+
A find() and grep() is used instead of a recursive grep because I have no way
|
163
|
+
of knowing if you are deploying to system with BSD, SYSV or GNU style tools.
|
164
|
+
|
165
|
+
You can change this command in your `deploy.rb` with the
|
166
|
+
"ruby_breakpoint_grep_command" setting:
|
167
|
+
|
168
|
+
```ruby
|
169
|
+
# default value is:
|
170
|
+
# Proc.new { "find #{release_path} -name \"*.rb\" -exec grep -Hn #{fetch(:ruby_breakpoint_trigger)} {} \\;" }
|
171
|
+
|
172
|
+
# pass it a Proc object so we can read release_path and other variables
|
173
|
+
# It MUST return a string
|
174
|
+
set :ruby_breakpoint_grep_command, Proc.new { "some better grep here" }
|
175
|
+
```
|
176
|
+
|
177
|
+
If you only want to change the pattern that grep() uses, you can set
|
178
|
+
"ruby_breakpoint_trigger" instead:
|
179
|
+
|
180
|
+
```ruby
|
181
|
+
# default value is '--regex "[debugger|binding\.pry]"'
|
182
|
+
set :ruby_breakpoint_trigger, "some_other_pattern"
|
183
|
+
```
|
184
|
+
|
185
|
+
### Skipping check from command line
|
186
|
+
|
187
|
+
Finally, if you just want to deploy the damn'ed thing and skip the check
|
188
|
+
temporarily, you can set the "IGNORE_RUBY_BREAKPOINTS" shell variable:
|
189
|
+
|
190
|
+
```
|
191
|
+
$ IGNORE_RUBY_BREAKPOINTS=true cap <environment> deploy
|
192
|
+
```
|
193
|
+
|
194
|
+
## Caveats
|
195
|
+
|
196
|
+
This gem has not been throughly tested in any way. Like seriously. I use it,
|
197
|
+
but I'm the only one so far. I know it works on Redhat linux and it will likely
|
198
|
+
work in most linuxes. It *should* work on any BSD system, but YMMV.
|
199
|
+
|
200
|
+
If you find a case where it doesn't work please let me know.
|
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
|
5
|
+
Gem::Specification.new do |spec|
|
6
|
+
spec.name = "dont_deploy_debug"
|
7
|
+
spec.version = "0.1.1"
|
8
|
+
spec.authors = ["Matthew Nielsen"]
|
9
|
+
spec.email = ["xunker@pyxidis.org"]
|
10
|
+
spec.description = %q{Don't allow a capistrano deploy if code contains ruby debug statements}
|
11
|
+
spec.summary = %q{Don't allow a capistrano deploy if code contains ruby debug statements}
|
12
|
+
spec.homepage = "https://github.com/xunker/dont_deploy_debug"
|
13
|
+
spec.license = "MIT"
|
14
|
+
|
15
|
+
spec.files = `git ls-files`.split($/)
|
16
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
17
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
18
|
+
spec.require_paths = ["lib"]
|
19
|
+
|
20
|
+
spec.add_dependency 'capistrano'
|
21
|
+
spec.add_development_dependency "bundler", "~> 1.3"
|
22
|
+
spec.add_development_dependency "rake"
|
23
|
+
end
|
@@ -0,0 +1,92 @@
|
|
1
|
+
require 'capistrano'
|
2
|
+
|
3
|
+
module Capistrano
|
4
|
+
module DontDeployDebug
|
5
|
+
def contains_ruby_breakpoint?(ruby_code)
|
6
|
+
ruby_code = ruby_code.split('#').first.strip
|
7
|
+
return false if ruby_code.size < 1
|
8
|
+
fetch(:ruby_breakpoint_patterns).each do |pattern|
|
9
|
+
return true if ruby_code =~ pattern
|
10
|
+
end
|
11
|
+
false
|
12
|
+
end
|
13
|
+
|
14
|
+
def exclude_from_ruby_breakpint_check?(file_path)
|
15
|
+
fetch(:exclude_from_ruby_breakpoint_check).each do |pattern|
|
16
|
+
return true if file_path =~ pattern
|
17
|
+
end
|
18
|
+
false
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
include Capistrano::DontDeployDebug
|
24
|
+
|
25
|
+
configuration = Capistrano::Configuration.respond_to?(:instance) ?
|
26
|
+
Capistrano::Configuration.instance(:must_exist) :
|
27
|
+
Capistrano.configuration(:must_exist)
|
28
|
+
|
29
|
+
configuration.load do
|
30
|
+
|
31
|
+
set :exclude_from_ruby_breakpoint_check, [
|
32
|
+
/^\.\/config\/deploy\.rb$/,
|
33
|
+
/^\.\/spec\//,
|
34
|
+
/^\.\/test\//,
|
35
|
+
/^\.\/features\//
|
36
|
+
]
|
37
|
+
|
38
|
+
set :ruby_breakpoint_patterns, [
|
39
|
+
/require [\'\"]ruby-debug[\'\"][;\n]\s*debugger/,
|
40
|
+
/^\s*debugger[;\n]/,
|
41
|
+
/^\s*debugger\s*$/,
|
42
|
+
/\bbinding\.pry\b/
|
43
|
+
]
|
44
|
+
|
45
|
+
set :ruby_breakpoint_trigger, '--regex "[debugger|binding\.pry]"'
|
46
|
+
|
47
|
+
set :ruby_breakpoint_grep_command, Proc.new { "find #{release_path} -name \"*.rb\" -exec grep -Hn #{fetch(:ruby_breakpoint_trigger)} {} \\;" }
|
48
|
+
|
49
|
+
set :skip_ruby_breakpoint_check, false
|
50
|
+
|
51
|
+
after "deploy:finalize_update", "deploy:find_ruby_breakpoints"
|
52
|
+
|
53
|
+
namespace :deploy do
|
54
|
+
task :find_ruby_breakpoints do
|
55
|
+
if fetch(:skip_ruby_breakpoint_check) || ENV['IGNORE_RUBY_BREAKPOINTS'].to_s != "true"
|
56
|
+
files = capture(fetch(:ruby_breakpoint_grep_command)).to_s.split("\n")
|
57
|
+
found = []
|
58
|
+
files.each do |f|
|
59
|
+
(file_path, line_number, ruby_code) = f.split(':', 3)
|
60
|
+
next if exclude_from_ruby_breakpint_check?(file_path)
|
61
|
+
next unless contains_ruby_breakpoint?(ruby_code)
|
62
|
+
found << [file_path.sub(release_path,''), line_number, ruby_code]
|
63
|
+
end
|
64
|
+
|
65
|
+
if found.size>0
|
66
|
+
message = [
|
67
|
+
"",
|
68
|
+
"*** Ruby debugger breakpoint found in deployed code. Deploy halted. ***",
|
69
|
+
"",
|
70
|
+
"There was code found that contains debugging breakpoints:",
|
71
|
+
""
|
72
|
+
]
|
73
|
+
found.each { |f| message << "\t#{f.join(':')}" }
|
74
|
+
message += [
|
75
|
+
"",
|
76
|
+
"Please remove the code, commit the change and try your deploy again.",
|
77
|
+
"If you feel you have reached this message in error, please consult",
|
78
|
+
"https://github.com/xunker/dont_deploy_debug to learn how to exclude",
|
79
|
+
"certain files, or how to tune the detection parameters. To override",
|
80
|
+
"this check, set the 'IGNORE_RUBY_BREAKPOINTS' variable to true:",
|
81
|
+
"",
|
82
|
+
"\t$ IGNORE_RUBY_BREAKPOINTS=true cap <environment> deploy",
|
83
|
+
"\n"
|
84
|
+
]
|
85
|
+
abort(message.join("\n"))
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
abort("You're testing. I'm stopping now.") if ENV['TESTING_DDD']
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
require 'capistrano/dont_deploy_debug'
|
metadata
ADDED
@@ -0,0 +1,94 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: dont_deploy_debug
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Matthew Nielsen
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2013-11-05 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: capistrano
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ! '>='
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ! '>='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: bundler
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ~>
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '1.3'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ~>
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '1.3'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rake
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ! '>='
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ! '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
description: Don't allow a capistrano deploy if code contains ruby debug statements
|
56
|
+
email:
|
57
|
+
- xunker@pyxidis.org
|
58
|
+
executables: []
|
59
|
+
extensions: []
|
60
|
+
extra_rdoc_files: []
|
61
|
+
files:
|
62
|
+
- .gitignore
|
63
|
+
- Gemfile
|
64
|
+
- LICENSE.txt
|
65
|
+
- README.md
|
66
|
+
- Rakefile
|
67
|
+
- dont_deploy_debug.gemspec
|
68
|
+
- lib/capistrano/dont_deploy_debug.rb
|
69
|
+
- lib/dont_deploy_debug.rb
|
70
|
+
homepage: https://github.com/xunker/dont_deploy_debug
|
71
|
+
licenses:
|
72
|
+
- MIT
|
73
|
+
metadata: {}
|
74
|
+
post_install_message:
|
75
|
+
rdoc_options: []
|
76
|
+
require_paths:
|
77
|
+
- lib
|
78
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ! '>='
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
84
|
+
requirements:
|
85
|
+
- - ! '>='
|
86
|
+
- !ruby/object:Gem::Version
|
87
|
+
version: '0'
|
88
|
+
requirements: []
|
89
|
+
rubyforge_project:
|
90
|
+
rubygems_version: 2.1.10
|
91
|
+
signing_key:
|
92
|
+
specification_version: 4
|
93
|
+
summary: Don't allow a capistrano deploy if code contains ruby debug statements
|
94
|
+
test_files: []
|