blazing 0.0.6 → 0.0.7
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.
- data/Gemfile +5 -3
- data/Gemfile.lock +27 -26
- data/README.md +3 -1
- data/Rakefile +3 -0
- data/lib/blazing.rb +3 -1
- data/lib/blazing/cli/base.rb +32 -14
- data/lib/blazing/cli/create.rb +11 -2
- data/lib/blazing/cli/hook.rb +7 -5
- data/lib/blazing/config.rb +7 -7
- data/lib/blazing/logger.rb +13 -106
- data/lib/blazing/recipe.rb +4 -11
- data/lib/blazing/recipes/bundler_recipe.rb +2 -0
- data/lib/blazing/recipes/rvm_recipe.rb +2 -0
- data/lib/blazing/remote.rb +50 -45
- data/lib/blazing/runner.rb +5 -0
- data/lib/blazing/target.rb +55 -23
- data/lib/blazing/version.rb +1 -1
- data/spec/blazing/cli/base_spec.rb +102 -0
- data/spec/blazing/cli/create_spec.rb +26 -0
- data/spec/blazing/cli/hook_spec.rb +16 -0
- data/spec/blazing/config_spec.rb +82 -0
- data/spec/blazing/logger_spec.rb +50 -0
- data/spec/blazing/recipe_spec.rb +13 -8
- data/spec/blazing/recipes/bundler_recipe_spec.rb +6 -0
- data/spec/blazing/recipes/passenger_recipe_spec.rb +6 -0
- data/spec/blazing/recipes/rvm_recipe_spec.rb +6 -0
- data/spec/blazing/remote_spec.rb +126 -3
- data/spec/blazing/runner_spec.rb +9 -0
- data/spec/blazing/target_spec.rb +110 -0
- data/spec/spec_helper.rb +7 -3
- data/spec/support/config.rb +0 -0
- metadata +25 -3
- data/index.html +0 -111
data/lib/blazing/recipe.rb
CHANGED
@@ -1,9 +1,11 @@
|
|
1
1
|
require 'active_support/inflector'
|
2
2
|
require 'blazing'
|
3
|
+
# require 'blazing/logger'
|
3
4
|
|
4
5
|
module Blazing
|
5
6
|
class Recipe
|
6
7
|
|
8
|
+
|
7
9
|
# TODO: provide hooks for recipe to use bundle exec
|
8
10
|
|
9
11
|
attr_accessor :name, :options
|
@@ -11,6 +13,7 @@ module Blazing
|
|
11
13
|
def initialize(name, options = {})
|
12
14
|
@name = name.to_s
|
13
15
|
@options = options
|
16
|
+
@logger = options[:_logger] ||= Blazing::Logger.new
|
14
17
|
end
|
15
18
|
|
16
19
|
def run
|
@@ -20,20 +23,10 @@ module Blazing
|
|
20
23
|
def recipe_class
|
21
24
|
('Blazing::' + (@name.to_s + '_recipe').camelize).constantize
|
22
25
|
rescue NameError
|
23
|
-
|
26
|
+
@logger.log :error, "unable to load #{@name} recipe"
|
24
27
|
return nil
|
25
28
|
end
|
26
29
|
|
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
|
36
|
-
|
37
30
|
class << self
|
38
31
|
|
39
32
|
def load_builtin_recipes
|
data/lib/blazing/remote.rb
CHANGED
@@ -1,62 +1,67 @@
|
|
1
|
+
require 'blazing'
|
2
|
+
require 'blazing/config'
|
3
|
+
|
1
4
|
module Blazing
|
2
5
|
class Remote
|
3
|
-
class << self
|
4
|
-
|
5
|
-
def post_receive(target_name)
|
6
|
-
set_git_dir
|
7
|
-
target = config.find_target(target_name)
|
8
|
-
|
9
|
-
# TODO: Check if post-hook and blazing versions match before doing anything
|
10
6
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
Blazing::Recipe.load_builtin_recipes
|
7
|
+
def post_receive(target_name)
|
8
|
+
set_git_dir
|
9
|
+
@target = config.find_target(target_name)
|
10
|
+
@recipes = @target.recipes
|
11
|
+
setup_and_run_recipes
|
12
|
+
reset_head!
|
13
|
+
end
|
20
14
|
|
21
|
-
|
22
|
-
|
23
|
-
|
15
|
+
def gemfile_present?
|
16
|
+
File.exists? 'Gemfile'
|
17
|
+
end
|
24
18
|
|
25
|
-
|
26
|
-
|
27
|
-
|
19
|
+
def set_git_dir
|
20
|
+
@_env ||= ENV
|
21
|
+
@_dir ||= Dir
|
22
|
+
if @_env['GIT_DIR'] == '.'
|
23
|
+
@_dir.chdir('..')
|
24
|
+
@_env['GIT_DIR'] = '.git'
|
25
|
+
end
|
26
|
+
end
|
28
27
|
|
29
|
-
|
30
|
-
|
31
|
-
|
28
|
+
def reset_head!
|
29
|
+
@runner ||= Blazing::Runner.new
|
30
|
+
@runner.run 'git reset --hard HEAD'
|
31
|
+
end
|
32
32
|
|
33
|
-
|
34
|
-
|
33
|
+
def config
|
34
|
+
@_config ||= Blazing::Config
|
35
|
+
@_config.load
|
36
|
+
end
|
35
37
|
|
36
|
-
|
37
|
-
|
38
|
-
|
38
|
+
def use_rvm?
|
39
|
+
@rvm_recipe = @recipes.find { |recipe| recipe.name == 'rvm' }
|
40
|
+
@recipes.delete_if { |recipe| recipe.name == 'rvm' }
|
39
41
|
|
40
|
-
|
41
|
-
|
42
|
-
end
|
42
|
+
@rvm_recipe
|
43
|
+
end
|
43
44
|
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
end
|
45
|
+
def setup_and_run_recipes
|
46
|
+
@recipes = config.recipes if @recipes.blank?
|
47
|
+
Blazing::Recipe.load_builtin_recipes
|
48
|
+
run_recipes
|
49
|
+
end
|
50
50
|
|
51
|
-
|
52
|
-
|
51
|
+
def run_recipes
|
52
|
+
run_bootstrap_recipes
|
53
|
+
@recipes.each do |recipe|
|
54
|
+
recipe.run
|
53
55
|
end
|
56
|
+
end
|
54
57
|
|
55
|
-
|
56
|
-
|
57
|
-
end
|
58
|
+
def run_bootstrap_recipes
|
59
|
+
@rvm_recipe.run if use_rvm?
|
58
60
|
|
61
|
+
# if gemfile_present?
|
62
|
+
# # TODO: Bundler setup or something ?
|
63
|
+
# end
|
59
64
|
end
|
60
|
-
|
61
65
|
end
|
66
|
+
|
62
67
|
end
|
data/lib/blazing/target.rb
CHANGED
@@ -1,49 +1,81 @@
|
|
1
|
+
require 'blazing'
|
2
|
+
require 'blazing/object'
|
3
|
+
|
1
4
|
module Blazing
|
2
5
|
class Target
|
3
6
|
|
4
7
|
attr_accessor :name, :recipes
|
5
8
|
|
6
|
-
|
9
|
+
AVAILABLE_SETTINGS = [:deploy_to, :host, :user, :path, :default]
|
7
10
|
|
8
11
|
def initialize(name, options = {})
|
9
12
|
@name = name.to_s
|
10
|
-
|
13
|
+
@logger = options[:_logger] ||= Blazing::Logger.new
|
14
|
+
@runner = options[:_runner] ||= Blazing::Runner
|
15
|
+
@hook = options[:_hook] ||= Blazing::CLI::Hook
|
16
|
+
create_accesors(options)
|
17
|
+
end
|
18
|
+
|
19
|
+
def setup
|
20
|
+
clone_repository
|
21
|
+
add_target_as_remote
|
22
|
+
setup_post_receive_hook
|
23
|
+
end
|
24
|
+
|
25
|
+
def deploy
|
26
|
+
@runner.run "git push #{name}"
|
27
|
+
end
|
28
|
+
|
29
|
+
def config
|
30
|
+
@_config ||= Blazing::Config
|
31
|
+
@_config.load
|
32
|
+
end
|
33
|
+
|
34
|
+
def create_accesors(options)
|
35
|
+
assign_settings(options)
|
36
|
+
parse_deploy_to_string unless @deploy_to.blank?
|
37
|
+
ensure_mandatory_settings
|
38
|
+
end
|
39
|
+
|
40
|
+
def assign_settings(options)
|
41
|
+
AVAILABLE_SETTINGS.each do |option|
|
11
42
|
instance_variable_set("@#{option}", options[option])
|
12
43
|
self.class.send(:attr_accessor, option)
|
13
44
|
end
|
45
|
+
end
|
14
46
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
47
|
+
# If the :deploy_to option is set, user, host and path are overriden
|
48
|
+
def parse_deploy_to_string
|
49
|
+
@host = @deploy_to.scan(/@(.*):/).join
|
50
|
+
@user = @deploy_to.scan(/(.*)@/).join
|
51
|
+
@path = @deploy_to.scan(/:(.*)/).join
|
52
|
+
end
|
21
53
|
|
22
|
-
|
54
|
+
# Raise an error if one of the required options is still empty
|
55
|
+
def ensure_mandatory_settings
|
23
56
|
[:host, :user, :path].each do |option|
|
24
57
|
raise "#{option} can't be blank!" if instance_variable_get("@#{option}").blank?
|
25
58
|
end
|
26
59
|
end
|
27
60
|
|
28
|
-
def
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
system "ssh #{user}@#{host} '#{clone_command}'"
|
34
|
-
system "git remote add #{name} #{user}@#{host}:#{path}"
|
61
|
+
def clone_command
|
62
|
+
"if [ -e #{@path} ]; then \
|
63
|
+
echo 'directory exists already'; else \
|
64
|
+
git clone #{config.repository} #{@path} && cd #{@path} && git config receive.denyCurrentBranch ignore; fi"
|
65
|
+
end
|
35
66
|
|
36
|
-
|
37
|
-
|
38
|
-
system "ssh #{user}@#{host} 'chmod +x #{path}/.git/hooks/post-receive'"
|
67
|
+
def clone_repository
|
68
|
+
@runner.run "ssh #{@user}@#{@host} '#{clone_command}'"
|
39
69
|
end
|
40
70
|
|
41
|
-
def
|
42
|
-
|
71
|
+
def add_target_as_remote
|
72
|
+
@runner.run "git remote add #{@name} #{@user}@#{@host}:#{@path}"
|
43
73
|
end
|
44
74
|
|
45
|
-
def
|
46
|
-
|
75
|
+
def setup_post_receive_hook
|
76
|
+
@hook.new([@name]).generate
|
77
|
+
@runner.run "scp /tmp/post-receive #{@user}@#{@host}:#{@path}/.git/hooks/post-receive"
|
78
|
+
@runner.run "ssh #{@user}@#{@host} 'chmod +x #{@path}/.git/hooks/post-receive'"
|
47
79
|
end
|
48
80
|
|
49
81
|
end
|
data/lib/blazing/version.rb
CHANGED
@@ -0,0 +1,102 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'blazing/cli/base'
|
3
|
+
|
4
|
+
describe Blazing::CLI::Base do
|
5
|
+
|
6
|
+
before :all do
|
7
|
+
Blazing.send(:remove_const, 'CONFIGURATION_FILE')
|
8
|
+
Blazing::CONFIGURATION_FILE = 'spec/support/config.rb'
|
9
|
+
end
|
10
|
+
|
11
|
+
before :each do
|
12
|
+
@logger = double('logger', :log => nil, :report => nil)
|
13
|
+
@runner = double('runner', :run => nil)
|
14
|
+
@hook = double('hook', :new => double('template', :generate => nil))
|
15
|
+
@base = Blazing::CLI::Base.new(@logger)
|
16
|
+
end
|
17
|
+
|
18
|
+
describe '#init' do
|
19
|
+
it 'invokes all CLI::Create tasks' do
|
20
|
+
@create_task = double('create task')
|
21
|
+
@base.instance_variable_set('@task', @create_task)
|
22
|
+
@create_task.should_receive(:invoke_all)
|
23
|
+
@base.init
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
describe '#setup' do
|
28
|
+
|
29
|
+
before :each do
|
30
|
+
@some_target_name = 'test_target'
|
31
|
+
hook = double('hook', :new => double('template', :generate => nil))
|
32
|
+
config = Blazing::Config.new
|
33
|
+
config.target(@some_target_name, :deploy_to => 'smoeone@somewhere:/asdasdasd', :_logger => @logger, :_runner => @runner, :_hook => hook)
|
34
|
+
@base.instance_variable_set('@config', config)
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'says what target is being setup' do
|
38
|
+
@logger.should_receive(:log).with(:info, "setting up target test_target")
|
39
|
+
@base.setup(@some_target_name)
|
40
|
+
end
|
41
|
+
|
42
|
+
it 'runs setup on selected target' do
|
43
|
+
@target = @base.instance_variable_get('@config').instance_variable_get('@targets').first
|
44
|
+
@target.should_receive(:setup)
|
45
|
+
@base.setup(@some_target_name)
|
46
|
+
end
|
47
|
+
|
48
|
+
it 'logs a success message if exitstatus of setup was 0' do
|
49
|
+
@base.instance_variable_set('@exit_status', 0)
|
50
|
+
@logger.should_receive(:log).with(:success, "successfully set up target test_target")
|
51
|
+
@base.setup(@some_target_name)
|
52
|
+
end
|
53
|
+
|
54
|
+
it 'logs an error if exitstatus of setup was not 0' do
|
55
|
+
@base.instance_variable_set('@exit_status', 1)
|
56
|
+
@logger.should_receive(:log).with(:error, "failed setting up target test_target")
|
57
|
+
@base.setup(@some_target_name)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
describe '#deploy' do
|
62
|
+
|
63
|
+
before :each do
|
64
|
+
@some_target_name = 'test_target'
|
65
|
+
hook = double('hook', :new => double('template', :generate => nil))
|
66
|
+
config = Blazing::Config.new
|
67
|
+
config.target(@some_target_name, :deploy_to => 'smoeone@somewhere:/asdasdasd', :_logger => @logger, :_runner => @runner, :_hook => hook)
|
68
|
+
@base.instance_variable_set('@config', config)
|
69
|
+
end
|
70
|
+
|
71
|
+
it 'says what target is being deployed' do
|
72
|
+
@logger.should_receive(:log).with(:info, "deploying target test_target")
|
73
|
+
@base.deploy(@some_target_name)
|
74
|
+
end
|
75
|
+
|
76
|
+
it 'runs setup on selected target' do
|
77
|
+
@target = @base.instance_variable_get('@config').instance_variable_get('@targets').first
|
78
|
+
@target.should_receive(:deploy)
|
79
|
+
@base.deploy(@some_target_name)
|
80
|
+
end
|
81
|
+
|
82
|
+
it 'logs a success message if exitstatus of setup was 0' do
|
83
|
+
@base.instance_variable_set('@exit_status', 0)
|
84
|
+
@logger.should_receive(:log).with(:success, "successfully deployed target test_target")
|
85
|
+
@base.deploy(@some_target_name)
|
86
|
+
end
|
87
|
+
|
88
|
+
it 'logs an error if exitstatus of setup was not 0' do
|
89
|
+
@base.instance_variable_set('@exit_status', 1)
|
90
|
+
@logger.should_receive(:log).with(:error, "failed deploying on target test_target")
|
91
|
+
@base.deploy(@some_target_name)
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
describe '#recipes' do
|
96
|
+
it 'prints a list of available recipes' do
|
97
|
+
@logger.should_receive(:log).exactly(2).times
|
98
|
+
@base.recipes
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'blazing'
|
3
|
+
require 'blazing/cli/create'
|
4
|
+
|
5
|
+
describe Blazing::CLI::Create do
|
6
|
+
|
7
|
+
before :each do
|
8
|
+
@logger = double('logger', :log => nil, :report => nil)
|
9
|
+
@config_generator = Blazing::CLI::Create.new(@logger)
|
10
|
+
end
|
11
|
+
|
12
|
+
it 'knows the source root for its tempate' do
|
13
|
+
Blazing::CLI::Create.source_root.should == File.dirname(__FILE__).gsub('spec', 'lib')
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'creates an empty directory for the config file' do
|
17
|
+
@config_generator.should_receive(:empty_directory).with(Blazing::DIRECTORY)
|
18
|
+
@config_generator.create_blazing_dir
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'creates the config file' do
|
22
|
+
@config_generator.should_receive(:template).with('templates/blazing.tt', Blazing::CONFIGURATION_FILE)
|
23
|
+
@config_generator.create_config_file
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'blazing/cli/hook'
|
3
|
+
|
4
|
+
describe Blazing::CLI::Hook do
|
5
|
+
|
6
|
+
it 'knows the source root for its tempate' do
|
7
|
+
Blazing::CLI::Hook.source_root.should == File.dirname(__FILE__).gsub('spec', 'lib')
|
8
|
+
end
|
9
|
+
|
10
|
+
it 'genereates the hook template in the correct location' do
|
11
|
+
@hook = Blazing::CLI::Hook.new(['test_target'])
|
12
|
+
@hook.should_receive(:template).with('templates/post-hook.tt', '/tmp/post-receive')
|
13
|
+
@hook.generate
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
@@ -0,0 +1,82 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'blazing/config'
|
3
|
+
|
4
|
+
describe Blazing::Config do
|
5
|
+
|
6
|
+
before :each do
|
7
|
+
@config = Blazing::Config.new
|
8
|
+
end
|
9
|
+
|
10
|
+
describe '#target' do
|
11
|
+
it 'adds a target to the config object' do
|
12
|
+
@config.target(:test_target, :deploy_to => 'smoeone@somewhere:/asdasdasd')
|
13
|
+
@config.targets.size.should == 1
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
describe '#use' do
|
18
|
+
it 'adds a recipe to the config object' do
|
19
|
+
@config.use(:rvm)
|
20
|
+
@config.recipes.size.should == 1
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
describe '#find_target' do
|
25
|
+
context 'when a target name is given' do
|
26
|
+
it 'returns the target with the given name' do
|
27
|
+
@config.target(:test_target, :deploy_to => 'smoeone@somewhere:/asdasdasd')
|
28
|
+
@config.find_target(:test_target).name.should == 'test_target'
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
context 'when no target name given' do
|
33
|
+
it 'returns the target defined in config if there is only one' do
|
34
|
+
@config.target(:test_target, :deploy_to => 'smoeone@somewhere:/asdasdasd')
|
35
|
+
@config.find_target.name.should == 'test_target'
|
36
|
+
end
|
37
|
+
|
38
|
+
it 'returns the default target if there is one' do
|
39
|
+
@config.target(:test_target, :deploy_to => 'smoeone@somewhere:/asdasdasd')
|
40
|
+
@config.target(:default_target, :default => true, :deploy_to => 'smoeone@somewhere:/asdasdasd')
|
41
|
+
@config.find_target.name.should == 'default_target'
|
42
|
+
end
|
43
|
+
|
44
|
+
it 'raises an error if no target could be determined' do
|
45
|
+
lambda { @config.find_target }.should raise_error
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
describe '.dsl_setter' do
|
51
|
+
before :each do
|
52
|
+
@config.class.class_eval do
|
53
|
+
dsl_setter :foo
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
it 'creates a dsl method to set the attribute in the config class' do
|
58
|
+
@config.foo 'something'
|
59
|
+
@config.instance_variable_get('@foo').should == 'something'
|
60
|
+
end
|
61
|
+
|
62
|
+
it 'creates a dsl method that allows to read the attribute in the config class' do
|
63
|
+
@config.foo 'something'
|
64
|
+
@config.foo.should == 'something'
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
describe '.load' do
|
69
|
+
it 'reads and parses the config file and returns a config object' do
|
70
|
+
Blazing.send(:remove_const, 'CONFIGURATION_FILE')
|
71
|
+
Blazing::CONFIGURATION_FILE = 'spec/support/config.rb'
|
72
|
+
Blazing::Config.load.should be_a Blazing::Config
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
describe '.read' do
|
77
|
+
it 'parses the config and returns a config object' do
|
78
|
+
@config.class.read {}.should be_a Blazing::Config
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
end
|