minmb-capistrano 2.15.4
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +10 -0
- data/.travis.yml +7 -0
- data/CHANGELOG +1170 -0
- data/Gemfile +13 -0
- data/README.md +94 -0
- data/Rakefile +11 -0
- data/bin/cap +4 -0
- data/bin/capify +92 -0
- data/capistrano.gemspec +40 -0
- data/lib/capistrano.rb +5 -0
- data/lib/capistrano/callback.rb +45 -0
- data/lib/capistrano/cli.rb +47 -0
- data/lib/capistrano/cli/execute.rb +85 -0
- data/lib/capistrano/cli/help.rb +125 -0
- data/lib/capistrano/cli/help.txt +81 -0
- data/lib/capistrano/cli/options.rb +243 -0
- data/lib/capistrano/cli/ui.rb +40 -0
- data/lib/capistrano/command.rb +303 -0
- data/lib/capistrano/configuration.rb +57 -0
- data/lib/capistrano/configuration/actions/file_transfer.rb +50 -0
- data/lib/capistrano/configuration/actions/inspect.rb +46 -0
- data/lib/capistrano/configuration/actions/invocation.rb +329 -0
- data/lib/capistrano/configuration/alias_task.rb +26 -0
- data/lib/capistrano/configuration/callbacks.rb +147 -0
- data/lib/capistrano/configuration/connections.rb +237 -0
- data/lib/capistrano/configuration/execution.rb +142 -0
- data/lib/capistrano/configuration/loading.rb +205 -0
- data/lib/capistrano/configuration/log_formatters.rb +75 -0
- data/lib/capistrano/configuration/namespaces.rb +223 -0
- data/lib/capistrano/configuration/roles.rb +77 -0
- data/lib/capistrano/configuration/servers.rb +116 -0
- data/lib/capistrano/configuration/variables.rb +127 -0
- data/lib/capistrano/errors.rb +19 -0
- data/lib/capistrano/ext/multistage.rb +64 -0
- data/lib/capistrano/ext/string.rb +5 -0
- data/lib/capistrano/extensions.rb +57 -0
- data/lib/capistrano/fix_rake_deprecated_dsl.rb +8 -0
- data/lib/capistrano/logger.rb +166 -0
- data/lib/capistrano/processable.rb +57 -0
- data/lib/capistrano/recipes/compat.rb +32 -0
- data/lib/capistrano/recipes/deploy.rb +625 -0
- data/lib/capistrano/recipes/deploy/assets.rb +201 -0
- data/lib/capistrano/recipes/deploy/dependencies.rb +44 -0
- data/lib/capistrano/recipes/deploy/local_dependency.rb +54 -0
- data/lib/capistrano/recipes/deploy/remote_dependency.rb +117 -0
- data/lib/capistrano/recipes/deploy/scm.rb +19 -0
- data/lib/capistrano/recipes/deploy/scm/accurev.rb +169 -0
- data/lib/capistrano/recipes/deploy/scm/base.rb +200 -0
- data/lib/capistrano/recipes/deploy/scm/bzr.rb +86 -0
- data/lib/capistrano/recipes/deploy/scm/cvs.rb +153 -0
- data/lib/capistrano/recipes/deploy/scm/darcs.rb +96 -0
- data/lib/capistrano/recipes/deploy/scm/git.rb +293 -0
- data/lib/capistrano/recipes/deploy/scm/mercurial.rb +137 -0
- data/lib/capistrano/recipes/deploy/scm/none.rb +55 -0
- data/lib/capistrano/recipes/deploy/scm/perforce.rb +152 -0
- data/lib/capistrano/recipes/deploy/scm/subversion.rb +121 -0
- data/lib/capistrano/recipes/deploy/strategy.rb +19 -0
- data/lib/capistrano/recipes/deploy/strategy/base.rb +92 -0
- data/lib/capistrano/recipes/deploy/strategy/checkout.rb +20 -0
- data/lib/capistrano/recipes/deploy/strategy/copy.rb +338 -0
- data/lib/capistrano/recipes/deploy/strategy/export.rb +20 -0
- data/lib/capistrano/recipes/deploy/strategy/remote.rb +52 -0
- data/lib/capistrano/recipes/deploy/strategy/remote_cache.rb +57 -0
- data/lib/capistrano/recipes/deploy/strategy/unshared_remote_cache.rb +21 -0
- data/lib/capistrano/recipes/standard.rb +37 -0
- data/lib/capistrano/recipes/templates/maintenance.rhtml +53 -0
- data/lib/capistrano/role.rb +102 -0
- data/lib/capistrano/server_definition.rb +56 -0
- data/lib/capistrano/shell.rb +265 -0
- data/lib/capistrano/ssh.rb +95 -0
- data/lib/capistrano/task_definition.rb +77 -0
- data/lib/capistrano/transfer.rb +218 -0
- data/lib/capistrano/version.rb +11 -0
- data/test/cli/execute_test.rb +132 -0
- data/test/cli/help_test.rb +165 -0
- data/test/cli/options_test.rb +329 -0
- data/test/cli/ui_test.rb +28 -0
- data/test/cli_test.rb +17 -0
- data/test/command_test.rb +322 -0
- data/test/configuration/actions/file_transfer_test.rb +61 -0
- data/test/configuration/actions/inspect_test.rb +76 -0
- data/test/configuration/actions/invocation_test.rb +288 -0
- data/test/configuration/alias_task_test.rb +118 -0
- data/test/configuration/callbacks_test.rb +201 -0
- data/test/configuration/connections_test.rb +439 -0
- data/test/configuration/execution_test.rb +175 -0
- data/test/configuration/loading_test.rb +148 -0
- data/test/configuration/namespace_dsl_test.rb +332 -0
- data/test/configuration/roles_test.rb +157 -0
- data/test/configuration/servers_test.rb +183 -0
- data/test/configuration/variables_test.rb +190 -0
- data/test/configuration_test.rb +77 -0
- data/test/deploy/local_dependency_test.rb +76 -0
- data/test/deploy/remote_dependency_test.rb +146 -0
- data/test/deploy/scm/accurev_test.rb +23 -0
- data/test/deploy/scm/base_test.rb +55 -0
- data/test/deploy/scm/bzr_test.rb +51 -0
- data/test/deploy/scm/darcs_test.rb +37 -0
- data/test/deploy/scm/git_test.rb +221 -0
- data/test/deploy/scm/mercurial_test.rb +134 -0
- data/test/deploy/scm/none_test.rb +35 -0
- data/test/deploy/scm/perforce_test.rb +23 -0
- data/test/deploy/scm/subversion_test.rb +40 -0
- data/test/deploy/strategy/copy_test.rb +360 -0
- data/test/extensions_test.rb +69 -0
- data/test/fixtures/cli_integration.rb +5 -0
- data/test/fixtures/config.rb +5 -0
- data/test/fixtures/custom.rb +3 -0
- data/test/logger_formatting_test.rb +149 -0
- data/test/logger_test.rb +134 -0
- data/test/recipes_test.rb +25 -0
- data/test/role_test.rb +11 -0
- data/test/server_definition_test.rb +121 -0
- data/test/shell_test.rb +96 -0
- data/test/ssh_test.rb +113 -0
- data/test/task_definition_test.rb +117 -0
- data/test/transfer_test.rb +168 -0
- data/test/utils.rb +37 -0
- metadata +316 -0
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,94 @@
|
|
1
|
+
## Capistrano
|
2
|
+
|
3
|
+
[![Build
|
4
|
+
Status](https://secure.travis-ci.org/capistrano/capistrano.png)](http://travis-ci.org/capistrano/capistrano)[![Code Climate](https://codeclimate.com/badge.png)](https://codeclimate.com/github/capistrano/capistrano)
|
5
|
+
|
6
|
+
|
7
|
+
Capistrano is a utility and framework for executing commands in parallel on
|
8
|
+
multiple remote machines, via SSH. It uses a simple DSL (borrowed in part from
|
9
|
+
[Rake](http://rake.rubyforge.org/)) that allows you to define _tasks_, which may
|
10
|
+
be applied to machines in certain roles. It also supports tunneling connections
|
11
|
+
via some gateway machine to allow operations to be performed behind VPN's and
|
12
|
+
firewalls.
|
13
|
+
|
14
|
+
Capistrano was originally designed to simplify and automate deployment of web
|
15
|
+
applications to distributed environments, and originally came bundled with a set
|
16
|
+
of tasks designed for deploying Rails applications.
|
17
|
+
|
18
|
+
## Documentation
|
19
|
+
|
20
|
+
* [https://github.com/capistrano/capistrano/wiki](https://github.com/capistrano/capistrano/wiki)
|
21
|
+
|
22
|
+
## DEPENDENCIES
|
23
|
+
|
24
|
+
* [Net::SSH](http://net-ssh.rubyforge.org)
|
25
|
+
* [Net::SFTP](http://net-ssh.rubyforge.org)
|
26
|
+
* [Net::SCP](http://net-ssh.rubyforge.org)
|
27
|
+
* [Net::SSH::Gateway](http://net-ssh.rubyforge.org)
|
28
|
+
* [HighLine](http://highline.rubyforge.org)
|
29
|
+
* [Ruby](http://www.ruby-lang.org/en/) ≥ 1.8.7
|
30
|
+
|
31
|
+
If you want to run the tests, you'll also need to install the dependencies with
|
32
|
+
Bundler, see the `Gemfile` within .
|
33
|
+
|
34
|
+
## ASSUMPTIONS
|
35
|
+
|
36
|
+
Capistrano is "opinionated software", which means it has very firm ideas about
|
37
|
+
how things ought to be done, and tries to force those ideas on you. Some of the
|
38
|
+
assumptions behind these opinions are:
|
39
|
+
|
40
|
+
* You are using SSH to access the remote servers.
|
41
|
+
* You either have the same password to all target machines, or you have public
|
42
|
+
keys in place to allow passwordless access to them.
|
43
|
+
|
44
|
+
Do not expect these assumptions to change.
|
45
|
+
|
46
|
+
## USAGE
|
47
|
+
|
48
|
+
In general, you'll use Capistrano as follows:
|
49
|
+
|
50
|
+
* Create a recipe file ("capfile" or "Capfile").
|
51
|
+
* Use the `cap` script to execute your recipe.
|
52
|
+
|
53
|
+
Use the `cap` script as follows:
|
54
|
+
|
55
|
+
cap sometask
|
56
|
+
|
57
|
+
By default, the script will look for a file called one of `capfile` or
|
58
|
+
`Capfile`. The `sometask` text indicates which task to execute. You can do
|
59
|
+
"cap -h" to see all the available options and "cap -T" to see all the available
|
60
|
+
tasks.
|
61
|
+
|
62
|
+
## CONTRIBUTING:
|
63
|
+
|
64
|
+
* Fork Capistrano
|
65
|
+
* Create a topic branch - `git checkout -b my_branch`
|
66
|
+
* Rebase your branch so that all your changes are reflected in one
|
67
|
+
commit
|
68
|
+
* Push to your branch - `git push origin my_branch`
|
69
|
+
* Create a Pull Request from your branch, include as much documentation
|
70
|
+
as you can in the commit message/pull request, following these
|
71
|
+
[guidelines on writing a good commit message](http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html)
|
72
|
+
* That's it!
|
73
|
+
|
74
|
+
|
75
|
+
## LICENSE:
|
76
|
+
|
77
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
78
|
+
a copy of this software and associated documentation files (the
|
79
|
+
'Software'), to deal in the Software without restriction, including
|
80
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
81
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
82
|
+
permit persons to whom the Software is furnished to do so, subject to
|
83
|
+
the following conditions:
|
84
|
+
|
85
|
+
The above copyright notice and this permission notice shall be
|
86
|
+
included in all copies or substantial portions of the Software.
|
87
|
+
|
88
|
+
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
89
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
90
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
91
|
+
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
92
|
+
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
93
|
+
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
94
|
+
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/Rakefile
ADDED
data/bin/cap
ADDED
data/bin/capify
ADDED
@@ -0,0 +1,92 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'optparse'
|
4
|
+
require 'fileutils'
|
5
|
+
|
6
|
+
OptionParser.new do |opts|
|
7
|
+
opts.banner = "Usage: #{File.basename($0)} [path]"
|
8
|
+
|
9
|
+
opts.on("-h", "--help", "Displays this help info") do
|
10
|
+
puts opts
|
11
|
+
exit 0
|
12
|
+
end
|
13
|
+
|
14
|
+
begin
|
15
|
+
opts.parse!(ARGV)
|
16
|
+
rescue OptionParser::ParseError => e
|
17
|
+
warn e.message
|
18
|
+
puts opts
|
19
|
+
exit 1
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
if ARGV.empty?
|
24
|
+
abort "Please specify the directory to capify, e.g. `#{File.basename($0)} .'"
|
25
|
+
elsif !File.exists?(ARGV.first)
|
26
|
+
abort "`#{ARGV.first}' does not exist."
|
27
|
+
elsif !File.directory?(ARGV.first)
|
28
|
+
abort "`#{ARGV.first}' is not a directory."
|
29
|
+
elsif ARGV.length > 1
|
30
|
+
abort "Too many arguments; please specify only the directory to capify."
|
31
|
+
end
|
32
|
+
|
33
|
+
def unindent(string)
|
34
|
+
indentation = string[/\A\s*/]
|
35
|
+
string.strip.gsub(/^#{indentation}/, "")
|
36
|
+
end
|
37
|
+
|
38
|
+
files = {
|
39
|
+
"Capfile" => unindent(<<-FILE),
|
40
|
+
|
41
|
+
load 'deploy'
|
42
|
+
|
43
|
+
# Uncomment if you are using Rails' asset pipeline
|
44
|
+
# load 'deploy/assets'
|
45
|
+
|
46
|
+
load 'config/deploy' # remove this line to skip loading any of the default tasks
|
47
|
+
FILE
|
48
|
+
|
49
|
+
"config/deploy.rb" => 'set :application, "set your application name here"
|
50
|
+
set :repository, "set your repository location here"
|
51
|
+
|
52
|
+
# set :scm, :git # You can set :scm explicitly or Capistrano will make an intelligent guess based on known version control directory names
|
53
|
+
# Or: `accurev`, `bzr`, `cvs`, `darcs`, `git`, `mercurial`, `perforce`, `subversion` or `none`
|
54
|
+
|
55
|
+
role :web, "your web-server here" # Your HTTP server, Apache/etc
|
56
|
+
role :app, "your app-server here" # This may be the same as your `Web` server
|
57
|
+
role :db, "your primary db-server here", :primary => true # This is where Rails migrations will run
|
58
|
+
role :db, "your slave db-server here"
|
59
|
+
|
60
|
+
# if you want to clean up old releases on each deploy uncomment this:
|
61
|
+
# after "deploy:restart", "deploy:cleanup"
|
62
|
+
|
63
|
+
# if you\'re still using the script/reaper helper you will need
|
64
|
+
# these http://github.com/rails/irs_process_scripts
|
65
|
+
|
66
|
+
# If you are using Passenger mod_rails uncomment this:
|
67
|
+
# namespace :deploy do
|
68
|
+
# task :start do ; end
|
69
|
+
# task :stop do ; end
|
70
|
+
# task :restart, :roles => :app, :except => { :no_release => true } do
|
71
|
+
# run "#{try_sudo} touch #{File.join(current_path,\'tmp\',\'restart.txt\')}"
|
72
|
+
# end
|
73
|
+
# end'}
|
74
|
+
|
75
|
+
base = ARGV.shift
|
76
|
+
files.each do |file, content|
|
77
|
+
file = File.join(base, file)
|
78
|
+
if File.exists?(file)
|
79
|
+
warn "[skip] '#{file}' already exists"
|
80
|
+
elsif File.exists?(file.downcase)
|
81
|
+
warn "[skip] '#{file.downcase}' exists, which could conflict with `#{file}'"
|
82
|
+
else
|
83
|
+
unless File.exists?(File.dirname(file))
|
84
|
+
puts "[add] making directory '#{File.dirname(file)}'"
|
85
|
+
FileUtils.mkdir(File.dirname(file))
|
86
|
+
end
|
87
|
+
puts "[add] writing '#{file}'"
|
88
|
+
File.open(file, "w") { |f| f.write(content) }
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
puts "[done] capified!"
|
data/capistrano.gemspec
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "capistrano/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
|
7
|
+
s.name = "minmb-capistrano"
|
8
|
+
s.version = Capistrano::Version.to_s
|
9
|
+
s.platform = Gem::Platform::RUBY
|
10
|
+
s.authors = ["Jamis Buck", "Lee Hambley"]
|
11
|
+
s.email = ["jamis@jamisbuck.org", "lee.hambley@gmail.com"]
|
12
|
+
s.homepage = "http://github.com/minmb/capistrano"
|
13
|
+
s.summary = %q{Capistrano - Welcome to easy deployment with Ruby over SSH}
|
14
|
+
s.description = %q{Capistrano is a utility and framework for executing commands in parallel on multiple remote machines, via SSH.}
|
15
|
+
s.files = `git ls-files`.split("\n")
|
16
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
17
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
18
|
+
s.require_paths = ["lib"]
|
19
|
+
s.extra_rdoc_files = [
|
20
|
+
"README.md"
|
21
|
+
]
|
22
|
+
|
23
|
+
s.specification_version = 3 if s.respond_to? :specification_version
|
24
|
+
|
25
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
26
|
+
s.add_runtime_dependency(%q<highline>, [">= 0"])
|
27
|
+
s.add_runtime_dependency(%q<minmb-net-ssh>, [">= 2.0.14"])
|
28
|
+
s.add_runtime_dependency(%q<net-sftp>, [">= 2.0.0"])
|
29
|
+
s.add_runtime_dependency(%q<net-scp>, [">= 1.0.0"])
|
30
|
+
s.add_runtime_dependency(%q<net-ssh-gateway>, [">= 1.1.0"])
|
31
|
+
s.add_development_dependency(%q<mocha>, ["0.9.12"])
|
32
|
+
else
|
33
|
+
s.add_dependency(%q<minmb-net-ssh>, [">= 2.0.14"])
|
34
|
+
s.add_dependency(%q<net-sftp>, [">= 2.0.0"])
|
35
|
+
s.add_dependency(%q<net-scp>, [">= 1.0.0"])
|
36
|
+
s.add_dependency(%q<net-ssh-gateway>, [">= 1.1.0"])
|
37
|
+
s.add_dependency(%q<highline>, [">= 0"])
|
38
|
+
s.add_dependency(%q<mocha>, ["0.9.12"])
|
39
|
+
end
|
40
|
+
end
|
data/lib/capistrano.rb
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
module Capistrano
|
2
|
+
class Callback
|
3
|
+
attr_reader :source, :options, :only, :except
|
4
|
+
|
5
|
+
def initialize(source, options={})
|
6
|
+
@source = source
|
7
|
+
@options = options
|
8
|
+
@only = Array(options[:only]).map { |v| v.to_s }
|
9
|
+
@except = Array(options[:except]).map { |v| v.to_s }
|
10
|
+
end
|
11
|
+
|
12
|
+
def applies_to?(task)
|
13
|
+
if task && only.any?
|
14
|
+
return only.include?(task.fully_qualified_name)
|
15
|
+
elsif task && except.any?
|
16
|
+
return !except.include?(task.fully_qualified_name)
|
17
|
+
else
|
18
|
+
return true
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
class ProcCallback < Callback
|
24
|
+
def call
|
25
|
+
source.call
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
class TaskCallback < Callback
|
30
|
+
attr_reader :config
|
31
|
+
|
32
|
+
def initialize(config, source, options={})
|
33
|
+
super(source, options)
|
34
|
+
@config = config
|
35
|
+
end
|
36
|
+
|
37
|
+
def call
|
38
|
+
config.find_and_execute_task(source)
|
39
|
+
end
|
40
|
+
|
41
|
+
def applies_to?(task)
|
42
|
+
super && (task.nil? || task.fully_qualified_name != source.to_s)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
require 'capistrano'
|
2
|
+
require 'capistrano/cli/execute'
|
3
|
+
require 'capistrano/cli/help'
|
4
|
+
require 'capistrano/cli/options'
|
5
|
+
require 'capistrano/cli/ui'
|
6
|
+
|
7
|
+
module Capistrano
|
8
|
+
# The CLI class encapsulates the behavior of capistrano when it is invoked
|
9
|
+
# as a command-line utility. This allows other programs to embed Capistrano
|
10
|
+
# and preserve its command-line semantics.
|
11
|
+
class CLI
|
12
|
+
# The array of (unparsed) command-line options
|
13
|
+
attr_reader :args
|
14
|
+
|
15
|
+
# Create a new CLI instance using the given array of command-line parameters
|
16
|
+
# to initialize it. By default, +ARGV+ is used, but you can specify a
|
17
|
+
# different set of parameters (such as when embedded cap in a program):
|
18
|
+
#
|
19
|
+
# require 'capistrano/cli'
|
20
|
+
# Capistrano::CLI.parse(%W(-vvvv -f config/deploy update_code)).execute!
|
21
|
+
#
|
22
|
+
# Note that you can also embed cap directly by creating a new Configuration
|
23
|
+
# instance and setting it up, The above snippet, redone using the
|
24
|
+
# Configuration class directly, would look like:
|
25
|
+
#
|
26
|
+
# require 'capistrano'
|
27
|
+
# require 'capistrano/cli'
|
28
|
+
# config = Capistrano::Configuration.new
|
29
|
+
# config.logger.level = Capistrano::Logger::TRACE
|
30
|
+
# config.set(:password) { Capistrano::CLI.password_prompt }
|
31
|
+
# config.load "config/deploy"
|
32
|
+
# config.update_code
|
33
|
+
#
|
34
|
+
# There may be times that you want/need the additional control offered by
|
35
|
+
# manipulating the Configuration directly, but generally interfacing with
|
36
|
+
# the CLI class is recommended.
|
37
|
+
def initialize(args)
|
38
|
+
@args = args.dup
|
39
|
+
$stdout.sync = true # so that Net::SSH prompts show up
|
40
|
+
end
|
41
|
+
|
42
|
+
# Mix-in the actual behavior
|
43
|
+
include Execute, Options, UI
|
44
|
+
include Help # needs to be included last, because it overrides some methods
|
45
|
+
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,85 @@
|
|
1
|
+
require 'capistrano/configuration'
|
2
|
+
|
3
|
+
module Capistrano
|
4
|
+
class CLI
|
5
|
+
module Execute
|
6
|
+
def self.included(base) #:nodoc:
|
7
|
+
base.extend(ClassMethods)
|
8
|
+
end
|
9
|
+
|
10
|
+
module ClassMethods
|
11
|
+
# Invoke capistrano using the ARGV array as the option parameters. This
|
12
|
+
# is what the command-line capistrano utility does.
|
13
|
+
def execute
|
14
|
+
parse(ARGV).execute!
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
# Using the options build when the command-line was parsed, instantiate
|
19
|
+
# a new Capistrano configuration, initialize it, and execute the
|
20
|
+
# requested actions.
|
21
|
+
#
|
22
|
+
# Returns the Configuration instance used, if successful.
|
23
|
+
def execute!
|
24
|
+
config = instantiate_configuration(options)
|
25
|
+
config.debug = options[:debug]
|
26
|
+
config.dry_run = options[:dry_run]
|
27
|
+
config.preserve_roles = options[:preserve_roles]
|
28
|
+
config.logger.level = options[:verbose]
|
29
|
+
|
30
|
+
set_pre_vars(config)
|
31
|
+
load_recipes(config)
|
32
|
+
|
33
|
+
config.trigger(:load)
|
34
|
+
execute_requested_actions(config)
|
35
|
+
config.trigger(:exit)
|
36
|
+
|
37
|
+
config
|
38
|
+
rescue Exception => error
|
39
|
+
handle_error(error)
|
40
|
+
end
|
41
|
+
|
42
|
+
def execute_requested_actions(config)
|
43
|
+
Array(options[:vars]).each { |name, value| config.set(name, value) }
|
44
|
+
|
45
|
+
Array(options[:actions]).each do |action|
|
46
|
+
config.find_and_execute_task(action, :before => :start, :after => :finish)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def set_pre_vars(config) #:nodoc:
|
51
|
+
config.set :password, options[:password]
|
52
|
+
Array(options[:pre_vars]).each { |name, value| config.set(name, value) }
|
53
|
+
end
|
54
|
+
|
55
|
+
def load_recipes(config) #:nodoc:
|
56
|
+
# load the standard recipe definition
|
57
|
+
config.load "standard"
|
58
|
+
|
59
|
+
# load systemwide config/recipe definition
|
60
|
+
config.load(options[:sysconf]) if options[:sysconf] && File.file?(options[:sysconf])
|
61
|
+
|
62
|
+
# load user config/recipe definition
|
63
|
+
config.load(options[:dotfile]) if options[:dotfile] && File.file?(options[:dotfile])
|
64
|
+
|
65
|
+
Array(options[:recipes]).each { |recipe| config.load(recipe) }
|
66
|
+
end
|
67
|
+
|
68
|
+
# Primarily useful for testing, but subclasses of CLI could conceivably
|
69
|
+
# override this method to return a Configuration subclass or replacement.
|
70
|
+
def instantiate_configuration(options={}) #:nodoc:
|
71
|
+
Capistrano::Configuration.new(options)
|
72
|
+
end
|
73
|
+
|
74
|
+
def handle_error(error) #:nodoc:
|
75
|
+
case error
|
76
|
+
when Net::SSH::AuthenticationFailed
|
77
|
+
abort "authentication failed for `#{error.message}'"
|
78
|
+
when Capistrano::Error
|
79
|
+
abort(error.message)
|
80
|
+
else raise error
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|