blazing 0.4.2 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/.rubocop.yml +183 -0
- data/.travis.yml +8 -4
- data/CHANGELOG.md +7 -1
- data/Gemfile +1 -1
- data/Guardfile +6 -7
- data/README.md +30 -152
- data/Rakefile +5 -6
- data/bin/blazing +1 -2
- data/blazing.gemspec +17 -26
- data/lib/blazing.rb +2 -14
- data/lib/blazing/cli.rb +32 -39
- data/lib/blazing/commands.rb +18 -26
- data/lib/blazing/config.rb +21 -51
- data/lib/blazing/dsl.rb +37 -0
- data/lib/blazing/hook.rb +15 -11
- data/lib/blazing/logger.rb +13 -17
- data/lib/blazing/repository.rb +5 -1
- data/lib/blazing/shell.rb +5 -5
- data/lib/blazing/target.rb +3 -3
- data/lib/blazing/templates/config.erb +10 -45
- data/lib/blazing/templates/hook/base.erb +0 -3
- data/lib/blazing/templates/hook/bundler.erb +4 -3
- data/lib/blazing/templates/hook/env-scripts.erb +3 -3
- data/lib/blazing/templates/hook/rake.erb +0 -1
- data/lib/blazing/templates/hook/rvm.erb +3 -31
- data/lib/blazing/templates/hook/setup.erb +1 -1
- data/lib/blazing/version.rb +3 -0
- data/spec/blazing/cli_spec.rb +1 -11
- data/spec/blazing/commands_spec.rb +35 -65
- data/spec/blazing/config_spec.rb +22 -102
- data/spec/blazing/dsl_spec.rb +60 -0
- data/spec/blazing/hook_spec.rb +31 -82
- data/spec/blazing/integration/deployment_spec.rb +20 -22
- data/spec/blazing/integration/init_spec.rb +2 -4
- data/spec/blazing/integration/setup_spec.rb +30 -30
- data/spec/blazing/integration/update_spec.rb +35 -35
- data/spec/blazing/logger_spec.rb +0 -4
- data/spec/blazing/repository_spec.rb +8 -10
- data/spec/blazing/shell_spec.rb +2 -4
- data/spec/blazing/target_spec.rb +12 -13
- data/spec/spec_helper.rb +8 -12
- data/spec/support/dummy_config.rb +6 -0
- metadata +18 -35
- data/lib/blazing/dsl_setter.rb +0 -20
- data/lib/blazing/recipe.rb +0 -45
- data/lib/blazing/templates/hook/recipes.erb +0 -5
- data/spec/blazing/dsl_setter_spec.rb +0 -29
- data/spec/blazing/integration/list_spec.rb +0 -20
- data/spec/blazing/integration/recipes_spec.rb +0 -29
- data/spec/blazing/recipe_spec.rb +0 -42
data/lib/blazing/hook.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
require 'erb'
|
2
|
+
require_relative 'target'
|
2
3
|
|
3
4
|
module Blazing
|
4
5
|
class Hook
|
5
|
-
|
6
6
|
include Blazing::Logger
|
7
7
|
|
8
8
|
attr_accessor :target
|
@@ -20,16 +20,21 @@ module Blazing
|
|
20
20
|
end
|
21
21
|
|
22
22
|
def rake_command
|
23
|
-
|
24
|
-
rails_env = "RAILS_ENV=#{@options[:rails_env]}" if @options[:rails_env]
|
25
|
-
|
26
|
-
if rake_config[:task]
|
27
|
-
"#{rake_config[:env]} #{rails_env} bundle exec rake #{rake_config[:task]}"
|
28
|
-
end
|
23
|
+
"#{options_as_vars}bundle exec rake #{@config.rake_task}" if @config.rake_task
|
29
24
|
end
|
30
25
|
|
31
26
|
private
|
32
27
|
|
28
|
+
def options_as_vars
|
29
|
+
keys = @options.keys
|
30
|
+
options = ''
|
31
|
+
keys.each do |key|
|
32
|
+
options << "#{key.to_s.upcase}=#{@options[key]} "
|
33
|
+
end
|
34
|
+
|
35
|
+
options
|
36
|
+
end
|
37
|
+
|
33
38
|
def load_template(template_name)
|
34
39
|
::ERB.new(File.read(find_template(template_name))).result(binding)
|
35
40
|
end
|
@@ -55,7 +60,7 @@ module Blazing
|
|
55
60
|
end
|
56
61
|
|
57
62
|
def write(hook)
|
58
|
-
File.open(Blazing::TMP_HOOK,
|
63
|
+
File.open(Blazing::TMP_HOOK, 'wb') do |f|
|
59
64
|
f.puts hook
|
60
65
|
end
|
61
66
|
end
|
@@ -69,7 +74,7 @@ module Blazing
|
|
69
74
|
end
|
70
75
|
|
71
76
|
def copy_hook
|
72
|
-
debug
|
77
|
+
debug 'Making hook executable'
|
73
78
|
# TODO: handle missing user?
|
74
79
|
if @target.host
|
75
80
|
@shell.run "scp #{Blazing::TMP_HOOK} #{@target.user}@#{@target.host}:#{@target.path}/.git/hooks/post-receive"
|
@@ -79,9 +84,8 @@ module Blazing
|
|
79
84
|
end
|
80
85
|
|
81
86
|
def make_hook_executable
|
82
|
-
debug
|
87
|
+
debug 'Making hook executable'
|
83
88
|
"chmod +x #{@target.path}/.git/hooks/post-receive"
|
84
89
|
end
|
85
90
|
end
|
86
91
|
end
|
87
|
-
|
data/lib/blazing/logger.rb
CHANGED
@@ -2,38 +2,34 @@ require 'logging'
|
|
2
2
|
|
3
3
|
module Blazing
|
4
4
|
module Logger
|
5
|
-
|
6
5
|
# include Logging.globally
|
7
6
|
|
8
7
|
# here we setup a color scheme called 'bright'
|
9
|
-
Logging.color_scheme(
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
8
|
+
Logging.color_scheme('bright',
|
9
|
+
levels: {
|
10
|
+
debug: :green,
|
11
|
+
info: :green,
|
12
|
+
warn: :yellow,
|
13
|
+
error: [:white, :on_red],
|
14
|
+
fatal: [:white, :on_red]
|
15
|
+
}
|
16
|
+
)
|
18
17
|
|
19
18
|
Logging.appenders.stdout(
|
20
19
|
'stdout',
|
21
|
-
:
|
22
|
-
:
|
23
|
-
:
|
20
|
+
layout: Logging.layouts.pattern(
|
21
|
+
pattern: ' ------> [blazing] %-5l: %m\n',
|
22
|
+
color_scheme: 'bright'
|
24
23
|
)
|
25
24
|
)
|
26
25
|
|
27
26
|
Logging.logger.root.appenders = 'stdout'
|
28
27
|
Logging.logger.root.level = :info
|
29
|
-
Logging.consolidate :root
|
30
28
|
|
31
|
-
%w
|
29
|
+
%w(debug info warn error fatal).each do |level|
|
32
30
|
define_method level do |message|
|
33
31
|
Logging.logger[self].send(level, message)
|
34
32
|
end
|
35
33
|
end
|
36
|
-
|
37
34
|
end
|
38
35
|
end
|
39
|
-
|
data/lib/blazing/repository.rb
CHANGED
data/lib/blazing/shell.rb
CHANGED
data/lib/blazing/target.rb
CHANGED
@@ -12,59 +12,24 @@
|
|
12
12
|
# rails_env: used when calling the rake task after deployment
|
13
13
|
|
14
14
|
target :staging, 'user@server:/var/www/someproject.com',
|
15
|
-
:
|
15
|
+
:rails_env => 'production'
|
16
16
|
|
17
|
-
|
18
|
-
# Sample rvm setup:
|
17
|
+
# Sample rvm/rbenv/chruby/other setup:
|
19
18
|
#
|
20
|
-
#
|
19
|
+
# env_sript <your rvm setup scripts>
|
21
20
|
#
|
22
|
-
# Setting
|
23
|
-
#
|
24
|
-
#
|
25
|
-
#
|
26
|
-
|
27
|
-
rvm 'ruby-1.9.3@some-gemset'
|
28
|
-
|
29
|
-
|
30
|
-
# Sample config for custom rvm location:
|
31
|
-
#
|
32
|
-
# rvm_scripts <path_to_rvm_scripts>
|
33
|
-
#
|
34
|
-
# If you have installed rvm to a custom location, use this method to
|
35
|
-
# specify where the rvm scripts are located.
|
36
|
-
|
37
|
-
rvm_scripts '/opt/rvm/scripts/rvm'
|
38
|
-
|
39
|
-
# Sample rbenv/chruby/other setup:
|
40
|
-
#
|
41
|
-
# env_scripts <path_to_version_manager_script>
|
42
|
-
#
|
43
|
-
# If you need to source a file for your non-rvm version manager to
|
44
|
-
# you can do that with env_scripts. You should also remove the
|
45
|
-
# rvm/rvm_scripts options above.
|
46
|
-
|
47
|
-
env_scripts '/etc/profile.d/rbenv.sh'
|
48
|
-
|
49
|
-
# Sample recipe setup:
|
50
|
-
#
|
51
|
-
# recipe <recipe_name>, [options]
|
52
|
-
#
|
53
|
-
# The given recipe will be called with the provided options. Refer to each
|
54
|
-
# recipe's documentation for available options. Options provided here
|
55
|
-
# may be overridden by target specific options.
|
56
|
-
# Recipes will be executed in the order they are defined!yy
|
57
|
-
|
58
|
-
recipe :precompile_assets, :recipe_specific_option => 'bar'
|
59
|
-
|
21
|
+
# Setting an env_script path makes sure it is sourced before the hook
|
22
|
+
# does anything at all. That way you can setup any environment things
|
23
|
+
# you need to. Most commonly this will be sourcing rvm and setting a
|
24
|
+
# ruby, or doing something with rbenv or chruby.
|
25
|
+
env_script '/etc/profile.d/rbenv.sh'
|
60
26
|
|
61
27
|
# Sample rake file config:
|
62
28
|
#
|
63
29
|
# rake <task>, [environment variables]
|
64
30
|
#
|
65
|
-
# The provided rake task will be run after
|
31
|
+
# The provided rake task will be run after blazing has done its stuff.
|
66
32
|
# Note: you can only call a single rake task. If you need to run several
|
67
33
|
# tasks just create one task that wrapps all the others.
|
68
34
|
|
69
|
-
rake :post_deploy
|
70
|
-
|
35
|
+
rake :post_deploy
|
@@ -1,3 +1,4 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
1
|
+
if [ -f "Gemfile" ] ; then
|
2
|
+
echo "------> [blazing] Bundling gems"
|
3
|
+
bundle --deployment --quiet --without development test
|
4
|
+
fi
|
@@ -1,6 +1,6 @@
|
|
1
|
-
<% if @config.
|
1
|
+
<% if @config.env_script %>
|
2
2
|
|
3
|
-
source <%= @config.
|
4
|
-
echo "------> [blazing]
|
3
|
+
source <%= @config.env_script %>
|
4
|
+
echo "------> [blazing] Sourcing environment script"
|
5
5
|
|
6
6
|
<% end %>
|
@@ -1,35 +1,7 @@
|
|
1
|
-
<% if @config.rvm %>
|
1
|
+
<% if @config.rvm? %>
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
#
|
6
|
-
<% unless @config.rvm_scripts %>
|
7
|
-
# Load RVM into a shell session *as a function*
|
8
|
-
if [[ -s "$HOME/.rvm/scripts/rvm" ]] ; then
|
9
|
-
|
10
|
-
# First try to load from a user install
|
11
|
-
source "$HOME/.rvm/scripts/rvm"
|
12
|
-
|
13
|
-
elif [[ -s "/usr/local/rvm/scripts/rvm" ]] ; then
|
14
|
-
|
15
|
-
# Then try to load from a root install
|
16
|
-
source "/usr/local/rvm/scripts/rvm"
|
17
|
-
|
18
|
-
else
|
19
|
-
echo '------> [blazing] ERROR: RVM was enabled in config but no RVM installation was not found\n'
|
20
|
-
fi
|
21
|
-
<% end %>
|
22
|
-
|
23
|
-
#
|
24
|
-
# Apply rvm env
|
25
|
-
#
|
26
|
-
<% if @config.rvm == :rvmrc %>
|
27
|
-
echo "------> [blazing] Loading rvm from .rvmrc"
|
28
|
-
source .rvmrc
|
29
|
-
<% else %>
|
30
|
-
echo "------> [blazing] Loading rvm string: <%= @config.rvm %>"
|
31
|
-
rvm use <%= @config.rvm %>
|
32
|
-
<% end %>
|
3
|
+
echo "------> [blazing] Loading rvm from .rvmrc"
|
4
|
+
source .rvmrc
|
33
5
|
|
34
6
|
<% end %>
|
35
7
|
|
data/spec/blazing/cli_spec.rb
CHANGED
@@ -1,9 +1,8 @@
|
|
1
1
|
require 'spec_helper'
|
2
|
+
require 'blazing/cli'
|
2
3
|
|
3
4
|
module Blazing
|
4
|
-
|
5
5
|
describe CLI do
|
6
|
-
|
7
6
|
let(:cli) { CLI.new }
|
8
7
|
it 'has an init method' do
|
9
8
|
cli.respond_to? :init
|
@@ -17,17 +16,8 @@ module Blazing
|
|
17
16
|
cli.respond_to? :update
|
18
17
|
end
|
19
18
|
|
20
|
-
it 'has a recipes method' do
|
21
|
-
cli.respond_to? :recipes
|
22
|
-
end
|
23
|
-
|
24
|
-
it 'has a list method' do
|
25
|
-
cli.respond_to? :list
|
26
|
-
end
|
27
|
-
|
28
19
|
it 'has a help method' do
|
29
20
|
cli.respond_to? :help
|
30
21
|
end
|
31
22
|
end
|
32
23
|
end
|
33
|
-
|
@@ -1,24 +1,18 @@
|
|
1
1
|
require 'spec_helper'
|
2
|
-
|
2
|
+
require_relative '../../lib/blazing/commands'
|
3
|
+
require_relative '../../lib/blazing/config'
|
3
4
|
|
4
5
|
module Blazing
|
5
|
-
|
6
6
|
describe Commands do
|
7
|
-
|
8
7
|
let(:config_instance) { Blazing::Config.new }
|
9
8
|
|
10
|
-
let(:target_a) { double('target_a', :
|
11
|
-
let(:target_b) { double('target_b', :
|
9
|
+
let(:target_a) { double('target_a', name: 'target_a', update: nil, setup: nil) }
|
10
|
+
let(:target_b) { double('target_b', name: 'target_b', update: nil, setup: nil) }
|
12
11
|
let(:targets) { [target_a, target_b] }
|
13
12
|
|
14
|
-
let(:recipe_a) { double('recipe_a', :name => 'recipe_a', :run => nil) }
|
15
|
-
let(:recipe_b) { double('recipe_b', :name => 'recipe_b', :run => nil) }
|
16
|
-
let(:recipes) { [recipe_a, recipe_b] }
|
17
|
-
|
18
13
|
let(:config) do
|
19
14
|
config = config_instance
|
20
15
|
config.targets = targets
|
21
|
-
config.recipes = recipes
|
22
16
|
|
23
17
|
config
|
24
18
|
end
|
@@ -27,118 +21,94 @@ module Blazing
|
|
27
21
|
let(:commands_instance) { commands.new }
|
28
22
|
|
29
23
|
before :each do
|
30
|
-
Config.
|
24
|
+
allow(Config).to receive(:parse).and_return config
|
31
25
|
end
|
32
26
|
|
33
27
|
describe '.new' do
|
34
28
|
it 'reads the config file when the command requires it' do
|
35
|
-
Config.
|
36
|
-
commands.new(:
|
29
|
+
expect(Config).to receive(:parse).and_return config
|
30
|
+
commands.new(command: :setup)
|
37
31
|
end
|
38
32
|
|
39
33
|
it 'does not read the config file when the command does not need it' do
|
40
|
-
Config.
|
41
|
-
commands.new(:
|
34
|
+
expect(Config).not_to receive(:parse)
|
35
|
+
commands.new(command: :init)
|
42
36
|
end
|
43
37
|
end
|
44
38
|
|
45
39
|
describe '#run' do
|
46
40
|
it 'creates an instance of itself' do
|
47
|
-
commands_instance.
|
48
|
-
commands.
|
41
|
+
allow(commands_instance).to receive :dummy_command
|
42
|
+
expect(commands).to receive(:new).with(command: :dummy_command).and_return(commands_instance)
|
49
43
|
commands.run(:dummy_command)
|
50
44
|
end
|
51
45
|
|
52
46
|
it 'runs the specified command' do
|
53
|
-
commands_instance.
|
54
|
-
commands.
|
47
|
+
expect(commands_instance).to receive(:dummy_command)
|
48
|
+
allow(commands).to receive(:new).with(command: :dummy_command).and_return(commands_instance)
|
55
49
|
commands.run(:dummy_command)
|
56
50
|
end
|
57
|
-
|
58
|
-
it 'raises an exception if the command does not exist' do
|
59
|
-
pending 'Implement after reading exceptional Ruby ;-)'
|
60
|
-
end
|
61
51
|
end
|
62
52
|
|
63
53
|
describe '#init' do
|
64
54
|
it 'creates a config directory if it does not exist' do
|
65
|
-
Dir.
|
66
|
-
File.
|
67
|
-
File.
|
55
|
+
expect(Dir).to receive(:mkdir).with('config')
|
56
|
+
allow(File).to receive(:exist?).and_return(false)
|
57
|
+
allow(File).to receive(:open)
|
68
58
|
commands.run(:init)
|
69
59
|
end
|
70
60
|
|
71
61
|
it 'creates a config file' do
|
72
62
|
file = double('file').as_null_object
|
73
|
-
File.
|
63
|
+
expect(File).to receive(:open).with('config/blazing.rb', 'wb').and_yield(file)
|
74
64
|
commands.run(:init)
|
75
65
|
end
|
76
66
|
end
|
77
67
|
|
78
68
|
describe '#setup' do
|
79
69
|
it 'runs the setup method on the specified target' do
|
80
|
-
target_a.
|
81
|
-
target_b.
|
82
|
-
commands.run(:setup, :
|
70
|
+
expect(target_a).to receive(:setup)
|
71
|
+
expect(target_b).not_to receive(:setup)
|
72
|
+
commands.run(:setup, target_name: target_a.name)
|
83
73
|
end
|
84
74
|
|
85
75
|
it 'does nothing when no target is specified' do
|
86
|
-
target_a.
|
87
|
-
target_b.
|
76
|
+
expect(target_a).not_to receive(:setup)
|
77
|
+
expect(target_b).not_to receive(:setup)
|
88
78
|
commands.run(:setup)
|
89
79
|
end
|
90
80
|
|
91
81
|
it 'runs setup on all targets if "all" is specified' do
|
92
|
-
target_a.
|
93
|
-
target_b.
|
94
|
-
commands.run(:setup, :
|
82
|
+
expect(target_a).to receive(:setup)
|
83
|
+
expect(target_b).to receive(:setup)
|
84
|
+
commands.run(:setup, target_name: 'all')
|
95
85
|
end
|
96
86
|
|
97
87
|
it 'runs the update command' do
|
98
|
-
commands_instance.
|
99
|
-
commands.
|
88
|
+
expect(commands_instance).to receive(:update)
|
89
|
+
allow(commands).to receive(:new).and_return(commands_instance)
|
100
90
|
commands.run(:setup)
|
101
91
|
end
|
102
92
|
end
|
103
93
|
|
104
94
|
describe '#update' do
|
105
95
|
it 'runs the update method on the specified target' do
|
106
|
-
target_a.
|
107
|
-
target_b.
|
108
|
-
commands.run(:update, :
|
96
|
+
expect(target_a).to receive(:update)
|
97
|
+
expect(target_b).not_to receive(:update)
|
98
|
+
commands.run(:update, target_name: target_a.name)
|
109
99
|
end
|
110
100
|
|
111
101
|
it 'does nothing when no target is specified' do
|
112
|
-
target_a.
|
113
|
-
target_b.
|
102
|
+
expect(target_a).not_to receive(:update)
|
103
|
+
expect(target_b).not_to receive(:update)
|
114
104
|
commands.run(:update)
|
115
105
|
end
|
116
106
|
|
117
107
|
it 'runs update on all targets if "all" is specified' do
|
118
|
-
target_a.
|
119
|
-
target_b.
|
120
|
-
commands.run(:update, :
|
121
|
-
end
|
122
|
-
end
|
123
|
-
|
124
|
-
describe '#recipes' do
|
125
|
-
it 'runs each recipe' do
|
126
|
-
recipes.each { |r| r.should_receive(:run) }
|
127
|
-
commands.run(:recipes)
|
128
|
-
end
|
129
|
-
|
130
|
-
it 'passes in target_name' do
|
131
|
-
recipes.each { |r| r.should_receive(:run).with({:target_name => :testing}) }
|
132
|
-
commands.run(:recipes, :target_name => :testing)
|
133
|
-
end
|
134
|
-
end
|
135
|
-
|
136
|
-
describe '#list' do
|
137
|
-
it 'lists each recipe' do
|
138
|
-
Blazing::Recipe.should_receive(:pretty_list)
|
139
|
-
commands.run(:list)
|
108
|
+
expect(target_a).to receive(:update)
|
109
|
+
expect(target_b).to receive(:update)
|
110
|
+
commands.run(:update, target_name: 'all')
|
140
111
|
end
|
141
112
|
end
|
142
113
|
end
|
143
114
|
end
|
144
|
-
|