fezzik 0.7.2 → 0.7.3
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +1 -0
- data/Rakefile +11 -1
- data/Vagrantfile +99 -0
- data/bin/fez +20 -16
- data/fezzik.gemspec +3 -1
- data/lib/fezzik.rb +2 -1
- data/lib/fezzik/colors.rb +7 -0
- data/lib/fezzik/thread_local_io.rb +45 -0
- data/lib/fezzik/util.rb +3 -3
- data/lib/fezzik/version.rb +1 -1
- data/test/integration/base_test.rb +19 -0
- data/test/integration/environment_test.rb +22 -0
- data/test/integration_test_helper.rb +47 -0
- metadata +30 -8
data/.gitignore
CHANGED
data/Rakefile
CHANGED
@@ -1,3 +1,14 @@
|
|
1
|
+
require "rake/testtask"
|
2
|
+
|
3
|
+
task :test => ["test:integrations"]
|
4
|
+
|
5
|
+
namespace :test do
|
6
|
+
Rake::TestTask.new(:integrations) do |task|
|
7
|
+
task.libs << "test"
|
8
|
+
task.test_files = FileList["test/integration/**/*_test.rb"]
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
1
12
|
desc "remove built gems"
|
2
13
|
task :clean do
|
3
14
|
sh "rm fezzik-*" rescue true
|
@@ -12,4 +23,3 @@ desc "install gem"
|
|
12
23
|
task :install => [:clean, :build] do
|
13
24
|
sh "gem install `ls fezzik-*`"
|
14
25
|
end
|
15
|
-
|
data/Vagrantfile
ADDED
@@ -0,0 +1,99 @@
|
|
1
|
+
# -*- mode: ruby -*-
|
2
|
+
# vi: set ft=ruby :
|
3
|
+
|
4
|
+
Vagrant::Config.run do |config|
|
5
|
+
# All Vagrant configuration is done here. The most common configuration
|
6
|
+
# options are documented and commented below. For a complete reference,
|
7
|
+
# please see the online documentation at vagrantup.com.
|
8
|
+
|
9
|
+
# Every Vagrant virtual environment requires a box to build off of.
|
10
|
+
config.vm.box = "lucid32"
|
11
|
+
|
12
|
+
# The url from where the 'config.vm.box' box will be fetched if it
|
13
|
+
# doesn't already exist on the user's system.
|
14
|
+
config.vm.box_url = "http://files.vagrantup.com/lucid32.box"
|
15
|
+
|
16
|
+
# Boot with a GUI so you can see the screen. (Default is headless)
|
17
|
+
# config.vm.boot_mode = :gui
|
18
|
+
|
19
|
+
# Assign this VM to a host-only network IP, allowing you to access it
|
20
|
+
# via the IP. Host-only networks can talk to the host machine as well as
|
21
|
+
# any other machines on the same network, but cannot be accessed (through this
|
22
|
+
# network interface) by any external networks.
|
23
|
+
# config.vm.network :hostonly, "192.168.33.10"
|
24
|
+
|
25
|
+
# Assign this VM to a bridged network, allowing you to connect directly to a
|
26
|
+
# network using the host's network device. This makes the VM appear as another
|
27
|
+
# physical device on your network.
|
28
|
+
# config.vm.network :bridged
|
29
|
+
|
30
|
+
# Forward a port from the guest to the host, which allows for outside
|
31
|
+
# computers to access the VM, whereas host only networking does not.
|
32
|
+
# config.vm.forward_port 80, 8080
|
33
|
+
|
34
|
+
# Share an additional folder to the guest VM. The first argument is
|
35
|
+
# an identifier, the second is the path on the guest to mount the
|
36
|
+
# folder, and the third is the path on the host to the actual folder.
|
37
|
+
# config.vm.share_folder "v-data", "/vagrant_data", "../data"
|
38
|
+
|
39
|
+
# Enable provisioning with Puppet stand alone. Puppet manifests
|
40
|
+
# are contained in a directory path relative to this Vagrantfile.
|
41
|
+
# You will need to create the manifests directory and a manifest in
|
42
|
+
# the file base.pp in the manifests_path directory.
|
43
|
+
#
|
44
|
+
# An example Puppet manifest to provision the message of the day:
|
45
|
+
#
|
46
|
+
# # group { "puppet":
|
47
|
+
# # ensure => "present",
|
48
|
+
# # }
|
49
|
+
# #
|
50
|
+
# # File { owner => 0, group => 0, mode => 0644 }
|
51
|
+
# #
|
52
|
+
# # file { '/etc/motd':
|
53
|
+
# # content => "Welcome to your Vagrant-built virtual machine!
|
54
|
+
# # Managed by Puppet.\n"
|
55
|
+
# # }
|
56
|
+
#
|
57
|
+
# config.vm.provision :puppet do |puppet|
|
58
|
+
# puppet.manifests_path = "manifests"
|
59
|
+
# puppet.manifest_file = "base.pp"
|
60
|
+
# end
|
61
|
+
|
62
|
+
# Enable provisioning with chef solo, specifying a cookbooks path, roles
|
63
|
+
# path, and data_bags path (all relative to this Vagrantfile), and adding
|
64
|
+
# some recipes and/or roles.
|
65
|
+
#
|
66
|
+
# config.vm.provision :chef_solo do |chef|
|
67
|
+
# chef.cookbooks_path = "../my-recipes/cookbooks"
|
68
|
+
# chef.roles_path = "../my-recipes/roles"
|
69
|
+
# chef.data_bags_path = "../my-recipes/data_bags"
|
70
|
+
# chef.add_recipe "mysql"
|
71
|
+
# chef.add_role "web"
|
72
|
+
#
|
73
|
+
# # You may also specify custom JSON attributes:
|
74
|
+
# chef.json = { :mysql_password => "foo" }
|
75
|
+
# end
|
76
|
+
|
77
|
+
# Enable provisioning with chef server, specifying the chef server URL,
|
78
|
+
# and the path to the validation key (relative to this Vagrantfile).
|
79
|
+
#
|
80
|
+
# The Opscode Platform uses HTTPS. Substitute your organization for
|
81
|
+
# ORGNAME in the URL and validation key.
|
82
|
+
#
|
83
|
+
# If you have your own Chef Server, use the appropriate URL, which may be
|
84
|
+
# HTTP instead of HTTPS depending on your configuration. Also change the
|
85
|
+
# validation key to validation.pem.
|
86
|
+
#
|
87
|
+
# config.vm.provision :chef_client do |chef|
|
88
|
+
# chef.chef_server_url = "https://api.opscode.com/organizations/ORGNAME"
|
89
|
+
# chef.validation_key_path = "ORGNAME-validator.pem"
|
90
|
+
# end
|
91
|
+
#
|
92
|
+
# If you're using the Opscode platform, your validator client is
|
93
|
+
# ORGNAME-validator, replacing ORGNAME with your organization name.
|
94
|
+
#
|
95
|
+
# IF you have your own Chef Server, the default validation client name is
|
96
|
+
# chef-validator, unless you changed the configuration.
|
97
|
+
#
|
98
|
+
# chef.validation_client_name = "ORGNAME-validator"
|
99
|
+
end
|
data/bin/fez
CHANGED
@@ -2,7 +2,6 @@
|
|
2
2
|
|
3
3
|
require "rubygems"
|
4
4
|
require "rake"
|
5
|
-
require "colorize"
|
6
5
|
require "fezzik"
|
7
6
|
|
8
7
|
# Required for using rake/remote-task with rake >= 0.9.x
|
@@ -10,18 +9,21 @@ include Rake::DSL
|
|
10
9
|
|
11
10
|
Fezzik.activated = true
|
12
11
|
|
13
|
-
|
14
|
-
<<-EOF
|
12
|
+
USAGE = <<EOF
|
15
13
|
Version #{Fezzik::VERSION}
|
16
14
|
fez <destination> <tasks> # Run deployment tasks on destination servers
|
17
15
|
fez get <tasks> # Download tasks to use in your project
|
18
16
|
fez -T # Display all tasks
|
19
|
-
|
20
|
-
end
|
17
|
+
EOF
|
21
18
|
|
22
19
|
def print_usage_and_exit
|
23
|
-
puts
|
24
|
-
exit
|
20
|
+
puts USAGE
|
21
|
+
exit
|
22
|
+
end
|
23
|
+
|
24
|
+
def print_version_and_exit
|
25
|
+
puts "Version #{Fezzik::VERSION}"
|
26
|
+
exit
|
25
27
|
end
|
26
28
|
|
27
29
|
def display_tasks_and_exit
|
@@ -30,7 +32,7 @@ def display_tasks_and_exit
|
|
30
32
|
Rake.application.options.show_task_pattern = /^fezzik:/
|
31
33
|
output = Fezzik::Util.capture_output { Rake.application.display_tasks_and_comments }
|
32
34
|
output.gsub!(/^rake fezzik:/, "fez <destination> ")
|
33
|
-
puts output
|
35
|
+
puts output.strip.empty? ? "(No Fezzik tasks with descriptions are defined.)" : output
|
34
36
|
exit 0
|
35
37
|
end
|
36
38
|
|
@@ -40,9 +42,9 @@ def download_tasks_and_exit
|
|
40
42
|
task += ".rake" unless task =~ /\.rake$/
|
41
43
|
system("curl -f #{TASKS_URL}/#{task} -o #{task} > /dev/null 2>&1")
|
42
44
|
if $? == 0
|
43
|
-
puts " [new]"
|
45
|
+
puts Fezzik.color_string(" [new]", :green) + " #{task}"
|
44
46
|
else
|
45
|
-
puts " [fail]"
|
47
|
+
puts Fezzik.color_string(" [fail]", :red) + " #{task}"
|
46
48
|
end
|
47
49
|
end
|
48
50
|
exit 0
|
@@ -61,7 +63,7 @@ def run_fezzik_tasks
|
|
61
63
|
rescue Rake::ConfigurationError => e
|
62
64
|
puts "Invalid destination: #{Fezzik.target_destination}"
|
63
65
|
puts "Make sure this destination is configured and includes `set :domain, \"yourdomain.com\"`"
|
64
|
-
puts "[fail]"
|
66
|
+
puts Fezzik.color_string("[fail]", :red)
|
65
67
|
exit 1
|
66
68
|
end
|
67
69
|
begin
|
@@ -70,21 +72,23 @@ def run_fezzik_tasks
|
|
70
72
|
task_name, params = Fezzik::Util.split_task_and_params(task_with_params)
|
71
73
|
Rake::Task["fezzik:#{task_name}"].invoke(params)
|
72
74
|
end
|
73
|
-
puts "[success]"
|
75
|
+
puts Fezzik.color_string("[success]", :green)
|
74
76
|
rescue SystemExit, Rake::CommandFailedError => e
|
75
|
-
puts "[fail]"
|
77
|
+
puts Fezzik.color_string("[fail]", :red)
|
76
78
|
exit 1
|
77
79
|
rescue StandardError => e
|
78
80
|
puts e.message
|
79
81
|
puts e.backtrace
|
80
|
-
puts "[fail]"
|
82
|
+
puts Fezzik.color_string("[fail]", :red)
|
81
83
|
fail
|
82
84
|
end
|
83
85
|
end
|
84
86
|
|
85
87
|
case ARGV[0]
|
86
|
-
when nil
|
87
|
-
when "-
|
88
|
+
when nil then abort USAGE
|
89
|
+
when "-h", "--help" then print_usage_and_exit
|
90
|
+
when "-v", "--version" then print_version_and_exit
|
91
|
+
when "-T", "--tasks" then display_tasks_and_exit
|
88
92
|
when "get" then download_tasks_and_exit
|
89
93
|
else run_fezzik_tasks
|
90
94
|
end
|
data/fezzik.gemspec
CHANGED
@@ -22,5 +22,7 @@ Gem::Specification.new do |s|
|
|
22
22
|
s.files = `git ls-files`.split("\n")
|
23
23
|
|
24
24
|
s.add_dependency("rake-remote_task", "~>2.0.2")
|
25
|
-
|
25
|
+
|
26
|
+
s.add_development_dependency("scope", "~>0.2.3")
|
27
|
+
s.add_development_dependency("vagrant", "~>1.0.5")
|
26
28
|
end
|
data/lib/fezzik.rb
CHANGED
@@ -2,11 +2,12 @@ require "stringio"
|
|
2
2
|
require "thread"
|
3
3
|
require "rake"
|
4
4
|
require "rake/remote_task"
|
5
|
-
require "colorize"
|
6
5
|
require "fezzik/base"
|
6
|
+
require "fezzik/colors"
|
7
7
|
require "fezzik/dsl"
|
8
8
|
require "fezzik/environment"
|
9
9
|
require "fezzik/role"
|
10
10
|
require "fezzik/io"
|
11
|
+
require "fezzik/thread_local_io"
|
11
12
|
require "fezzik/util"
|
12
13
|
require "fezzik/version"
|
@@ -0,0 +1,45 @@
|
|
1
|
+
# Overrides $stdout and allows it to be overridden by the thread-local variable Thread.current[:stdout].
|
2
|
+
#
|
3
|
+
# If Thread.current[:stdout] is set, the thread will write all output there. Otherwise the thread will
|
4
|
+
# use $stdout as normal.
|
5
|
+
#
|
6
|
+
# Example usage:
|
7
|
+
#
|
8
|
+
# out = StringIO.new
|
9
|
+
#
|
10
|
+
# Thread.start do
|
11
|
+
# Thread.current[:stdout] = out
|
12
|
+
# puts "thread1"
|
13
|
+
# end.join
|
14
|
+
#
|
15
|
+
# Thread.start do
|
16
|
+
# puts "thread2"
|
17
|
+
# end.join
|
18
|
+
#
|
19
|
+
# puts out.string
|
20
|
+
#
|
21
|
+
# Output:
|
22
|
+
# thread2
|
23
|
+
# thread1
|
24
|
+
|
25
|
+
class ThreadLocalIO < IO
|
26
|
+
@@former_stdout = $stdout
|
27
|
+
|
28
|
+
def self.write(*args)
|
29
|
+
if Thread.current[:stdout]
|
30
|
+
Thread.current[:stdout].write(*args)
|
31
|
+
else
|
32
|
+
@@former_stdout.write(*args)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def self.flush
|
37
|
+
if Thread.current[:stdout]
|
38
|
+
Thread.current[:stdout].flush
|
39
|
+
else
|
40
|
+
@@former_stdout.flush
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
$stdout = ThreadLocalIO
|
data/lib/fezzik/util.rb
CHANGED
@@ -2,11 +2,11 @@ module Fezzik
|
|
2
2
|
module Util
|
3
3
|
def self.capture_output(&block)
|
4
4
|
output = StringIO.new
|
5
|
-
|
5
|
+
Thread.current[:stdout] = output
|
6
6
|
block.call
|
7
|
-
|
7
|
+
output.string
|
8
8
|
ensure
|
9
|
-
|
9
|
+
Thread.current[:stdout] = STDOUT
|
10
10
|
end
|
11
11
|
|
12
12
|
def self.split_task_and_params(task_with_params)
|
data/lib/fezzik/version.rb
CHANGED
@@ -0,0 +1,19 @@
|
|
1
|
+
require File.expand_path("../integration_test_helper", File.dirname(__FILE__))
|
2
|
+
|
3
|
+
class BaseTest < Scope::TestCase
|
4
|
+
context "base" do
|
5
|
+
|
6
|
+
namespace :fezzik do
|
7
|
+
remote_task(:touch, :path) { |t, args| run "touch #{args[:path]}" }
|
8
|
+
remote_task(:rm, :path) { |t, args| run "rm #{args[:path]}" }
|
9
|
+
end
|
10
|
+
|
11
|
+
should "create and delete files on the remote host" do
|
12
|
+
fez :touch, "/tmp/touch"
|
13
|
+
assert_file_exists("/tmp/touch")
|
14
|
+
|
15
|
+
fez :rm, "/tmp/touch"
|
16
|
+
refute_file_exists("/tmp/touch")
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require File.expand_path("../integration_test_helper", File.dirname(__FILE__))
|
2
|
+
|
3
|
+
class EnvironmentTest < Scope::TestCase
|
4
|
+
context "environment" do
|
5
|
+
|
6
|
+
destination :vagrant do
|
7
|
+
env :hero, "mario"
|
8
|
+
env :villain, "bowser", :hosts => [VAGRANT_DOMAIN]
|
9
|
+
end
|
10
|
+
|
11
|
+
should "store environment settings" do
|
12
|
+
assert_equal "mario", Fezzik.environments[VAGRANT_DOMAIN][:hero]
|
13
|
+
end
|
14
|
+
|
15
|
+
should "store environment settings for a subset of hosts" do
|
16
|
+
# This isn't actually a great test for this, but testing with multiple hosts would require a second
|
17
|
+
# vagrant configuration.
|
18
|
+
assert_equal "bowser", Fezzik.environments[VAGRANT_DOMAIN][:villain]
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
@@ -0,0 +1,47 @@
|
|
1
|
+
require "bundler/setup"
|
2
|
+
require "scope"
|
3
|
+
require "minitest/autorun"
|
4
|
+
|
5
|
+
require "fezzik"
|
6
|
+
include Fezzik::DSL
|
7
|
+
include Rake::DSL
|
8
|
+
|
9
|
+
ENV["fezzik_destination"] = "vagrant"
|
10
|
+
Fezzik.init
|
11
|
+
|
12
|
+
VAGRANT_DOMAIN = "fezzik-vagrant"
|
13
|
+
|
14
|
+
destination :vagrant do
|
15
|
+
set :user, "vagrant"
|
16
|
+
set :domain, VAGRANT_DOMAIN
|
17
|
+
end
|
18
|
+
|
19
|
+
def setup_vagrant
|
20
|
+
system("mkdir -p ~/.ssh; touch ~/.ssh/config")
|
21
|
+
ssh_configured = `grep "fezzik-vagrant" ~/.ssh/config`.size > 0
|
22
|
+
unless ssh_configured
|
23
|
+
puts "Generating vagrant ssh config in ~/.ssh/config"
|
24
|
+
ssh_config = `vagrant ssh-config`.gsub("Host default", "\nHost fezzik-vagrant") << " LogLevel QUIET\n"
|
25
|
+
system("echo '#{ssh_config}' >> ~/.ssh/config")
|
26
|
+
end
|
27
|
+
|
28
|
+
vagrant_running = `vagrant status | grep "running"`.size > 0
|
29
|
+
unless vagrant_running
|
30
|
+
puts "Starting vagrant (run 'vagrant halt' to shutdown)"
|
31
|
+
system("vagrant up")
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def fez(task, params = nil)
|
36
|
+
Rake::Task["fezzik:#{task}"].invoke(params)
|
37
|
+
end
|
38
|
+
|
39
|
+
def assert_file_exists(path)
|
40
|
+
assert_equal path, `ssh vagrant@fezzik-vagrant ls #{path} 2> /dev/null`.chomp
|
41
|
+
end
|
42
|
+
|
43
|
+
def refute_file_exists(path)
|
44
|
+
refute_equal path, `ssh vagrant@fezzik-vagrant ls #{path} 2> /dev/null`.chomp
|
45
|
+
end
|
46
|
+
|
47
|
+
setup_vagrant()
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fezzik
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.7.
|
4
|
+
version: 0.7.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2012-
|
13
|
+
date: 2012-11-27 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: rake-remote_task
|
@@ -29,21 +29,37 @@ dependencies:
|
|
29
29
|
- !ruby/object:Gem::Version
|
30
30
|
version: 2.0.2
|
31
31
|
- !ruby/object:Gem::Dependency
|
32
|
-
name:
|
32
|
+
name: scope
|
33
33
|
requirement: !ruby/object:Gem::Requirement
|
34
34
|
none: false
|
35
35
|
requirements:
|
36
|
-
- -
|
36
|
+
- - ~>
|
37
37
|
- !ruby/object:Gem::Version
|
38
|
-
version: 0.
|
39
|
-
type: :
|
38
|
+
version: 0.2.3
|
39
|
+
type: :development
|
40
40
|
prerelease: false
|
41
41
|
version_requirements: !ruby/object:Gem::Requirement
|
42
42
|
none: false
|
43
43
|
requirements:
|
44
|
-
- -
|
44
|
+
- - ~>
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: 0.2.3
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: vagrant
|
49
|
+
requirement: !ruby/object:Gem::Requirement
|
50
|
+
none: false
|
51
|
+
requirements:
|
52
|
+
- - ~>
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 1.0.5
|
55
|
+
type: :development
|
56
|
+
prerelease: false
|
57
|
+
version_requirements: !ruby/object:Gem::Requirement
|
58
|
+
none: false
|
59
|
+
requirements:
|
60
|
+
- - ~>
|
45
61
|
- !ruby/object:Gem::Version
|
46
|
-
version: 0.5
|
62
|
+
version: 1.0.5
|
47
63
|
description: A light deployment system that gets out of your way
|
48
64
|
email: dmacdougall@gmail.com
|
49
65
|
executables:
|
@@ -55,20 +71,26 @@ files:
|
|
55
71
|
- Gemfile
|
56
72
|
- README.md
|
57
73
|
- Rakefile
|
74
|
+
- Vagrantfile
|
58
75
|
- bin/fez
|
59
76
|
- fezzik.gemspec
|
60
77
|
- lib/fezzik.rb
|
61
78
|
- lib/fezzik/base.rb
|
79
|
+
- lib/fezzik/colors.rb
|
62
80
|
- lib/fezzik/dsl.rb
|
63
81
|
- lib/fezzik/environment.rb
|
64
82
|
- lib/fezzik/io.rb
|
65
83
|
- lib/fezzik/role.rb
|
84
|
+
- lib/fezzik/thread_local_io.rb
|
66
85
|
- lib/fezzik/util.rb
|
67
86
|
- lib/fezzik/version.rb
|
68
87
|
- tasks/command.rake
|
69
88
|
- tasks/deploy.rake
|
70
89
|
- tasks/environment.rake
|
71
90
|
- tasks/rollback.rake
|
91
|
+
- test/integration/base_test.rb
|
92
|
+
- test/integration/environment_test.rb
|
93
|
+
- test/integration_test_helper.rb
|
72
94
|
homepage: http://github.com/dmacdougall/fezzik
|
73
95
|
licenses: []
|
74
96
|
post_install_message:
|