gitpusshuten 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.bundle/config +2 -0
- data/.gitignore +4 -0
- data/Gemfile +9 -0
- data/Gemfile.lock +53 -0
- data/README.md +7 -0
- data/bin/gitpusshuten +4 -0
- data/bin/heavenly +4 -0
- data/bin/ten +4 -0
- data/gitpusshuten.gemspec +26 -0
- data/lib/gitpusshuten/cli.rb +78 -0
- data/lib/gitpusshuten/command.rb +147 -0
- data/lib/gitpusshuten/commands/base.rb +246 -0
- data/lib/gitpusshuten/commands/delete.rb +27 -0
- data/lib/gitpusshuten/commands/help.rb +36 -0
- data/lib/gitpusshuten/commands/initialize.rb +61 -0
- data/lib/gitpusshuten/commands/push.rb +54 -0
- data/lib/gitpusshuten/commands/remote.rb +29 -0
- data/lib/gitpusshuten/commands/user.rb +252 -0
- data/lib/gitpusshuten/commands/version.rb +21 -0
- data/lib/gitpusshuten/configuration.rb +122 -0
- data/lib/gitpusshuten/environment.rb +70 -0
- data/lib/gitpusshuten/gem.rb +33 -0
- data/lib/gitpusshuten/git.rb +111 -0
- data/lib/gitpusshuten/helpers/environment/installers.rb +59 -0
- data/lib/gitpusshuten/helpers/environment/packages.rb +21 -0
- data/lib/gitpusshuten/helpers/environment/scp.rb +57 -0
- data/lib/gitpusshuten/helpers/environment/ssh.rb +77 -0
- data/lib/gitpusshuten/helpers/environment/ssh_key.rb +79 -0
- data/lib/gitpusshuten/helpers/environment/user.rb +70 -0
- data/lib/gitpusshuten/helpers/spinner.rb +98 -0
- data/lib/gitpusshuten/hook.rb +26 -0
- data/lib/gitpusshuten/hooks.rb +147 -0
- data/lib/gitpusshuten/initializer.rb +95 -0
- data/lib/gitpusshuten/local.rb +35 -0
- data/lib/gitpusshuten/log.rb +83 -0
- data/lib/gitpusshuten/modules/active_record/hooks.rb +19 -0
- data/lib/gitpusshuten/modules/apache/command.rb +354 -0
- data/lib/gitpusshuten/modules/bundler/command.rb +43 -0
- data/lib/gitpusshuten/modules/bundler/hooks.rb +8 -0
- data/lib/gitpusshuten/modules/mysql/command.rb +192 -0
- data/lib/gitpusshuten/modules/nanoc/hooks.rb +9 -0
- data/lib/gitpusshuten/modules/nginx/command.rb +447 -0
- data/lib/gitpusshuten/modules/passenger/command.rb +310 -0
- data/lib/gitpusshuten/modules/passenger/hooks.rb +4 -0
- data/lib/gitpusshuten/modules/rvm/command.rb +277 -0
- data/lib/gitpusshuten.rb +21 -0
- data/lib/templates/config.rb +37 -0
- data/lib/templates/hooks.rb +40 -0
- data/spec/cli_spec.rb +83 -0
- data/spec/command_spec.rb +76 -0
- data/spec/configuration_spec.rb +45 -0
- data/spec/environment_spec.rb +64 -0
- data/spec/fixtures/combined_hooks.rb +23 -0
- data/spec/fixtures/config.rb +23 -0
- data/spec/fixtures/hooks.rb +37 -0
- data/spec/fixtures/passenger.json +1 -0
- data/spec/gem_spec.rb +28 -0
- data/spec/git_spec.rb +59 -0
- data/spec/gitpusshuten_spec.rb +9 -0
- data/spec/hook_spec.rb +48 -0
- data/spec/hooks_spec.rb +150 -0
- data/spec/initializer_spec.rb +26 -0
- data/spec/log_spec.rb +20 -0
- data/spec/spec_helper.rb +43 -0
- metadata +220 -0
data/spec/cli_spec.rb
ADDED
@@ -0,0 +1,83 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe GitPusshuTen::CLI do
|
4
|
+
|
5
|
+
let(:cli) { GitPusshuTen::CLI.new }
|
6
|
+
|
7
|
+
it "should flatten the arguments" do
|
8
|
+
cli = GitPusshuTen::CLI.new(['tag', [['1.4.2', 'to'], 'staging']])
|
9
|
+
cli.arguments.should == ['1.4.2']
|
10
|
+
end
|
11
|
+
|
12
|
+
describe "extracting the environment" do
|
13
|
+
it "should return the environment" do
|
14
|
+
cli = GitPusshuTen::CLI.new(%w[tag 1.4.2 to staging])
|
15
|
+
cli.environment.should == :staging
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should return the environment" do
|
19
|
+
cli = GitPusshuTen::CLI.new(%w[delete development environment])
|
20
|
+
cli.environment.should == :development
|
21
|
+
end
|
22
|
+
|
23
|
+
it "should return the environment" do
|
24
|
+
cli = GitPusshuTen::CLI.new(%w[maintenance enable for production environment])
|
25
|
+
cli.environment.should == :production
|
26
|
+
end
|
27
|
+
|
28
|
+
it "should return the environment" do
|
29
|
+
cli = GitPusshuTen::CLI.new(%w[maintenance enable production environment])
|
30
|
+
cli.environment.should == :production
|
31
|
+
end
|
32
|
+
|
33
|
+
it "should return the environment" do
|
34
|
+
cli = GitPusshuTen::CLI.new(%w[maintenance enable for production])
|
35
|
+
cli.environment.should == :production
|
36
|
+
end
|
37
|
+
|
38
|
+
it "should return the environment" do
|
39
|
+
cli = GitPusshuTen::CLI.new(%w[maintenance enable for pr0duct10n])
|
40
|
+
cli.environment.should == :pr0duct10n
|
41
|
+
end
|
42
|
+
|
43
|
+
it "should return the environment" do
|
44
|
+
cli = GitPusshuTen::CLI.new(%w[nginx upload-vhost to production])
|
45
|
+
cli.environment.should == :production
|
46
|
+
end
|
47
|
+
|
48
|
+
it "should return the environment" do
|
49
|
+
cli = GitPusshuTen::CLI.new(%w[nginx download-vhost from production])
|
50
|
+
cli.environment.should == :production
|
51
|
+
end
|
52
|
+
|
53
|
+
it "should return the environment" do
|
54
|
+
cli = GitPusshuTen::CLI.new(%w[user install-ssh-key on staging])
|
55
|
+
cli.environment.should == :staging
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
describe '#command' do
|
60
|
+
it "should extract the command from the cli" do
|
61
|
+
cli = GitPusshuTen::CLI.new(%w[maintenance on for pr0duct10n])
|
62
|
+
cli.command.should == 'maintenance'
|
63
|
+
end
|
64
|
+
|
65
|
+
it "should make underscores from dashes for commands" do
|
66
|
+
cli = GitPusshuTen::CLI.new(%w[remote command on pr0duct10n ls -la])
|
67
|
+
cli.command.should == 'remote'
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
describe '#arguments' do
|
72
|
+
it do
|
73
|
+
cli = GitPusshuTen::CLI.new(%w[nginx upload-vhost to production])
|
74
|
+
cli.arguments.should == ['upload-vhost']
|
75
|
+
end
|
76
|
+
|
77
|
+
it do
|
78
|
+
cli = GitPusshuTen::CLI.new(%w[remote command on staging ls -la])
|
79
|
+
cli.arguments.should == ['command', 'ls', '-la']
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe GitPusshuTen::Command do
|
4
|
+
|
5
|
+
let(:cli) { mock('cli') }
|
6
|
+
let(:configuration) { mock('configuration') }
|
7
|
+
let(:hooks) { mock('hooks') }
|
8
|
+
let(:environment) { mock('environment') }
|
9
|
+
|
10
|
+
before do
|
11
|
+
cli.stubs(:command).returns('non_existing_command')
|
12
|
+
configuration.stubs(:additional_modules).returns([])
|
13
|
+
end
|
14
|
+
|
15
|
+
it "should error out if the command was not found" do
|
16
|
+
GitPusshuTen::Log.expects(:error).with('Command <non_existing_command> not found.')
|
17
|
+
GitPusshuTen::Command.any_instance.expects(:exit)
|
18
|
+
|
19
|
+
GitPusshuTen::Command.new(cli, configuration, hooks, environment)
|
20
|
+
end
|
21
|
+
|
22
|
+
describe '#available_commands' do
|
23
|
+
it "should display available commands without the .rb extension" do
|
24
|
+
GitPusshuTen::Command.any_instance.stubs(:exit)
|
25
|
+
GitPusshuTen::Log.stubs(:error)
|
26
|
+
|
27
|
+
command = GitPusshuTen::Command.new(cli, configuration, hooks, environment)
|
28
|
+
command.expects(:commands_directory).returns([Dir.pwd + '/commands/mock_tag.rb'])
|
29
|
+
command.available_commands.should include('mock_tag')
|
30
|
+
end
|
31
|
+
|
32
|
+
it "should not include the base command" do
|
33
|
+
GitPusshuTen::Command.any_instance.stubs(:exit)
|
34
|
+
GitPusshuTen::Log.stubs(:error)
|
35
|
+
|
36
|
+
command = GitPusshuTen::Command.new(cli, configuration, hooks, environment)
|
37
|
+
command.expects(:commands_directory).returns(Dir[File.expand_path(File.dirname(__FILE__) + '/../lib/gitpusshuten/commands/*.rb')])
|
38
|
+
command.available_commands.should_not include('base')
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
it "should initialize the specified command" do
|
43
|
+
GitPusshuTen::Command.any_instance.stubs(:exit)
|
44
|
+
GitPusshuTen::Log.stubs(:error)
|
45
|
+
|
46
|
+
GitPusshuTen::Commands::NonExistingCommand.expects(:new).with(cli, configuration, hooks, environment)
|
47
|
+
|
48
|
+
command = GitPusshuTen::Command.new(cli, configuration, hooks, environment)
|
49
|
+
command.stubs(:commands_directory).returns([Dir.pwd + '/commands/mock_tag.rb'])
|
50
|
+
command.command
|
51
|
+
end
|
52
|
+
|
53
|
+
describe "perform hooks" do
|
54
|
+
let(:command_initializer) { GitPusshuTen::Command.new(cli, configuration, hooks, environment) }
|
55
|
+
let(:command) { command_initializer.command }
|
56
|
+
|
57
|
+
before do
|
58
|
+
GitPusshuTen::Command.any_instance.stubs(:exit)
|
59
|
+
GitPusshuTen::Log.stubs(:error)
|
60
|
+
command.stubs(:validate!)
|
61
|
+
end
|
62
|
+
|
63
|
+
it "should invoke a pre-perform hook" do
|
64
|
+
command.expects(:pre_perform!).once
|
65
|
+
command.stubs(:post_perform!)
|
66
|
+
command_initializer.perform!
|
67
|
+
end
|
68
|
+
|
69
|
+
it "should invoke a post-perform hook" do
|
70
|
+
command.expects(:post_perform!).once
|
71
|
+
command.stubs(:pre_perform!)
|
72
|
+
command_initializer.perform!
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe GitPusshuTen::Configuration do
|
4
|
+
|
5
|
+
let(:configuration) { GitPusshuTen::Configuration.new(:staging) }
|
6
|
+
|
7
|
+
describe 'the environment name' do
|
8
|
+
it "should contain the remote environment" do
|
9
|
+
configuration.environment.should == :staging
|
10
|
+
end
|
11
|
+
|
12
|
+
it "should be a symbol object" do
|
13
|
+
GitPusshuTen::Log.expects(:error).with('Please use symbols as environment name.')
|
14
|
+
configuration.expects(:exit)
|
15
|
+
configuration.pusshuten('notasymbol', 'RSpec Production Example Application')
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
describe '#parse!' do
|
20
|
+
before do
|
21
|
+
configuration.parse!(File.dirname(__FILE__) + '/fixtures/config.rb')
|
22
|
+
end
|
23
|
+
|
24
|
+
it "should extract the application and remote branch names from the staging branch" do
|
25
|
+
configuration.application.should == 'RSpec Staging Example Application'
|
26
|
+
end
|
27
|
+
|
28
|
+
it "should parse the authorization details" do
|
29
|
+
configuration.user.should == 'git'
|
30
|
+
configuration.password.should == 'testtest'
|
31
|
+
configuration.passphrase.should == 'myphrase'
|
32
|
+
configuration.ip.should == '123.45.678.910'
|
33
|
+
configuration.port.should == '20'
|
34
|
+
|
35
|
+
configuration.path.should == '/var/apps/'
|
36
|
+
|
37
|
+
configuration.additional_modules.should == [:nginx, :passenger, :active_record]
|
38
|
+
end
|
39
|
+
|
40
|
+
it "should return self" do
|
41
|
+
configuration.should == configuration.parse!(File.dirname(__FILE__) + '/fixtures/config.rb')
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe GitPusshuTen::Environment do
|
4
|
+
|
5
|
+
let(:cli) { GitPusshuTen::CLI.new(%w[tag 1.4.2 to staging]) }
|
6
|
+
let(:configuration_file) { File.expand_path(File.dirname(__FILE__) + '/fixtures/config.rb') }
|
7
|
+
let(:configuration) { GitPusshuTen::Configuration.new(cli.environment).parse!(configuration_file) }
|
8
|
+
let(:environment) { GitPusshuTen::Environment.new(configuration) }
|
9
|
+
|
10
|
+
it "should initialize based on the provided configuration" do
|
11
|
+
environment.configuration.should be_an_instance_of(GitPusshuTen::Configuration)
|
12
|
+
end
|
13
|
+
|
14
|
+
describe '#app_dir' do
|
15
|
+
it "should be the <path>/<application>.<environment>" do
|
16
|
+
environment.app_dir.should == '/var/apps/rspec_staging_example_application.staging'
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
describe '#name' do
|
21
|
+
it "should return the name of the environment we're working in" do
|
22
|
+
environment.name.should == :staging
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
describe '#delete!' do
|
27
|
+
it "should delete the application root" do
|
28
|
+
environment.expects(:execute_as_user).with('rm -rf /var/apps/rspec_staging_example_application.staging')
|
29
|
+
environment.delete!
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
describe 'the ssh methods' do
|
34
|
+
describe '#authorized_ssh_keys' do
|
35
|
+
it do
|
36
|
+
environment.expects(:execute_as_root).with("cat '/var/apps/.ssh/authorized_keys'")
|
37
|
+
environment.authorized_ssh_keys
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
describe '#install_ssh_key!' do
|
42
|
+
it do
|
43
|
+
environment.expects(:ssh_key).returns('mysshkey')
|
44
|
+
environment.expects(:execute_as_root).with("mkdir -p '/var/apps/.ssh';echo 'mysshkey' >> '/var/apps/.ssh/authorized_keys';chown -R git:git '/var/apps/.ssh';chmod 700 '/var/apps/.ssh'; chmod 600 '/var/apps/.ssh/authorized_keys'")
|
45
|
+
environment.install_ssh_key!
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
describe '#download_packages!' do
|
51
|
+
it "should download the gitpusshuten packages" do
|
52
|
+
environment.expects(:execute_as_user).with("cd /var/apps/; git clone git://github.com/meskyanichi/gitpusshuten-packages.git")
|
53
|
+
environment.download_packages!('/var/apps/')
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
describe '#clean_up_packages!' do
|
58
|
+
it "should delete them as root" do
|
59
|
+
environment.expects(:execute_as_user).with("cd /var/apps; rm -rf gitpusshuten-packages")
|
60
|
+
environment.clean_up_packages!('/var/apps')
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
perform_on :staging, :production do
|
2
|
+
pre :remove_output do
|
3
|
+
run 'rm -rf output'
|
4
|
+
end
|
5
|
+
|
6
|
+
post :render_output do
|
7
|
+
run 'rake render:output'
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
perform_on :staging do
|
12
|
+
post :clear_whitespace do
|
13
|
+
run 'rake clear:whitespace'
|
14
|
+
run 'rake flush'
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
perform_on :production do
|
19
|
+
pre :update_vhost do
|
20
|
+
run 'webserver update vhost'
|
21
|
+
run 'webserver restart'
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
pusshuten 'RSpec Staging Example Application', :staging do
|
2
|
+
|
3
|
+
configure do |c|
|
4
|
+
c.user = 'git'
|
5
|
+
c.password = 'testtest'
|
6
|
+
c.passphrase = 'myphrase'
|
7
|
+
c.ip = '123.45.678.910'
|
8
|
+
c.port = '20'
|
9
|
+
|
10
|
+
c.path = '/var/apps/'
|
11
|
+
end
|
12
|
+
|
13
|
+
modules do |m|
|
14
|
+
m.add :nginx
|
15
|
+
m.add :passenger
|
16
|
+
m.add :active_record
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
|
21
|
+
pusshuten 'RSpec Production Example Application', :production do
|
22
|
+
|
23
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
perform_on :staging do
|
2
|
+
pre :remove_output do
|
3
|
+
run 'rm -rf output'
|
4
|
+
end
|
5
|
+
|
6
|
+
post :render_output do
|
7
|
+
run 'rake render:output'
|
8
|
+
end
|
9
|
+
|
10
|
+
post :restart_nginx_and_passenger do
|
11
|
+
run '/etc/init.d/nginx stop'
|
12
|
+
run 'sleep 1'
|
13
|
+
run '/etc/init.d/nginx start'
|
14
|
+
run 'mkdir tmp'
|
15
|
+
run 'touch tmp/restart.txt'
|
16
|
+
end
|
17
|
+
|
18
|
+
post :ensure_correct_branch do
|
19
|
+
run 'git commit -am "Commit and Ensuring"'
|
20
|
+
run 'git checkout master'
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
perform_on :production do
|
25
|
+
pre :maintenance_on do
|
26
|
+
run 'mv public/maintenance_off.html public/maintenance.html'
|
27
|
+
end
|
28
|
+
|
29
|
+
pre :clean_up_local do
|
30
|
+
run 'rake remove:trash'
|
31
|
+
end
|
32
|
+
|
33
|
+
post :update_vhost do
|
34
|
+
run 'webserver update vhost'
|
35
|
+
run 'webserver restart'
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
{"dependencies":{"runtime":[{"name":"rack","requirements":">= 0"},{"name":"file-tail","requirements":">= 0"},{"name":"daemon_controller","requirements":">= 0.2.5"},{"name":"fastthread","requirements":">= 1.0.1"},{"name":"rake","requirements":">= 0.8.1"}],"development":[]},"name":"passenger","downloads":333050,"info":"Easy and robust Ruby web application deployment.","version_downloads":25851,"version":"3.0.0","homepage_uri":"http://www.modrails.com/","bug_tracker_uri":"http://code.google.com/p/phusion-passenger/issues/list","source_code_uri":"http://github.com/FooBarWidget/passenger","gem_uri":"http://rubygems.org/gems/passenger-3.0.0.gem","project_uri":"http://rubygems.org/gems/passenger","authors":"Phusion - http://www.phusion.nl/","mailing_list_uri":"http://groups.google.com/group/phusion-passenger","documentation_uri":"http://www.modrails.com/documentation.html","wiki_uri":""}
|
data/spec/gem_spec.rb
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe GitPusshuTen::Gem do
|
4
|
+
|
5
|
+
before do
|
6
|
+
GitPusshuTen::Gem.any_instance.stubs(:base_url).returns(File.dirname(__FILE__) + '/fixtures')
|
7
|
+
end
|
8
|
+
|
9
|
+
it "should return the latest version of the Passenger gem" do
|
10
|
+
GitPusshuTen::Gem.new(:passenger).latest_version.should match /\d+\.\d+\..+/
|
11
|
+
end
|
12
|
+
|
13
|
+
describe "#outdated" do
|
14
|
+
it "should be outdated" do
|
15
|
+
gem = GitPusshuTen::Gem.new(:passenger)
|
16
|
+
gem.stubs(:latest_version).returns('3.0.0')
|
17
|
+
gem.outdated?('2.9.3').should be_true
|
18
|
+
end
|
19
|
+
|
20
|
+
it "should not be outdated" do
|
21
|
+
gem = GitPusshuTen::Gem.new(:passenger)
|
22
|
+
gem.stubs(:latest_version).returns('3.0.0')
|
23
|
+
gem.outdated?('3.0.0').should be_false
|
24
|
+
gem.outdated?('3.0.1').should be_false
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
data/spec/git_spec.rb
ADDED
@@ -0,0 +1,59 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe GitPusshuTen::Git do
|
4
|
+
|
5
|
+
let(:git) { GitPusshuTen::Git.new }
|
6
|
+
|
7
|
+
before do
|
8
|
+
%x(git remote rm rspec_staging) if %x(git remote) =~ /rspec_staging/
|
9
|
+
end
|
10
|
+
|
11
|
+
describe '#has_remote?' do
|
12
|
+
it 'should be able to see if a remote already exists' do
|
13
|
+
git.has_remote?(:rspec_staging).should be_false
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'should have a remote called staging' do
|
17
|
+
git.expects(:git).with('remote').returns('origin production rspec_staging')
|
18
|
+
git.has_remote?(:rspec_staging).should be_true
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
describe '#add_remote' do
|
23
|
+
it 'should add a remote with the specified url' do
|
24
|
+
git.expects(:git).with('remote add rspec_staging someurl')
|
25
|
+
git.add_remote(:rspec_staging, 'someurl')
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
describe '#remove_remote' do
|
30
|
+
it 'should remove a remote' do
|
31
|
+
git.expects(:git).with('remote rm rspec_staging')
|
32
|
+
git.remove_remote(:rspec_staging)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
describe '#pushing to a remote' do
|
37
|
+
context 'when pushing a tag' do
|
38
|
+
it 'should push a tag to the remote' do
|
39
|
+
git.expects(:git).with('push rspec_staging 1.4.2~0:refs/heads/master --force')
|
40
|
+
git.push(:tag, '1.4.2').to(:rspec_staging)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
context 'when pushing a branch' do
|
45
|
+
it 'should push a branch to the remote' do
|
46
|
+
git.expects(:git).with('push rspec_staging development:refs/heads/master --force')
|
47
|
+
git.push(:branch, :development).to(:rspec_staging)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
context 'when pushing a ref' do
|
52
|
+
it 'should push a ref to the remote' do
|
53
|
+
git.expects(:git).with('push rspec_staging ad36b4c018f7580db48c20fa4ed7911ea50a5684:refs/heads/master --force')
|
54
|
+
git.push(:ref, 'ad36b4c018f7580db48c20fa4ed7911ea50a5684').to(:rspec_staging)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
end
|
data/spec/hook_spec.rb
ADDED
@@ -0,0 +1,48 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe GitPusshuTen::Hook do
|
4
|
+
|
5
|
+
describe 'assigning a name' do
|
6
|
+
it "should assign a name" do
|
7
|
+
GitPusshuTen::Hook.new({
|
8
|
+
:name => :restart_webserver
|
9
|
+
}).name.should eql :restart_webserver
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
describe 'assigning a type' do
|
14
|
+
it "should set up a new pre hook" do
|
15
|
+
GitPusshuTen::Hook.new({
|
16
|
+
:type => :pre
|
17
|
+
}).type.should eql :pre
|
18
|
+
end
|
19
|
+
|
20
|
+
it "should set up a new post hook" do
|
21
|
+
GitPusshuTen::Hook.new({
|
22
|
+
:type => :post
|
23
|
+
}).type.should eql :post
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
describe 'assigning commands' do
|
28
|
+
it "should be nil if no commands are specified" do
|
29
|
+
hook = GitPusshuTen::Hook.new({
|
30
|
+
:commands => []
|
31
|
+
})
|
32
|
+
|
33
|
+
hook.commands.count.should == 0
|
34
|
+
end
|
35
|
+
|
36
|
+
it "should have an array of commands to run" do
|
37
|
+
hook = GitPusshuTen::Hook.new({
|
38
|
+
:commands => ['rm -rf *', 'killall', '/etc/init.d/nginx stop']
|
39
|
+
})
|
40
|
+
|
41
|
+
hook.commands.count.should == 3
|
42
|
+
hook.commands[0].should == 'rm -rf *'
|
43
|
+
hook.commands[1].should == 'killall'
|
44
|
+
hook.commands[2].should == '/etc/init.d/nginx stop'
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
data/spec/hooks_spec.rb
ADDED
@@ -0,0 +1,150 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe GitPusshuTen::Hooks do
|
4
|
+
|
5
|
+
let(:cli) { GitPusshuTen::CLI.new(%w[tag 1.4.2 to staging]) }
|
6
|
+
let(:configuration_file) { File.expand_path(File.dirname(__FILE__) + '/fixtures/config.rb') }
|
7
|
+
let(:configuration) { GitPusshuTen::Configuration.new(cli.environment).parse!(configuration_file) }
|
8
|
+
let(:hooks_staging) { GitPusshuTen::Hooks.new(:staging, configuration) }
|
9
|
+
let(:hooks_production) { GitPusshuTen::Hooks.new(:production, configuration) }
|
10
|
+
|
11
|
+
describe '#new' do
|
12
|
+
it "should intialize a new hooks object that takes a path to the hooks file as argument" do
|
13
|
+
hooks_staging
|
14
|
+
end
|
15
|
+
|
16
|
+
it "should set the environment" do
|
17
|
+
hooks_staging.environment.should == :staging
|
18
|
+
hooks_production.environment.should == :production
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
describe '#parse!' do
|
23
|
+
it "return the object instance itself" do
|
24
|
+
hooks_staging.should == hooks_staging.parse!(File.expand_path(File.dirname(__FILE__) + '/fixtures/hooks.rb'))
|
25
|
+
hooks_production.should == hooks_production.parse!(File.expand_path(File.dirname(__FILE__) + '/fixtures/hooks.rb'))
|
26
|
+
end
|
27
|
+
|
28
|
+
context "when the hooks file does not exist" do
|
29
|
+
it "should issue a warning" do
|
30
|
+
GitPusshuTen::Log.expects(:warning).with("Could not locate the hooks.rb file in /Users/Michael/Desktop/GitPusshuTen/spec/fixtures/hooks_not_exist.rb")
|
31
|
+
hooks_staging.should == hooks_staging.parse!(File.expand_path(File.dirname(__FILE__) + '/fixtures/hooks_not_exist.rb'))
|
32
|
+
end
|
33
|
+
|
34
|
+
it "should not attempt to parse it" do
|
35
|
+
GitPusshuTen::Log.stubs(:warning)
|
36
|
+
hooks_staging.expects(:instance_eval).never
|
37
|
+
hooks_staging.should == hooks_staging.parse!(File.expand_path(File.dirname(__FILE__) + '/fixtures/hooks_not_exist.rb'))
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
it "should parse if the hooks file eixsts" do
|
42
|
+
hooks_staging.expects(:instance_eval).once
|
43
|
+
hooks_staging.should == hooks_staging.parse!(File.expand_path(File.dirname(__FILE__) + '/fixtures/hooks.rb'))
|
44
|
+
end
|
45
|
+
|
46
|
+
describe 'storing parsed information' do
|
47
|
+
before do
|
48
|
+
hooks_staging.parse!(File.expand_path(File.dirname(__FILE__) + '/fixtures/hooks.rb'))
|
49
|
+
hooks_production.parse!(File.expand_path(File.dirname(__FILE__) + '/fixtures/hooks.rb'))
|
50
|
+
end
|
51
|
+
|
52
|
+
it "should load the hooks.rb file and parse it, setting values to the instance" do
|
53
|
+
hooks_staging.to_perform.size.should == 4
|
54
|
+
hooks_production.to_perform.size.should == 3
|
55
|
+
end
|
56
|
+
|
57
|
+
it "should have 1 pre hook and 3 post hooks" do
|
58
|
+
hooks_staging.pre_hooks.count.should == 1
|
59
|
+
hooks_staging.post_hooks.count.should == 3
|
60
|
+
end
|
61
|
+
|
62
|
+
it "should have 2 pre hook and 1 post hooks" do
|
63
|
+
hooks_production.pre_hooks.count.should == 2
|
64
|
+
hooks_production.post_hooks.count.should == 1
|
65
|
+
end
|
66
|
+
|
67
|
+
it "should extract the commands that must be run and add them as an array to the hook" do
|
68
|
+
hook_file_commands = ['rm -rf output', 'rake render:output', '/etc/init.d/nginx stop']
|
69
|
+
hook_file_commands += ['sleep 1', '/etc/init.d/nginx start', 'mkdir tmp', 'touch tmp/restart.txt']
|
70
|
+
hook_file_commands += ['git commit -am "Commit and Ensuring"', 'git checkout master']
|
71
|
+
hook_file_commands += ['mv public/maintenance_off.html public/maintenance.html', 'rake remove:trash']
|
72
|
+
hook_file_commands += ['webserver update vhost', 'webserver restart']
|
73
|
+
|
74
|
+
hooks_staging.to_perform.each do |hook|
|
75
|
+
hook.commands.each do |command|
|
76
|
+
hook_file_commands.should include(command)
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
hooks_production.to_perform.each do |hook|
|
81
|
+
hook.commands.each do |command|
|
82
|
+
hook_file_commands.should include(command)
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
hooks_staging.pre_hooks[0].commands.first.should == 'rm -rf output'
|
87
|
+
hooks_staging.post_hooks[1].commands.last.should == 'touch tmp/restart.txt'
|
88
|
+
hooks_production.post_hooks[0].commands.first.should == 'webserver update vhost'
|
89
|
+
hooks_production.post_hooks[0].commands.last.should == 'webserver restart'
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
describe 'storing parsed information from a combined config' do
|
94
|
+
before do
|
95
|
+
hooks_staging.parse!(File.expand_path(File.dirname(__FILE__) + '/fixtures/combined_hooks.rb'))
|
96
|
+
hooks_production.parse!(File.expand_path(File.dirname(__FILE__) + '/fixtures/combined_hooks.rb'))
|
97
|
+
end
|
98
|
+
|
99
|
+
it "should load the hooks.rb file and parse it, setting values to the instance" do
|
100
|
+
hooks_staging.to_perform.size.should == 3
|
101
|
+
hooks_production.to_perform.size.should == 3
|
102
|
+
end
|
103
|
+
|
104
|
+
it "should have 1 pre hook and 3 post hooks" do
|
105
|
+
hooks_staging.pre_hooks.count.should == 1
|
106
|
+
hooks_staging.post_hooks.count.should == 2
|
107
|
+
end
|
108
|
+
|
109
|
+
it "should have 2 pre hook and 1 post hooks" do
|
110
|
+
hooks_production.pre_hooks.count.should == 2
|
111
|
+
hooks_production.post_hooks.count.should == 1
|
112
|
+
end
|
113
|
+
|
114
|
+
it "should extract the commands that must be run and add them as an array to the hook" do
|
115
|
+
hooks_staging.pre_hooks[0].commands[0].should == 'rm -rf output'
|
116
|
+
hooks_staging.post_hooks[0].commands[0].should == 'rake render:output'
|
117
|
+
hooks_staging.post_hooks[1].commands[0].should == 'rake clear:whitespace'
|
118
|
+
hooks_staging.post_hooks[1].commands[1].should == 'rake flush'
|
119
|
+
|
120
|
+
hooks_production.pre_hooks[0].commands[0].should == 'rm -rf output'
|
121
|
+
hooks_production.pre_hooks[1].commands[0].should == 'webserver update vhost'
|
122
|
+
hooks_production.pre_hooks[1].commands[1].should == 'webserver restart'
|
123
|
+
hooks_production.post_hooks[0].commands[0].should == 'rake render:output'
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
describe 'the hooks' do
|
129
|
+
|
130
|
+
let(:cli) { GitPusshuTen::CLI.new(%w[tag 1.4.2 to staging]) }
|
131
|
+
let(:configuration_file) { File.expand_path(File.dirname(__FILE__) + '/fixtures/config.rb') }
|
132
|
+
let(:configuration) { GitPusshuTen::Configuration.new(cli.environment).parse!(configuration_file) }
|
133
|
+
let(:hooks_file) { File.expand_path(File.dirname(__FILE__) + '/fixtures/hooks.rb') }
|
134
|
+
let(:hooks) { GitPusshuTen::Hooks.new(cli.environment, configuration).parse!(hooks_file) }
|
135
|
+
let(:environment) { GitPusshuTen::Environment.new(configuration) }
|
136
|
+
let(:command) { GitPusshuTen::Commands::NonExistingCommand.new(cli, configuration, hooks, environment) }
|
137
|
+
|
138
|
+
describe '#render_commands_as_string' do
|
139
|
+
it do
|
140
|
+
hooks.render_commands(hooks.post_hooks).should == {
|
141
|
+
:render_output => 'rake render:output;',
|
142
|
+
:restart_nginx_and_passenger => '/etc/init.d/nginx stop;sleep 1;/etc/init.d/nginx start;mkdir tmp;touch tmp/restart.txt;',
|
143
|
+
:ensure_correct_branch => 'git commit -am "Commit and Ensuring";git checkout master;'
|
144
|
+
}
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
end
|
149
|
+
|
150
|
+
end
|