blazing 0.0.4 → 0.0.5
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +1 -0
- data/.rvmrc +49 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +25 -2
- data/Guardfile +9 -0
- data/MIT-LICENCE +20 -0
- data/README.md +96 -47
- data/Rakefile +8 -0
- data/blazing.gemspec +4 -0
- data/index.html +111 -0
- data/lib/blazing.rb +2 -3
- data/lib/blazing/cli/base.rb +7 -10
- data/lib/blazing/cli/create.rb +2 -2
- data/lib/blazing/logger.rb +33 -22
- data/lib/blazing/recipe.rb +60 -18
- data/lib/blazing/recipes/bundler_recipe.rb +14 -0
- data/lib/blazing/recipes/rvm_recipe.rb +15 -0
- data/lib/blazing/remote.rb +41 -22
- data/lib/blazing/target.rb +6 -7
- data/lib/blazing/version.rb +1 -1
- data/spec/blazing/recipe_spec.rb +90 -0
- data/spec/blazing/remote_spec.rb +13 -0
- data/spec/spec_helper.rb +4 -0
- metadata +39 -18
data/.gitignore
CHANGED
data/.rvmrc
ADDED
@@ -0,0 +1,49 @@
|
|
1
|
+
#!/usr/bin/env bash
|
2
|
+
|
3
|
+
# This is an RVM Project .rvmrc file, used to automatically load the ruby
|
4
|
+
# development environment upon cd'ing into the directory
|
5
|
+
|
6
|
+
# First we specify our desired <ruby>[@<gemset>], the @gemset name is optional.
|
7
|
+
environment_id="ruby-1.9.2-p180@blazing"
|
8
|
+
|
9
|
+
#
|
10
|
+
# First we attempt to load the desired environment directly from the environment
|
11
|
+
# file. This is very fast and efficicent compared to running through the entire
|
12
|
+
# CLI and selector. If you want feedback on which environment was used then
|
13
|
+
# insert the word 'use' after --create as this triggers verbose mode.
|
14
|
+
#
|
15
|
+
if [[ -d "${rvm_path:-$HOME/.rvm}/environments" \
|
16
|
+
&& -s "${rvm_path:-$HOME/.rvm}/environments/$environment_id" ]] ; then
|
17
|
+
\. "${rvm_path:-$HOME/.rvm}/environments/$environment_id"
|
18
|
+
|
19
|
+
[[ -s ".rvm/hooks/after_use" ]] && . ".rvm/hooks/after_use"
|
20
|
+
else
|
21
|
+
# If the environment file has not yet been created, use the RVM CLI to select.
|
22
|
+
rvm --create "$environment_id"
|
23
|
+
fi
|
24
|
+
|
25
|
+
#
|
26
|
+
# If you use an RVM gemset file to install a list of gems (*.gems), you can have
|
27
|
+
# it be automatically loaded. Uncomment the following and adjust the filename if
|
28
|
+
# necessary.
|
29
|
+
#
|
30
|
+
# filename=".gems"
|
31
|
+
# if [[ -s "$filename" ]] ; then
|
32
|
+
# rvm gemset import "$filename" | grep -v already | grep -v listed | grep -v complete | sed '/^$/d'
|
33
|
+
# fi
|
34
|
+
|
35
|
+
#
|
36
|
+
# If you use bundler and would like to run bundle each time you enter the
|
37
|
+
# directory, you can uncomment the following code.
|
38
|
+
#
|
39
|
+
# # Ensure that Bundler is installed. Install it if it is not.
|
40
|
+
# if ! command -v bundle >/dev/null; then
|
41
|
+
# printf "The rubygem 'bundler' is not installed. Installing it now.\n"
|
42
|
+
# gem install bundler
|
43
|
+
# fi
|
44
|
+
#
|
45
|
+
# # Bundle while reducing excess noise.
|
46
|
+
# printf "Bundling your gems. This may take a few minutes on a fresh clone.\n"
|
47
|
+
# bundle | grep -v '^Using ' | grep -v ' is complete' | sed '/^$/d'
|
48
|
+
#
|
49
|
+
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,17 +1,34 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
blazing (0.0.
|
4
|
+
blazing (0.0.4)
|
5
|
+
activesupport (>= 3.0.5)
|
6
|
+
i18n
|
5
7
|
thor (>= 0.14.6)
|
6
8
|
|
7
9
|
GEM
|
8
10
|
remote: http://rubygems.org/
|
9
11
|
specs:
|
12
|
+
activesupport (3.0.5)
|
10
13
|
archive-tar-minitar (0.5.2)
|
11
14
|
columnize (0.3.2)
|
15
|
+
configuration (1.2.0)
|
12
16
|
diff-lcs (1.1.2)
|
17
|
+
growl (1.0.3)
|
18
|
+
guard (0.3.0)
|
19
|
+
open_gem (~> 1.4.2)
|
20
|
+
thor (~> 0.14.6)
|
21
|
+
guard-rspec (0.2.0)
|
22
|
+
guard (>= 0.2.2)
|
23
|
+
i18n (0.5.0)
|
24
|
+
launchy (0.3.7)
|
25
|
+
configuration (>= 0.0.5)
|
26
|
+
rake (>= 0.8.1)
|
13
27
|
linecache19 (0.5.11)
|
14
28
|
ruby_core_source (>= 0.1.4)
|
29
|
+
open_gem (1.4.2)
|
30
|
+
launchy (~> 0.3.5)
|
31
|
+
rake (0.8.7)
|
15
32
|
rspec (2.4.0)
|
16
33
|
rspec-core (~> 2.4.0)
|
17
34
|
rspec-expectations (~> 2.4.0)
|
@@ -30,6 +47,9 @@ GEM
|
|
30
47
|
ruby-debug-base19 (>= 0.11.19)
|
31
48
|
ruby_core_source (0.1.4)
|
32
49
|
archive-tar-minitar (>= 0.5.2)
|
50
|
+
simplecov (0.4.1)
|
51
|
+
simplecov-html (~> 0.4.3)
|
52
|
+
simplecov-html (0.4.3)
|
33
53
|
thor (0.14.6)
|
34
54
|
|
35
55
|
PLATFORMS
|
@@ -37,6 +57,9 @@ PLATFORMS
|
|
37
57
|
|
38
58
|
DEPENDENCIES
|
39
59
|
blazing!
|
60
|
+
growl
|
61
|
+
guard
|
62
|
+
guard-rspec
|
40
63
|
rspec
|
41
64
|
ruby-debug19
|
42
|
-
|
65
|
+
simplecov (>= 0.4.0)
|
data/Guardfile
ADDED
@@ -0,0 +1,9 @@
|
|
1
|
+
# A sample Guardfile
|
2
|
+
# More info at https://github.com/guard/guard#readme
|
3
|
+
|
4
|
+
guard 'rspec', :version => 2, :cli => "--colour --fail-fast --format nested" do
|
5
|
+
watch(%r{^spec/.+_spec\.rb})
|
6
|
+
watch(%r{^lib/(.+)\.rb}) { |m| "spec/#{m[1]}_spec.rb" }
|
7
|
+
watch(%r{^lib/blazing/(.+)\.rb}) { |m| "spec/blazing/#{m[1]}_spec.rb" }
|
8
|
+
watch('spec/spec_helper.rb') { "spec" }
|
9
|
+
end
|
data/MIT-LICENCE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2011 Felipe Kaufmann
|
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
CHANGED
@@ -1,65 +1,114 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
Blazing -- Fast and painless git push deploys
|
2
|
+
=============================================
|
3
3
|
|
4
|
-
|
4
|
+
## What
|
5
5
|
|
6
|
-
|
6
|
+
Blazing aims to be a fast and hassle free way to deploy web
|
7
|
+
applications. It may work for other frameworks, but it is mainly
|
8
|
+
designed to deploy Ruby on Rails and Rack based applications, as well as
|
9
|
+
static sites.
|
7
10
|
|
8
|
-
|
9
|
-
------------------------
|
10
|
-
|
11
|
-
* deploy is just a push to another remote. all that must be done is triggered by pre and post receveie git hooks.
|
12
|
-
* initial setup done by ruby script
|
13
|
-
* extensible recipe system, so you can plug in and out what you need and easily roll your own recipes
|
11
|
+
Some design goals:
|
14
12
|
|
15
|
-
|
16
|
-
|
13
|
+
* A deploy is just a git push to another remote. All that must be done afterwards is triggered by pre and post receveie git hooks.
|
14
|
+
* initial setup done by ruby script, so unexerpienced users do not
|
15
|
+
have to fiddle with the git config files
|
16
|
+
* clean API for writing your own recipes, no messy rake file jungles
|
17
|
+
* DRY, clean and minimal configuration file
|
18
|
+
* blazing fast!
|
17
19
|
|
18
|
-
|
20
|
+
## Why
|
19
21
|
|
20
|
-
|
22
|
+
I initially started working on an extension to capistrano which would
|
23
|
+
cover most of my needs and the needs we had at [Screen
|
24
|
+
Concept](http://www.screencocnept.ch). After a short while I noticed
|
25
|
+
that bolting more functionality on top of capistrano was just going to
|
26
|
+
be messy (and a PTA to maintain). We were alerady using tons of own recipes and customizations,
|
27
|
+
capistrano multistage, capistrano-ext, etc.
|
21
28
|
|
22
|
-
|
29
|
+
I had a look at what others were doing and after a round of trying
|
30
|
+
around and not getting what I wanted, I started this.
|
23
31
|
|
24
|
-
|
32
|
+
### Inspiration & Alternatives
|
25
33
|
|
26
|
-
|
34
|
+
I looked at [Inploy](https://github.com/dcrec1/inploy) and [Vlad](https://github.com/seattlerb/vlad) after having used [Capistrano](https://github.com/capistrano/capistrano) for several
|
35
|
+
years. Then got inspired by defunkt's
|
36
|
+
[blog post](https://github.com/blog/470-deployment-script-spring-cleaning) about deployment script spring cleaning. Other's doing a similar thing with git push deployments are Mislav's [git-deploy](https://github.com/mislav/git-deploy) and [pushand](https://github.com/remi/pushand.git) by remi.
|
27
37
|
|
28
|
-
|
38
|
+
## Installation & Setup
|
29
39
|
|
30
|
-
|
40
|
+
Run `blazing init` in your project's root, this will create the necessary files to use and configure blazing.
|
31
41
|
|
32
|
-
|
42
|
+
## Configuration & Blazing DSL
|
33
43
|
|
34
|
-
|
44
|
+
The blazing config file features a DSL similar to capistrano or other
|
45
|
+
such systems.
|
35
46
|
|
36
|
-
|
47
|
+
Examples:
|
37
48
|
|
38
|
-
|
39
|
-
=======
|
49
|
+
repository 'git@github.com:someones/repository.git'
|
40
50
|
|
41
|
-
|
51
|
+
use [:rvm, :bundler, :whenever]
|
42
52
|
|
43
|
-
|
44
|
-
|
45
|
-
* cleanup logging
|
46
|
-
* sync fs recipes
|
47
|
-
* sync db recipes for
|
48
|
-
* mysql
|
49
|
-
* postgres
|
50
|
-
* mongodb
|
51
|
-
* redis
|
53
|
+
target :stagigng, :deploy_to => 'user@hostname:/path/to/target', :default => true
|
54
|
+
target :production, :deploy_to => 'user@somehostname:/path/to/target'
|
52
55
|
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
56
|
+
...
|
57
|
+
|
58
|
+
## Deploying
|
59
|
+
|
60
|
+
blazing deploy <target_name>
|
61
|
+
|
62
|
+
Or, if everyting is already set up on the remote etc. you can acutally
|
63
|
+
just do a git push to your target name.
|
64
|
+
|
65
|
+
## Development
|
66
|
+
|
67
|
+
Report Issues/Questions/Feature requests on [GitHub
|
68
|
+
Issues](http://github.com/effkay/blazing/issues)
|
69
|
+
|
70
|
+
### Extending / Fixing Blazing itself
|
71
|
+
|
72
|
+
Pull requests are very welcome as long as they are well tested. Please
|
73
|
+
create a topic branch for every separate change you intend to make.
|
74
|
+
|
75
|
+
### Developing Blazing Extensions
|
76
|
+
|
77
|
+
**(Still work in progress and not a stable API yet)**
|
78
|
+
|
79
|
+
Example:
|
80
|
+
|
81
|
+
class SomeFunkyRecipe < Blazing::Recipe
|
82
|
+
|
83
|
+
def self.run
|
84
|
+
# do something
|
85
|
+
end
|
86
|
+
|
87
|
+
end
|
88
|
+
|
89
|
+
## Authors
|
90
|
+
|
91
|
+
[Felipe Kaufmann](http://github.com/effkay)
|
92
|
+
|
93
|
+
## License
|
94
|
+
|
95
|
+
Copyright (c) 2011 Felipe Kaufmann
|
96
|
+
|
97
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
98
|
+
a copy of this software and associated documentation files (the
|
99
|
+
"Software"), to deal in the Software without restriction, including
|
100
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
101
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
102
|
+
permit persons to whom the Software is furnished to do so, subject to
|
103
|
+
the following conditions:
|
104
|
+
|
105
|
+
The above copyright notice and this permission notice shall be
|
106
|
+
included in all copies or substantial portions of the Software.
|
107
|
+
|
108
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
109
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
110
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
111
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
112
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
113
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
114
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/Rakefile
CHANGED
@@ -1,2 +1,10 @@
|
|
1
1
|
require 'bundler'
|
2
2
|
Bundler::GemHelper.install_tasks
|
3
|
+
|
4
|
+
require 'rspec/core/rake_task'
|
5
|
+
desc "Run specs"
|
6
|
+
RSpec::Core::RakeTask.new do |t|
|
7
|
+
# t.rspec_opts = %w(--colour --fail-fast --format nested)
|
8
|
+
t.rspec_opts = %w(--colour --format nested)
|
9
|
+
t.ruby_opts = %w(-w)
|
10
|
+
end
|
data/blazing.gemspec
CHANGED
@@ -18,4 +18,8 @@ Gem::Specification.new do |s|
|
|
18
18
|
|
19
19
|
# TODO: better to use ~ ?
|
20
20
|
s.add_dependency "thor", ">= 0.14.6"
|
21
|
+
|
22
|
+
# TODO: Get rid of those, just used for guessing recipe names etc in lib/recipes.rb
|
23
|
+
s.add_dependency "activesupport", ">= 3.0.5"
|
24
|
+
s.add_dependency "i18n"
|
21
25
|
end
|
data/index.html
ADDED
@@ -0,0 +1,111 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<meta charset='utf-8'>
|
5
|
+
|
6
|
+
<title>effkay/blazing @ GitHub</title>
|
7
|
+
|
8
|
+
<style type="text/css">
|
9
|
+
body {
|
10
|
+
margin-top: 1.0em;
|
11
|
+
background-color: #e7600d;
|
12
|
+
font-family: Helvetica, Arial, FreeSans, san-serif;
|
13
|
+
color: #ffffff;
|
14
|
+
}
|
15
|
+
#container {
|
16
|
+
margin: 0 auto;
|
17
|
+
width: 700px;
|
18
|
+
}
|
19
|
+
h1 { font-size: 3.8em; color: #189ff2; margin-bottom: 3px; }
|
20
|
+
h1 .small { font-size: 0.4em; }
|
21
|
+
h1 a { text-decoration: none }
|
22
|
+
h2 { font-size: 1.5em; color: #189ff2; }
|
23
|
+
h3 { text-align: center; color: #189ff2; }
|
24
|
+
a { color: #189ff2; }
|
25
|
+
.description { font-size: 1.2em; margin-bottom: 30px; margin-top: 30px; font-style: italic;}
|
26
|
+
.download { float: right; }
|
27
|
+
pre { background: #000; color: #fff; padding: 15px;}
|
28
|
+
hr { border: 0; width: 80%; border-bottom: 1px solid #aaa}
|
29
|
+
.footer { text-align:center; padding-top:30px; font-style: italic; }
|
30
|
+
</style>
|
31
|
+
</head>
|
32
|
+
|
33
|
+
<body>
|
34
|
+
<a href="http://github.com/effkay/blazing"><img style="position: absolute; top: 0; right: 0; border: 0;" src="http://s3.amazonaws.com/github/ribbons/forkme_right_darkblue_121621.png" alt="Fork me on GitHub" /></a>
|
35
|
+
|
36
|
+
<div id="container">
|
37
|
+
|
38
|
+
<div class="download">
|
39
|
+
<a href="http://github.com/effkay/blazing/zipball/master">
|
40
|
+
<img border="0" width="90" src="http://github.com/images/modules/download/zip.png"></a>
|
41
|
+
<a href="http://github.com/effkay/blazing/tarball/master">
|
42
|
+
<img border="0" width="90" src="http://github.com/images/modules/download/tar.png"></a>
|
43
|
+
</div>
|
44
|
+
|
45
|
+
<h1><a href="http://github.com/effkay/blazing">blazing</a>
|
46
|
+
<span class="small">by <a href="http://github.com/effkay">effkay</a></span></h1>
|
47
|
+
|
48
|
+
<div class="description">
|
49
|
+
git push deployments
|
50
|
+
</div>
|
51
|
+
|
52
|
+
<p>blahblahmainproject text</p><h2>Dependencies</h2>
|
53
|
+
<p>heregoesdependencies</p>
|
54
|
+
<h2>Install</h2>
|
55
|
+
<p>heregoesinstallinstructions</p>
|
56
|
+
<h2>License</h2>
|
57
|
+
<p>Copyright (c) 2011 Felipe Kaufmann
|
58
|
+
|
59
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
60
|
+
a copy of this software and associated documentation files (the
|
61
|
+
"Software"), to deal in the Software without restriction, including
|
62
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
63
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
64
|
+
permit persons to whom the Software is furnished to do so, subject to
|
65
|
+
the following conditions:
|
66
|
+
|
67
|
+
The above copyright notice and this permission notice shall be
|
68
|
+
included in all copies or substantial portions of the Software.
|
69
|
+
|
70
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
71
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
72
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
73
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
74
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
75
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
76
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
77
|
+
</p>
|
78
|
+
<h2>Authors</h2>
|
79
|
+
<p>Felipe Kaufmann (felipekaufmann@gmail.com)
|
80
|
+
<h2>Contact</h2>
|
81
|
+
<p>Felipe Kaufmann (felipekaufmann@gmail.com)
|
82
|
+
|
83
|
+
|
84
|
+
<h2>Download</h2>
|
85
|
+
<p>
|
86
|
+
You can download this project in either
|
87
|
+
<a href="http://github.com/effkay/blazing/zipball/master">zip</a> or
|
88
|
+
<a href="http://github.com/effkay/blazing/tarball/master">tar</a> formats.
|
89
|
+
</p>
|
90
|
+
<p>You can also clone the project with <a href="http://git-scm.com">Git</a>
|
91
|
+
by running:
|
92
|
+
<pre>$ git clone git://github.com/effkay/blazing</pre>
|
93
|
+
</p>
|
94
|
+
|
95
|
+
<div class="footer">
|
96
|
+
get the source code on GitHub : <a href="http://github.com/effkay/blazing">effkay/blazing</a>
|
97
|
+
</div>
|
98
|
+
|
99
|
+
</div>
|
100
|
+
|
101
|
+
<script type="text/javascript">
|
102
|
+
var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
|
103
|
+
document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
|
104
|
+
</script>
|
105
|
+
<script type="text/javascript">
|
106
|
+
try {
|
107
|
+
var pageTracker = _gat._getTracker("UA-757870-3");
|
108
|
+
pageTracker._trackPageview();
|
109
|
+
} catch(err) {}</script>
|
110
|
+
</body>
|
111
|
+
</html>
|
data/lib/blazing.rb
CHANGED
@@ -1,19 +1,18 @@
|
|
1
1
|
require 'thor'
|
2
2
|
require 'thor/group'
|
3
3
|
require 'blazing'
|
4
|
-
require 'blazing/cli/base'
|
5
|
-
|
6
4
|
require 'blazing/config'
|
7
5
|
require 'blazing/logger'
|
8
6
|
require 'blazing/target'
|
9
7
|
require 'blazing/remote'
|
10
8
|
require 'blazing/recipe'
|
11
9
|
require 'blazing/object'
|
10
|
+
require 'blazing/cli/base'
|
12
11
|
require 'blazing/cli/create'
|
13
12
|
require 'blazing/cli/hook'
|
14
13
|
|
15
14
|
module Blazing
|
16
15
|
DIRECTORY = 'config'
|
17
16
|
CONFIGURATION_FILE = 'config/blazing.rb'
|
18
|
-
LOGGER
|
17
|
+
LOGGER ||= Blazing::Logger.new
|
19
18
|
end
|
data/lib/blazing/cli/base.rb
CHANGED
@@ -2,9 +2,6 @@ module Blazing
|
|
2
2
|
module CLI
|
3
3
|
class Base < Thor
|
4
4
|
|
5
|
-
#
|
6
|
-
# Configure blazing in current working dir
|
7
|
-
#
|
8
5
|
desc 'init', 'prepare project for blazing deploys'
|
9
6
|
def init
|
10
7
|
target = ask "Deployment Target: (ie username@host:/path/to/app)"
|
@@ -14,13 +11,10 @@ module Blazing
|
|
14
11
|
else
|
15
12
|
repository = ask "Repository URL: (ie username@host:/path/to/app)"
|
16
13
|
end
|
17
|
-
|
14
|
+
|
18
15
|
Blazing::CLI::Create.new([repository, target]).invoke_all
|
19
16
|
end
|
20
17
|
|
21
|
-
#
|
22
|
-
# Setup target for deployment
|
23
|
-
#
|
24
18
|
desc 'setup TARGET_NAME', 'setup or update blazing on specified target and deploy'
|
25
19
|
def setup(target_name = nil)
|
26
20
|
config = Blazing::Config.load
|
@@ -37,9 +31,6 @@ module Blazing
|
|
37
31
|
end
|
38
32
|
end
|
39
33
|
|
40
|
-
#
|
41
|
-
# Deploy to target
|
42
|
-
#
|
43
34
|
desc 'deploy TARGET', 'deploy to TARGET'
|
44
35
|
def deploy(target_name = nil)
|
45
36
|
config = Blazing::Config.load
|
@@ -52,7 +43,13 @@ module Blazing
|
|
52
43
|
else
|
53
44
|
LOGGER.error "failed deploying on target #{target.name}"
|
54
45
|
end
|
46
|
+
end
|
55
47
|
|
48
|
+
desc 'recipes', 'List available recipes'
|
49
|
+
def recipes
|
50
|
+
Blazing::Recipe.list.each do |recipe|
|
51
|
+
puts recipe.name
|
52
|
+
end
|
56
53
|
end
|
57
54
|
|
58
55
|
end
|
data/lib/blazing/cli/create.rb
CHANGED
data/lib/blazing/logger.rb
CHANGED
@@ -1,36 +1,47 @@
|
|
1
1
|
module Blazing
|
2
2
|
class Logger
|
3
|
-
|
4
|
-
@@use_color = true
|
5
|
-
# TODO: implement non colored output, allow to pass option from commandline
|
6
3
|
|
7
|
-
[:info, :success, :warn, :error]
|
8
|
-
|
9
|
-
|
10
|
-
|
4
|
+
LOG_LEVELS = [:info, :success, :warn, :error]
|
5
|
+
|
6
|
+
def initialize(use_color = false)
|
7
|
+
@use_color = use_color
|
11
8
|
end
|
12
9
|
|
13
|
-
def
|
14
|
-
|
10
|
+
def messages
|
11
|
+
@messages ||= []
|
15
12
|
end
|
16
13
|
|
17
|
-
def
|
18
|
-
|
14
|
+
def puts(message, type)
|
15
|
+
messages << Hash[:message => message, :type => type]
|
19
16
|
end
|
20
17
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
when :success
|
26
|
-
puts prefix + message.green + postfix
|
27
|
-
when :warn
|
28
|
-
puts prefix + message.yellow + postfix
|
29
|
-
when :error
|
30
|
-
puts prefix + message.red + postfix
|
31
|
-
end
|
18
|
+
LOG_LEVELS.each do |type|
|
19
|
+
define_method type do |message|
|
20
|
+
puts(message, type)
|
21
|
+
end
|
32
22
|
end
|
33
23
|
|
24
|
+
# def prefix
|
25
|
+
# '[BLAZING] *** '
|
26
|
+
# end
|
27
|
+
|
28
|
+
# def postfix
|
29
|
+
# ' ***'
|
30
|
+
# end
|
31
|
+
|
32
|
+
# def message(message, type)
|
33
|
+
# case type
|
34
|
+
# when :info
|
35
|
+
# puts prefix + message.blue + postfix
|
36
|
+
# when :success
|
37
|
+
# puts prefix + message.green + postfix
|
38
|
+
# when :warn
|
39
|
+
# puts prefix + message.yellow + postfix
|
40
|
+
# when :error
|
41
|
+
# puts prefix + message.red + postfix
|
42
|
+
# end
|
43
|
+
# end
|
44
|
+
|
34
45
|
end
|
35
46
|
end
|
36
47
|
|
data/lib/blazing/recipe.rb
CHANGED
@@ -1,6 +1,11 @@
|
|
1
|
+
require 'active_support/inflector'
|
2
|
+
require 'blazing'
|
3
|
+
|
1
4
|
module Blazing
|
2
5
|
class Recipe
|
3
6
|
|
7
|
+
# TODO: provide hooks for recipe to use bundle exec
|
8
|
+
|
4
9
|
attr_accessor :name, :options
|
5
10
|
|
6
11
|
def initialize(name, options = {})
|
@@ -8,23 +13,60 @@ module Blazing
|
|
8
13
|
@options = options
|
9
14
|
end
|
10
15
|
|
11
|
-
|
12
|
-
|
16
|
+
def run
|
17
|
+
recipe_class.run if recipe_class
|
18
|
+
end
|
19
|
+
|
20
|
+
def recipe_class
|
21
|
+
('Blazing::' + (@name.to_s + '_recipe').camelize).constantize
|
22
|
+
rescue NameError
|
23
|
+
Blazing::LOGGER.error "unable to load #{@name} recipe"
|
24
|
+
return nil
|
25
|
+
end
|
26
|
+
|
27
|
+
def fail
|
28
|
+
raise 'NOT IMPLEMENTED'
|
29
|
+
# TODO: implement meaningful default behaviour!
|
30
|
+
end
|
31
|
+
|
32
|
+
def success
|
33
|
+
raise 'NOT IMPLEMENTED'
|
34
|
+
# TODO: implement meaningful default behaviour!
|
35
|
+
end
|
13
36
|
|
14
|
-
|
15
|
-
# TODO: provide setup, run and use methods and ability to override the whole recipe
|
16
|
-
# TODO: Must be callable from global namespace and from remote block
|
17
|
-
|
18
|
-
# TODO: make it easy to keep recipe externally and use git submodule
|
19
|
-
#
|
20
|
-
# TODO: later, make it possible to keep recipe and setup of all projects in
|
21
|
-
# a central repo:
|
22
|
-
#
|
23
|
-
# /recipes
|
24
|
-
# /projects/
|
25
|
-
# " " someproject.rb
|
26
|
-
# " " anotherpoject.rb
|
27
|
-
#
|
28
|
-
#
|
29
|
-
# ????
|
37
|
+
class << self
|
30
38
|
|
39
|
+
def load_builtin_recipes
|
40
|
+
dir = File.join(File.dirname(__FILE__), "/recipes")
|
41
|
+
$LOAD_PATH.unshift(dir)
|
42
|
+
Dir[File.join(dir, "*.rb")].each { |file| load File.basename(file) }
|
43
|
+
end
|
44
|
+
|
45
|
+
def load_gem_recipes
|
46
|
+
#TODO: Implement
|
47
|
+
end
|
48
|
+
|
49
|
+
def load_local_recipes
|
50
|
+
#TODO: Implement
|
51
|
+
end
|
52
|
+
|
53
|
+
#
|
54
|
+
# Return the list of available recipes based
|
55
|
+
# on class hierarchy
|
56
|
+
#
|
57
|
+
def list
|
58
|
+
descendants = []
|
59
|
+
|
60
|
+
load_builtin_recipes
|
61
|
+
|
62
|
+
ObjectSpace.each_object(Class) do |k|
|
63
|
+
descendants.unshift k if k < self
|
64
|
+
end
|
65
|
+
descendants.uniq!
|
66
|
+
descendants
|
67
|
+
end
|
68
|
+
|
69
|
+
end
|
70
|
+
|
71
|
+
end
|
72
|
+
end
|
data/lib/blazing/remote.rb
CHANGED
@@ -1,15 +1,44 @@
|
|
1
1
|
module Blazing
|
2
2
|
class Remote
|
3
|
-
|
4
|
-
# TODO: RVM
|
5
|
-
# TODO: Bundler
|
6
|
-
# TODO: Check if post-hook and blazing versions match
|
7
|
-
|
8
3
|
class << self
|
9
4
|
|
10
|
-
def post_receive(
|
5
|
+
def post_receive(target_name)
|
11
6
|
set_git_dir
|
12
|
-
|
7
|
+
target = config.find_target(target_name)
|
8
|
+
|
9
|
+
# TODO: Check if post-hook and blazing versions match before doing anything
|
10
|
+
|
11
|
+
if target.recipes.blank?
|
12
|
+
target.recipes = config.recipes
|
13
|
+
end
|
14
|
+
|
15
|
+
# TODO: looks stupid. shorter way to do it?
|
16
|
+
use_rvm = target.recipes.find { |recipe| recipe.name == 'rvm' }
|
17
|
+
target.recipes.delete_if { |recipe| recipe.name == 'rvm' }
|
18
|
+
|
19
|
+
Blazing::Recipe.load_builtin_recipes
|
20
|
+
|
21
|
+
if use_rvm
|
22
|
+
use_rvm.run
|
23
|
+
end
|
24
|
+
|
25
|
+
if gemfile_present?
|
26
|
+
# TODO: Bundler setup or something
|
27
|
+
end
|
28
|
+
|
29
|
+
target.recipes.each do |recipe|
|
30
|
+
recipe.run
|
31
|
+
end
|
32
|
+
|
33
|
+
reset_head!
|
34
|
+
end
|
35
|
+
|
36
|
+
def post_setup(target_name)
|
37
|
+
# TODO: needed?
|
38
|
+
end
|
39
|
+
|
40
|
+
def gemfile_present?
|
41
|
+
File.exists? 'Gemfile'
|
13
42
|
end
|
14
43
|
|
15
44
|
def set_git_dir
|
@@ -19,25 +48,15 @@ module Blazing
|
|
19
48
|
end
|
20
49
|
end
|
21
50
|
|
22
|
-
def reset_head
|
51
|
+
def reset_head!
|
23
52
|
system 'git reset --hard HEAD'
|
24
53
|
end
|
25
54
|
|
55
|
+
def config
|
56
|
+
Blazing::Config.load
|
57
|
+
end
|
58
|
+
|
26
59
|
end
|
27
60
|
|
28
61
|
end
|
29
62
|
end
|
30
|
-
|
31
|
-
# if ENV['MY_RUBY_HOME'] && ENV['MY_RUBY_HOME'].include?('rvm')
|
32
|
-
# begin
|
33
|
-
# rvm_path = File.dirname(File.dirname(ENV['MY_RUBY_HOME']))
|
34
|
-
# rvm_lib_path = File.join(rvm_path, 'lib')
|
35
|
-
# $LOAD_PATH.unshift rvm_lib_path
|
36
|
-
# require 'rvm'
|
37
|
-
# RVM.use_from_path! File.dirname(File.dirname(__FILE__))
|
38
|
-
# rescue LoadError
|
39
|
-
# # RVM is unavailable at this point.
|
40
|
-
# raise "RVM ruby lib is currently unavailable."
|
41
|
-
# end
|
42
|
-
# end
|
43
|
-
|
data/lib/blazing/target.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
module Blazing
|
2
|
-
class Target
|
2
|
+
class Target
|
3
3
|
|
4
|
-
attr_accessor :name
|
4
|
+
attr_accessor :name, :recipes
|
5
5
|
|
6
6
|
@@configuration_options = [:deploy_to, :host, :user, :path, :default]
|
7
7
|
|
@@ -26,11 +26,6 @@ module Blazing
|
|
26
26
|
end
|
27
27
|
|
28
28
|
def setup
|
29
|
-
|
30
|
-
# TODO: Log some output?
|
31
|
-
# TODO: install post-receive hook and make it executable
|
32
|
-
|
33
|
-
config = Blazing::Config.load
|
34
29
|
clone_command = "if [ -e #{path} ]; then \
|
35
30
|
echo 'directory exists already'; else \
|
36
31
|
git clone #{config.repository} #{path} && cd #{path} && git config receive.denyCurrentBranch ignore; fi"
|
@@ -47,5 +42,9 @@ module Blazing
|
|
47
42
|
system "git push #{name}"
|
48
43
|
end
|
49
44
|
|
45
|
+
def config
|
46
|
+
Blazing::Config.load
|
47
|
+
end
|
48
|
+
|
50
49
|
end
|
51
50
|
end
|
data/lib/blazing/version.rb
CHANGED
@@ -0,0 +1,90 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'blazing/recipe'
|
3
|
+
|
4
|
+
describe Blazing::Recipe do
|
5
|
+
|
6
|
+
context 'initializer' do
|
7
|
+
|
8
|
+
it 'takes a string as name parameter' do
|
9
|
+
recipe = Blazing::Recipe.new('some_recipe')
|
10
|
+
recipe.name.should == 'some_recipe'
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'takes a symbol as name parameter and converts it to a string' do
|
14
|
+
recipe = Blazing::Recipe.new(:some_recipe)
|
15
|
+
recipe.name.should == 'some_recipe'
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'accepts options' do
|
19
|
+
recipe = Blazing::Recipe.new(:some_recipe, :an_option => 'yeah')
|
20
|
+
recipe.options[:an_option].should == 'yeah'
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
|
25
|
+
context 'recipe discovery' do
|
26
|
+
|
27
|
+
it 'before loading them, no recipes are known' do
|
28
|
+
lambda { Blazing::RvmRecipe }.should raise_error NameError
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'can discover available recipes' do
|
32
|
+
recipes = Blazing::Recipe.list
|
33
|
+
recipes.should be_all { |recipe| recipe.superclass.should == Blazing::Recipe }
|
34
|
+
recipes.each { |r| Blazing.send(:remove_const, r.name.to_s.gsub(/^.*::/, '')) }
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
|
39
|
+
context 'running recipes' do
|
40
|
+
|
41
|
+
# before :each do
|
42
|
+
# @logger = double('logger').as_null_object
|
43
|
+
# end
|
44
|
+
|
45
|
+
it 'delegate running a recipe to the recipe implementation' do
|
46
|
+
Blazing::Recipe.load_builtin_recipes
|
47
|
+
Blazing::RvmRecipe.should_receive(:run)
|
48
|
+
Blazing::Recipe.new(:rvm).run
|
49
|
+
end
|
50
|
+
|
51
|
+
it 'construct the correct classname to use from recie name' do
|
52
|
+
Blazing::Recipe.new(:rvm).recipe_class.should == Blazing::RvmRecipe
|
53
|
+
end
|
54
|
+
|
55
|
+
it 'raise an error when a recipe has no run method defined' do
|
56
|
+
class Blazing::BlahRecipe < Blazing::Recipe; end
|
57
|
+
lambda { Blazing::Recipe.new(:blah).run }.should raise_error NoMethodError
|
58
|
+
end
|
59
|
+
|
60
|
+
context 'unknown recipe' do
|
61
|
+
|
62
|
+
before :all do
|
63
|
+
@unknown_recipe_name = :undefined
|
64
|
+
end
|
65
|
+
|
66
|
+
it 'does not crash when a recipe can not be loaded' do
|
67
|
+
lambda { Blazing::Recipe.new(@unknown_recipe_name).run }.should_not raise_error
|
68
|
+
end
|
69
|
+
|
70
|
+
it 'logs an error when a recipe cant be loaded' do
|
71
|
+
Blazing::LOGGER.should_receive(:error) # TODO: how should one do this?? .with("unable to laod #{@unknown_recipe_name} recipe")
|
72
|
+
Blazing::Recipe.new(:undefined).run
|
73
|
+
end
|
74
|
+
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
|
79
|
+
context 'builtin recipes' do
|
80
|
+
|
81
|
+
it 'include an rvm recipe' do
|
82
|
+
lambda { Blazing::RvmRecipe }.should_not raise_error NameError
|
83
|
+
end
|
84
|
+
|
85
|
+
it 'include a bundler recipe' do
|
86
|
+
lambda { Blazing::BundlerRecipe }.should_not raise_error NameError
|
87
|
+
end
|
88
|
+
|
89
|
+
end
|
90
|
+
end
|
data/spec/spec_helper.rb
ADDED
metadata
CHANGED
@@ -1,12 +1,8 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: blazing
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
prerelease:
|
5
|
-
|
6
|
-
- 0
|
7
|
-
- 0
|
8
|
-
- 4
|
9
|
-
version: 0.0.4
|
4
|
+
prerelease:
|
5
|
+
version: 0.0.5
|
10
6
|
platform: ruby
|
11
7
|
authors:
|
12
8
|
- Felipe Kaufmann
|
@@ -14,7 +10,7 @@ autorequire:
|
|
14
10
|
bindir: bin
|
15
11
|
cert_chain: []
|
16
12
|
|
17
|
-
date: 2011-
|
13
|
+
date: 2011-04-12 00:00:00 +02:00
|
18
14
|
default_executable:
|
19
15
|
dependencies:
|
20
16
|
- !ruby/object:Gem::Dependency
|
@@ -25,13 +21,31 @@ dependencies:
|
|
25
21
|
requirements:
|
26
22
|
- - ">="
|
27
23
|
- !ruby/object:Gem::Version
|
28
|
-
segments:
|
29
|
-
- 0
|
30
|
-
- 14
|
31
|
-
- 6
|
32
24
|
version: 0.14.6
|
33
25
|
type: :runtime
|
34
26
|
version_requirements: *id001
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: activesupport
|
29
|
+
prerelease: false
|
30
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
31
|
+
none: false
|
32
|
+
requirements:
|
33
|
+
- - ">="
|
34
|
+
- !ruby/object:Gem::Version
|
35
|
+
version: 3.0.5
|
36
|
+
type: :runtime
|
37
|
+
version_requirements: *id002
|
38
|
+
- !ruby/object:Gem::Dependency
|
39
|
+
name: i18n
|
40
|
+
prerelease: false
|
41
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
42
|
+
none: false
|
43
|
+
requirements:
|
44
|
+
- - ">="
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: "0"
|
47
|
+
type: :runtime
|
48
|
+
version_requirements: *id003
|
35
49
|
description: git push deployent utility, ready to be extended by your own recipes
|
36
50
|
email:
|
37
51
|
- felipekaufmann@gmail.com
|
@@ -43,12 +57,16 @@ extra_rdoc_files: []
|
|
43
57
|
|
44
58
|
files:
|
45
59
|
- .gitignore
|
60
|
+
- .rvmrc
|
46
61
|
- Gemfile
|
47
62
|
- Gemfile.lock
|
63
|
+
- Guardfile
|
64
|
+
- MIT-LICENCE
|
48
65
|
- README.md
|
49
66
|
- Rakefile
|
50
67
|
- bin/blazing
|
51
68
|
- blazing.gemspec
|
69
|
+
- index.html
|
52
70
|
- lib/blazing.rb
|
53
71
|
- lib/blazing/cli/base.rb
|
54
72
|
- lib/blazing/cli/create.rb
|
@@ -60,9 +78,14 @@ files:
|
|
60
78
|
- lib/blazing/logger.rb
|
61
79
|
- lib/blazing/object.rb
|
62
80
|
- lib/blazing/recipe.rb
|
81
|
+
- lib/blazing/recipes/bundler_recipe.rb
|
82
|
+
- lib/blazing/recipes/rvm_recipe.rb
|
63
83
|
- lib/blazing/remote.rb
|
64
84
|
- lib/blazing/target.rb
|
65
85
|
- lib/blazing/version.rb
|
86
|
+
- spec/blazing/recipe_spec.rb
|
87
|
+
- spec/blazing/remote_spec.rb
|
88
|
+
- spec/spec_helper.rb
|
66
89
|
has_rdoc: true
|
67
90
|
homepage: https://github.com/effkay/blazing
|
68
91
|
licenses: []
|
@@ -77,23 +100,21 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
77
100
|
requirements:
|
78
101
|
- - ">="
|
79
102
|
- !ruby/object:Gem::Version
|
80
|
-
segments:
|
81
|
-
- 0
|
82
103
|
version: "0"
|
83
104
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
84
105
|
none: false
|
85
106
|
requirements:
|
86
107
|
- - ">="
|
87
108
|
- !ruby/object:Gem::Version
|
88
|
-
segments:
|
89
|
-
- 0
|
90
109
|
version: "0"
|
91
110
|
requirements: []
|
92
111
|
|
93
112
|
rubyforge_project:
|
94
|
-
rubygems_version: 1.
|
113
|
+
rubygems_version: 1.6.2
|
95
114
|
signing_key:
|
96
115
|
specification_version: 3
|
97
116
|
summary: blazing fast deployment
|
98
|
-
test_files:
|
99
|
-
|
117
|
+
test_files:
|
118
|
+
- spec/blazing/recipe_spec.rb
|
119
|
+
- spec/blazing/remote_spec.rb
|
120
|
+
- spec/spec_helper.rb
|