lib/percheron/actions/exec.rb in percheron-0.6.4 vs lib/percheron/actions/exec.rb in percheron-0.7.0
- old
+ new
@@ -10,42 +10,74 @@
@scripts = scripts
@description = description
end
def execute!
- results = []
- $logger.debug "Executing #{description} scripts '#{scripts.inspect}' on '#{container.name}'"
- started_dependant_containers = start_containers!(dependant_containers)
- results << execute_scripts_on_running_container!
- results << stop_containers!(started_dependant_containers)
+ $logger.debug "Executing #{description} #{scripts.inspect} on '#{container.name}' container"
+ results = exec!
results.compact.empty? ? nil : container
end
private
attr_reader :container, :dependant_containers, :scripts, :description
+ def exec!
+ results = []
+ started_dependant_containers = start_containers!(dependant_containers)
+ results << execute_scripts_on_running_container!
+ results << stop_containers!(started_dependant_containers)
+ results
+ end
+
def execute_scripts_on_running_container!
container_running = container.running?
Start.new(container, exec_scripts: false).execute! unless container_running
execute_scripts!
+ commit_and_tag_new_image!
Stop.new(container).execute! unless container_running
end
+ # FIXME
+ def commit_and_tag_new_image!
+ new_image = container.docker_container.commit
+ new_image.tag(repo: container.image_repo, tag: container.version.to_s, force: true)
+ end
+
def execute_scripts!
scripts.each do |script|
in_working_directory(base_dir) do
file = Pathname.new(File.expand_path(script, base_dir))
- execute_command!('/bin/bash -x /tmp/%s 2>&1' % file.basename)
+ execute_command!('/bin/sh /tmp/%s 2>&1' % file.basename)
end
end
end
def execute_command!(command)
$logger.info "Executing #{description} '#{command}' for '#{container.name}' container"
- container.docker_container.exec(command.split(' ')) do |device, out|
- $logger.debug '%s: %s' % [ device, out.strip ]
+ container.docker_container.exec(command.split(' ')) do |stream, out|
+ $logger.debug '%s: %s' % [ stream, out.strip ]
end
+ end
+
+ def stop_containers!(containers)
+ exec_on_containers!(containers) do |container|
+ Stop.new(container).execute! if container.running?
+ end
+ end
+
+ def start_containers!(containers, scripts: true)
+ exec_on_containers!(containers) do |container|
+ next if container.running?
+ containers = container.startable_dependant_containers.values
+ Start.new(container, dependant_containers: containers, exec_scripts: scripts).execute!
+ end
+ end
+
+ def exec_on_containers!(containers)
+ containers.each_with_object([]) do |container, all|
+ all << container if yield(container)
+ end.compact
end
end
end
end