avodeploy 0.4 → 0.4.1
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.
- checksums.yaml +4 -4
- data/CHANGELOG +14 -0
- data/README.md +8 -5
- data/avodeploy.gemspec +3 -4
- data/bin/avo +14 -12
- data/lib/avodeploy.rb +29 -0
- data/lib/{avocado → avodeploy}/bootstrap.rb +24 -30
- data/lib/{avocado → avodeploy}/command_execution_result.rb +1 -1
- data/lib/{avocado → avodeploy}/config.rb +8 -4
- data/lib/{avocado → avodeploy}/core_ext/hash_insert_at.rb +0 -0
- data/lib/{avocado → avodeploy}/core_ext/string_colors.rb +0 -0
- data/lib/{avocado → avodeploy}/deployment.rb +3 -3
- data/lib/{avocado → avodeploy}/multi_io.rb +1 -1
- data/lib/avodeploy/scm_provider/git_scm_provider.rb +73 -0
- data/lib/avodeploy/scm_provider/scm_provider.rb +70 -0
- data/lib/{avocado → avodeploy}/skel/manifest_template.rb.erb +1 -1
- data/lib/{avocado → avodeploy}/strategy/base.rb +1 -1
- data/lib/avodeploy/strategy/local_copy.rb +101 -0
- data/lib/{avocado → avodeploy}/target.rb +3 -1
- data/lib/avodeploy/task/local_task_execution_environment.rb +127 -0
- data/lib/avodeploy/task/remote_task_execution_environment.rb +114 -0
- data/lib/avodeploy/task/task.rb +76 -0
- data/lib/{avocado → avodeploy}/task/task_dependency.rb +8 -6
- data/lib/avodeploy/task/task_execution_environment.rb +88 -0
- data/lib/avodeploy/task/task_manager.rb +185 -0
- data/lib/{avocado → avodeploy}/version.rb +2 -2
- metadata +27 -40
- data/lib/avocado/Gemfile +0 -9
- data/lib/avocado/scm_provider/git_scm_provider.rb +0 -71
- data/lib/avocado/scm_provider/scm_provider.rb +0 -68
- data/lib/avocado/strategy/local_copy.rb +0 -99
- data/lib/avocado/task/local_task_execution_environment.rb +0 -127
- data/lib/avocado/task/remote_task_execution_environment.rb +0 -112
- data/lib/avocado/task/task.rb +0 -84
- data/lib/avocado/task/task_execution_environment.rb +0 -86
- data/lib/avocado/task/task_manager.rb +0 -183
data/lib/avocado/task/task.rb
DELETED
@@ -1,84 +0,0 @@
|
|
1
|
-
=begin
|
2
|
-
AVOCADO
|
3
|
-
The flexible and easy to use deployment framework for web applications
|
4
|
-
|
5
|
-
This program is free software; you can redistribute it and/or
|
6
|
-
modify it under the terms of the GNU General Public License Version 2
|
7
|
-
as published by the Free Software Foundation.
|
8
|
-
|
9
|
-
This program is distributed in the hope that it will be useful,
|
10
|
-
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
11
|
-
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
12
|
-
GNU General Public License for more details.
|
13
|
-
|
14
|
-
You should have received a copy of the GNU General Public License
|
15
|
-
along with this program; if not, write to the Free Software
|
16
|
-
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
17
|
-
=end
|
18
|
-
|
19
|
-
module Avocado
|
20
|
-
class Task
|
21
|
-
|
22
|
-
attr_accessor :name
|
23
|
-
attr_accessor :scope
|
24
|
-
attr_accessor :visibility
|
25
|
-
attr_accessor :block
|
26
|
-
attr_accessor :desc
|
27
|
-
|
28
|
-
# Creates a new task from a task block in the deployment configuration process
|
29
|
-
#
|
30
|
-
# @param name [Symbol] name of the task
|
31
|
-
# @param options [Hash] command options
|
32
|
-
# @param block [Block] code block of the task
|
33
|
-
# @return [Task] the task instance
|
34
|
-
def self.from_task_block(name, options, &block)
|
35
|
-
instance = self.new
|
36
|
-
|
37
|
-
instance.name = name
|
38
|
-
instance.block = block
|
39
|
-
|
40
|
-
instance.scope = :local
|
41
|
-
|
42
|
-
if options.has_key?(:scope) && options[:scope] == :remote
|
43
|
-
instance.scope = :remote
|
44
|
-
end
|
45
|
-
|
46
|
-
instance.visibility = :public
|
47
|
-
|
48
|
-
if options.has_key?(:visibility) && options[:visibility] == :private
|
49
|
-
instance.visibility = :private
|
50
|
-
end
|
51
|
-
|
52
|
-
if options.has_key?(:desc)
|
53
|
-
instance.desc = options[:desc]
|
54
|
-
end
|
55
|
-
|
56
|
-
instance
|
57
|
-
end
|
58
|
-
|
59
|
-
# Runs the code of a task
|
60
|
-
#
|
61
|
-
# @param env [TaskExecutionEnvironment] the environment to invoke the task in
|
62
|
-
# @return [mixed] result of the code block
|
63
|
-
def invoke(env)
|
64
|
-
raise ArgumentError 'env must be a valid TaskExecutionEnvironment' unless env.kind_of?(Avocado::TaskExecutionEnvironment)
|
65
|
-
|
66
|
-
avo = Avocado::Deployment.instance
|
67
|
-
|
68
|
-
avo.log.debug "Running task #{@name}"
|
69
|
-
|
70
|
-
env.instance_eval(&@block)
|
71
|
-
end
|
72
|
-
|
73
|
-
# Prettyprints a command using a table
|
74
|
-
def pretty_print
|
75
|
-
puts Terminal::Table.new :title => 'Task overview', :rows => [
|
76
|
-
['Name', @name.to_s],
|
77
|
-
['Description', @desc.to_s],
|
78
|
-
['Scope', @scope.to_s],
|
79
|
-
['Visibility', @visibility.to_s],
|
80
|
-
]
|
81
|
-
end
|
82
|
-
|
83
|
-
end
|
84
|
-
end
|
@@ -1,86 +0,0 @@
|
|
1
|
-
=begin
|
2
|
-
AVOCADO
|
3
|
-
The flexible and easy to use deployment framework for web applications
|
4
|
-
|
5
|
-
This program is free software; you can redistribute it and/or
|
6
|
-
modify it under the terms of the GNU General Public License Version 2
|
7
|
-
as published by the Free Software Foundation.
|
8
|
-
|
9
|
-
This program is distributed in the hope that it will be useful,
|
10
|
-
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
11
|
-
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
12
|
-
GNU General Public License for more details.
|
13
|
-
|
14
|
-
You should have received a copy of the GNU General Public License
|
15
|
-
along with this program; if not, write to the Free Software
|
16
|
-
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
17
|
-
=end
|
18
|
-
|
19
|
-
module Avocado
|
20
|
-
class TaskExecutionEnvironment
|
21
|
-
|
22
|
-
# Initialized the environment
|
23
|
-
#
|
24
|
-
# @param config [Hash] deployment configuration
|
25
|
-
def initialize(config)
|
26
|
-
# @todo check
|
27
|
-
@config = config
|
28
|
-
end
|
29
|
-
|
30
|
-
# Assigns the scm provider
|
31
|
-
#
|
32
|
-
# @param scm_provider [ScmProvider] the scm provider to assign
|
33
|
-
def scm_provider=(scm_provider)
|
34
|
-
@scm = scm_provider
|
35
|
-
end
|
36
|
-
|
37
|
-
# Checks, if all utilities are available for the deployment process
|
38
|
-
# to be executed
|
39
|
-
#
|
40
|
-
# @param utils [Array] array with utilities to check
|
41
|
-
def check_util_availability(utils, system_name)
|
42
|
-
begin
|
43
|
-
utils.each do |util|
|
44
|
-
if command("command -v #{util} >/dev/null 2>&1 || exit 1;").retval == 1
|
45
|
-
msg = "command line utility '#{util}' is not installed #{system_name}"
|
46
|
-
|
47
|
-
raise RuntimeError, msg
|
48
|
-
end
|
49
|
-
end
|
50
|
-
rescue Exception => e
|
51
|
-
handle_abort e
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
# Returns the logger instance
|
56
|
-
#
|
57
|
-
# @return [Logger] log instance
|
58
|
-
def log
|
59
|
-
Avocado::Deployment.instance.log
|
60
|
-
end
|
61
|
-
|
62
|
-
# Sets a configuration item
|
63
|
-
#
|
64
|
-
# @param key [Symbol] configuration key
|
65
|
-
# @param value [mixed] configuration value
|
66
|
-
def set(key, value)
|
67
|
-
@config[key] = value
|
68
|
-
end
|
69
|
-
|
70
|
-
# Returns a configuration item if set
|
71
|
-
#
|
72
|
-
# @param key [Symbol] configuration key
|
73
|
-
# @return [mixed] configuration value
|
74
|
-
def get(key)
|
75
|
-
@config[key]
|
76
|
-
end
|
77
|
-
|
78
|
-
# Shorthand for exception handling
|
79
|
-
#
|
80
|
-
# @param e [Exception] the exception to handle
|
81
|
-
def handle_abort(e)
|
82
|
-
Avocado::Deployment.instance.handle_abort(e)
|
83
|
-
end
|
84
|
-
|
85
|
-
end
|
86
|
-
end
|
@@ -1,183 +0,0 @@
|
|
1
|
-
=begin
|
2
|
-
AVOCADO
|
3
|
-
The flexible and easy to use deployment framework for web applications
|
4
|
-
|
5
|
-
This program is free software; you can redistribute it and/or
|
6
|
-
modify it under the terms of the GNU General Public License Version 2
|
7
|
-
as published by the Free Software Foundation.
|
8
|
-
|
9
|
-
This program is distributed in the hope that it will be useful,
|
10
|
-
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
11
|
-
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
12
|
-
GNU General Public License for more details.
|
13
|
-
|
14
|
-
You should have received a copy of the GNU General Public License
|
15
|
-
along with this program; if not, write to the Free Software
|
16
|
-
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
17
|
-
=end
|
18
|
-
|
19
|
-
module Avocado
|
20
|
-
class TaskManager
|
21
|
-
|
22
|
-
attr_reader :dependencies
|
23
|
-
attr_reader :chains
|
24
|
-
|
25
|
-
# Initializes the task manager
|
26
|
-
def initialize
|
27
|
-
@chains = []
|
28
|
-
@remote_env = nil
|
29
|
-
@local_env = nil
|
30
|
-
end
|
31
|
-
|
32
|
-
# Adds a task to the task manager
|
33
|
-
#
|
34
|
-
# @param name [Symbol] task name
|
35
|
-
# @param options [Hash] task options
|
36
|
-
# @param block [Block] code of the task
|
37
|
-
def add_task(name, options, &block)
|
38
|
-
position = :after
|
39
|
-
standalone = true
|
40
|
-
|
41
|
-
if options.has_key?(:before)
|
42
|
-
position = :before
|
43
|
-
end
|
44
|
-
|
45
|
-
key = name
|
46
|
-
|
47
|
-
if options.has_key?(:before)
|
48
|
-
key = options[:before]
|
49
|
-
standalone = false
|
50
|
-
elsif options.has_key?(:after)
|
51
|
-
key = options[:after]
|
52
|
-
standalone = false
|
53
|
-
end
|
54
|
-
|
55
|
-
if standalone == false
|
56
|
-
idx = find_chain_index_containing(key)
|
57
|
-
|
58
|
-
@chains[idx].delete(name)
|
59
|
-
@chains[idx].insert_at(position, key, [ name, Avocado::Task.from_task_block(name, options, &block) ])
|
60
|
-
|
61
|
-
else
|
62
|
-
chain = {}
|
63
|
-
chain[name] = Avocado::Task.from_task_block(name, options, &block)
|
64
|
-
@chains << chain
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
|
-
# Finds a task by its name
|
69
|
-
#
|
70
|
-
# @param name [Symbol] name of the task
|
71
|
-
# @return [Task] the task if found
|
72
|
-
def task_by_name(name)
|
73
|
-
name = name.to_sym if name.is_a?(String)
|
74
|
-
|
75
|
-
cidx = find_chain_index_containing(name)
|
76
|
-
@chains[cidx][name]
|
77
|
-
end
|
78
|
-
|
79
|
-
# Finds the chain containing a specifc task
|
80
|
-
#
|
81
|
-
# @param name [Symbol] task name
|
82
|
-
# @param [Integer] chain index
|
83
|
-
def find_chain_index_containing(name)
|
84
|
-
@chains.each_with_index do |chain, idx|
|
85
|
-
if chain.has_key?(name)
|
86
|
-
return idx
|
87
|
-
end
|
88
|
-
end
|
89
|
-
|
90
|
-
raise RuntimeError, "could not find a chain containing task #{name}"
|
91
|
-
end
|
92
|
-
|
93
|
-
# Invokes a task without dependencies
|
94
|
-
#
|
95
|
-
# @param task_name [Symbol] the task name
|
96
|
-
def invoke_task_oneshot(task_name)
|
97
|
-
task_name = task_name.to_sym if task_name.is_a?(String)
|
98
|
-
|
99
|
-
cidx = find_chain_index_containing(task_name)
|
100
|
-
|
101
|
-
begin
|
102
|
-
invoke_task(@chains[cidx][task_name])
|
103
|
-
rescue Exception => e
|
104
|
-
Avocado::Deployment.instance.handle_abort(e)
|
105
|
-
end
|
106
|
-
end
|
107
|
-
|
108
|
-
# Invokes the task chain, that contains the requested task
|
109
|
-
#
|
110
|
-
# @param task_name [Symbol] the task name
|
111
|
-
def invoke_task_chain_containing(task_name)
|
112
|
-
task_name = task_name.to_sym if task_name.is_a?(String)
|
113
|
-
|
114
|
-
cidx = find_chain_index_containing(task_name)
|
115
|
-
|
116
|
-
begin
|
117
|
-
@chains[cidx].each_pair do |name, task|
|
118
|
-
invoke_task(task)
|
119
|
-
end
|
120
|
-
rescue Exception => e
|
121
|
-
Avocado::Deployment.instance.handle_abort(e)
|
122
|
-
end
|
123
|
-
end
|
124
|
-
|
125
|
-
# Executes a task for all defined targets
|
126
|
-
#
|
127
|
-
# @param task [Task] the task to start
|
128
|
-
# @param env [RemoteTaskExecutionEnvironment] the environment
|
129
|
-
def execute_for_each_target(task, env)
|
130
|
-
raise ArgumentError, 'task must be a task' unless task.kind_of?(Avocado::Task)
|
131
|
-
raise ArgumentError, 'env must be a RemoteTaskExecutionEnvironment' unless env.kind_of?(Avocado::RemoteTaskExecutionEnvironment)
|
132
|
-
|
133
|
-
avo = Avocado::Deployment.instance
|
134
|
-
|
135
|
-
avo.config.targets.each_pair do |key, target|
|
136
|
-
avo.log.info "invoking task #{task.name} for target #{target.name}..."
|
137
|
-
|
138
|
-
env.config.merge!(target.config)
|
139
|
-
|
140
|
-
env.establish_connection
|
141
|
-
|
142
|
-
task.invoke(env)
|
143
|
-
end
|
144
|
-
end
|
145
|
-
|
146
|
-
# Invokes a task
|
147
|
-
#
|
148
|
-
# @param task [Task] the task
|
149
|
-
def invoke_task(task)
|
150
|
-
raise ArgumentError, 'task must be a task' unless task.kind_of?(Avocado::Task)
|
151
|
-
|
152
|
-
avo = Avocado::Deployment.instance
|
153
|
-
env = nil
|
154
|
-
|
155
|
-
if task.scope == :remote
|
156
|
-
if @remote_env.nil?
|
157
|
-
@remote_env = Avocado::RemoteTaskExecutionEnvironment.new(avo.config.config)
|
158
|
-
end
|
159
|
-
|
160
|
-
env = @remote_env
|
161
|
-
elsif task.scope == :local
|
162
|
-
if @local_env.nil?
|
163
|
-
@local_env = Avocado::LocalTaskExecutionEnvironment.new(avo.config.config)
|
164
|
-
end
|
165
|
-
|
166
|
-
env = @local_env
|
167
|
-
else
|
168
|
-
raise RuntimeError, 'scope must either be remote or local'
|
169
|
-
end
|
170
|
-
|
171
|
-
scm_provider = ScmProvider.new(env, avo.config.get(:scm))
|
172
|
-
env.scm_provider = scm_provider
|
173
|
-
|
174
|
-
# if remote task -> execute for each target
|
175
|
-
if task.scope == :remote
|
176
|
-
execute_for_each_target(task, env)
|
177
|
-
else
|
178
|
-
task.invoke(env)
|
179
|
-
end
|
180
|
-
end
|
181
|
-
|
182
|
-
end
|
183
|
-
end
|