swarm_orca 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +1 -0
- data/.overcommit.yml +33 -0
- data/.rubocop.yml +1 -0
- data/.rubocop_todo.yml +17 -0
- data/.ruby-gemset +1 -0
- data/.ruby-version +1 -0
- data/CHANGELOG.md +15 -0
- data/Gemfile +5 -0
- data/Gemfile.lock +57 -0
- data/README.md +335 -0
- data/Rakefile +3 -0
- data/bin/orca +7 -0
- data/lib/capistrano/scm/copy.rb +62 -0
- data/lib/capistrano/scm/tasks/copy.cap +33 -0
- data/lib/capistrano/scm/tasks/deploy.rb +16 -0
- data/lib/capistrano/swarm_orca/bash/crypt +1 -0
- data/lib/capistrano/swarm_orca/deploy.rb +3 -0
- data/lib/capistrano/swarm_orca/docker.rb +3 -0
- data/lib/capistrano/swarm_orca/helpers/fetch_config.rb +134 -0
- data/lib/capistrano/swarm_orca/local.rb +43 -0
- data/lib/capistrano/swarm_orca/set_global_config.rb +3 -0
- data/lib/capistrano/swarm_orca/tasks/deploy.cap +200 -0
- data/lib/capistrano/swarm_orca/tasks/docker.cap +318 -0
- data/lib/capistrano/swarm_orca/tasks/set_global_config.cap +28 -0
- data/lib/swarm_orca.rb +11 -0
- data/lib/swarm_orca/encrypt.rb +40 -0
- data/lib/swarm_orca/new.rb +73 -0
- data/lib/swarm_orca/orca_cli.rb +41 -0
- data/lib/swarm_orca/templates/orca/.gitignore +50 -0
- data/lib/swarm_orca/templates/orca/.ruby-gemset.tt +1 -0
- data/lib/swarm_orca/templates/orca/.ruby-version +1 -0
- data/lib/swarm_orca/templates/orca/README.md +93 -0
- data/lib/swarm_orca/templates/orca/application_stack/docker-stack-elasticsearch.yml.erb.tt +22 -0
- data/lib/swarm_orca/templates/orca/application_stack/docker-stack-errbit.yml.erb.tt +43 -0
- data/lib/swarm_orca/templates/orca/application_stack/docker-stack-mysql.yml.erb.tt +17 -0
- data/lib/swarm_orca/templates/orca/application_stack/docker-stack-nginx.yml.erb.tt +22 -0
- data/lib/swarm_orca/templates/orca/application_stack/docker-stack-rabbitmq.yml.erb.tt +19 -0
- data/lib/swarm_orca/templates/orca/application_stack/docker-stack-redis.yml.erb.tt +19 -0
- data/lib/swarm_orca/templates/orca/capistrano/Capfile +45 -0
- data/lib/swarm_orca/templates/orca/capistrano/Gemfile.tt +4 -0
- data/lib/swarm_orca/templates/orca/capistrano/config/deploy.rb.tt +30 -0
- data/lib/swarm_orca/templates/orca/capistrano/config/deploy/template_stage.rb +64 -0
- data/lib/swarm_orca/templates/orca/nginx/Dockerfile +5 -0
- data/lib/swarm_orca/templates/orca/nginx/nginx.conf +31 -0
- data/lib/swarm_orca/templates/orca/redis/Dockerfile +5 -0
- data/lib/swarm_orca/templates/orca/redis/redis.conf +2 -0
- data/lib/swarm_orca/version.rb +5 -0
- data/swarm_orca.gemspec +26 -0
- metadata +174 -0
data/Rakefile
ADDED
data/bin/orca
ADDED
@@ -0,0 +1,62 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'capistrano/scm/plugin'
|
4
|
+
require 'cgi'
|
5
|
+
require 'shellwords'
|
6
|
+
require 'uri'
|
7
|
+
require_relative 'tasks/deploy.rb'
|
8
|
+
|
9
|
+
module Capistrano
|
10
|
+
class SCM
|
11
|
+
# Capistrano Copy stretegy
|
12
|
+
class Copy < Capistrano::SCM::Plugin
|
13
|
+
def set_defaults
|
14
|
+
set_if_empty :app_release_id, Time.now.to_i
|
15
|
+
set_if_empty :tar_extension, '.tar.gz'
|
16
|
+
set_if_empty :app_source_file_path, "/tmp/s_#{fetch(:app_release_id)}#{fetch(:tar_extension)}"
|
17
|
+
set_if_empty :app_destination_file_path, "/tmp/#{fetch(:app_release_id)}#{fetch(:tar_extension)}"
|
18
|
+
end
|
19
|
+
|
20
|
+
def working_dir
|
21
|
+
File.dirname(Dir.pwd)
|
22
|
+
end
|
23
|
+
|
24
|
+
def register_hooks
|
25
|
+
after 'deploy:new_release_path', 'copy:create_release'
|
26
|
+
before 'deploy:set_current_revision', 'copy:set_current_revision'
|
27
|
+
end
|
28
|
+
|
29
|
+
def define_tasks
|
30
|
+
eval_rakefile File.expand_path('tasks/copy.cap', __dir__)
|
31
|
+
end
|
32
|
+
|
33
|
+
def tar_exists?
|
34
|
+
backend.test " [ -f #{fetch(:app_destination_file_path)} ] "
|
35
|
+
end
|
36
|
+
|
37
|
+
def create_tar
|
38
|
+
source_path = Shellwords.escape(working_dir)
|
39
|
+
run_locally do
|
40
|
+
execute "tar -C #{source_path} -czf #{fetch(:app_source_file_path)} ."
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def remove_tar
|
45
|
+
run_locally do
|
46
|
+
execute "rm -f #{fetch(:app_source_file_path)}"
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def archive_to_release_path
|
51
|
+
# Unpack the tar uploaded by deploy:upload_tar task.
|
52
|
+
backend.execute "tar -xzmf #{fetch(:app_destination_file_path)} -C #{release_path}"
|
53
|
+
# Remove it just to keep things clean.
|
54
|
+
backend.execute :rm, fetch(:app_destination_file_path)
|
55
|
+
end
|
56
|
+
|
57
|
+
def fetch_revision
|
58
|
+
fetch(:app_release_id)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
copy_plugin = self
|
2
|
+
|
3
|
+
namespace :copy do
|
4
|
+
desc "Clone the repo to the cache"
|
5
|
+
task :clone do
|
6
|
+
copy_plugin.create_tar
|
7
|
+
on release_roles(:all) do |host|
|
8
|
+
info "Upload packages to #{host.to_s}"
|
9
|
+
upload! fetch(:app_source_file_path), fetch(:app_destination_file_path)
|
10
|
+
end
|
11
|
+
copy_plugin.remove_tar
|
12
|
+
end
|
13
|
+
|
14
|
+
desc "Copy repo to releases"
|
15
|
+
task create_release: :'copy:clone' do
|
16
|
+
on release_roles :all do
|
17
|
+
if copy_plugin.tar_exists?
|
18
|
+
info "Create Release folder"
|
19
|
+
execute :mkdir, "-p", release_path
|
20
|
+
copy_plugin.archive_to_release_path
|
21
|
+
else
|
22
|
+
error t(:deploy_failed, ex: "#{fetch(:app_destination_file_path)} does not exists")
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
desc "Determine the revision that will be deployed"
|
28
|
+
task :set_current_revision do
|
29
|
+
on release_roles :all do
|
30
|
+
set :current_revision, copy_plugin.fetch_revision
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
namespace :deploy do
|
4
|
+
def revision_log_message
|
5
|
+
"Copy deploy (at #{fetch(:current_revision)}) deployed as release #{fetch(:release_timestamp)} by #{local_user}"
|
6
|
+
end
|
7
|
+
|
8
|
+
desc 'Log details of the deploy'
|
9
|
+
task :log_revision do
|
10
|
+
on release_roles(:all) do
|
11
|
+
within releases_path do
|
12
|
+
execute :echo, %("#{revision_log_message}" >> #{revision_log})
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
if [[ -z "$ENCRYPTION_KEY" ]]; then echo "Please define the ENCRYPTION_KEY"; exit 1; fi;function decrypt() { local value="$1";echo "$value" | openssl enc -d -aes-256-cbc -base64 -K "$ENCRYPTION_KEY" -iv 2adae58101d71b14cbfa3bdaf17d26c8; }
|
@@ -0,0 +1,134 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Capistrano
|
4
|
+
# SwarmOrca helpers
|
5
|
+
module SwarmOrca
|
6
|
+
def stacks
|
7
|
+
fetch(:service_stacks) + fetch(:service_stacks_with_build_image) + application_stacks
|
8
|
+
end
|
9
|
+
|
10
|
+
def all_service_stacks
|
11
|
+
fetch(:service_stacks) + fetch(:service_stacks_with_build_image)
|
12
|
+
end
|
13
|
+
|
14
|
+
def db_apps
|
15
|
+
fetch(:db_apps_stacks_mapping, {}).values.flatten
|
16
|
+
end
|
17
|
+
|
18
|
+
def elasticsearch_apps
|
19
|
+
fetch(:elasticsearch_apps)
|
20
|
+
end
|
21
|
+
|
22
|
+
def docker_command
|
23
|
+
"#{fetch(:docker_path)}docker"
|
24
|
+
end
|
25
|
+
|
26
|
+
def application_stacks
|
27
|
+
fetch(:db_apps_stacks_mapping, {}).keys.map(&:to_s)
|
28
|
+
end
|
29
|
+
|
30
|
+
def service_stacks_with_build_image
|
31
|
+
fetch(:service_stacks_with_build_image)
|
32
|
+
end
|
33
|
+
|
34
|
+
def fetch_config(stack, env_var)
|
35
|
+
fetch_application_config(stack)[env_var.to_sym] || ''
|
36
|
+
end
|
37
|
+
|
38
|
+
def fetch_application_config(stack)
|
39
|
+
included_shared_config = fetch(stack.to_s.to_sym).fetch(:include_shared_config, '')
|
40
|
+
fetch(:shared, {}).merge(fetch(included_shared_config.to_sym, {})).merge(fetch(stack.to_s.to_sym, {}))
|
41
|
+
end
|
42
|
+
|
43
|
+
def fetch_stack_db_apps(stack)
|
44
|
+
fetch(:db_apps_stacks_mapping, {})[stack.to_sym] || []
|
45
|
+
end
|
46
|
+
|
47
|
+
def env_vars_command_for_docker(stack)
|
48
|
+
decrypt_env(stack).map { |k, _v| "-e #{k.to_s.upcase}=\"$#{k.to_s.upcase}\"" }.join(' ')
|
49
|
+
end
|
50
|
+
|
51
|
+
def env_vars_command(stack)
|
52
|
+
export_lines = decrypt_env(stack).map { |k, v| "export #{k.to_s.upcase}=#{v}" }.join(';')
|
53
|
+
encrypted_vars?(stack) ? "#{load_encrypt_lib};#{export_lines}" : export_lines
|
54
|
+
end
|
55
|
+
|
56
|
+
def erb_vars_command(stack)
|
57
|
+
decrypt_env(stack).map { |k, _v| "#{k.to_s.upcase}='$#{k.to_s.upcase}'" }.join(';')
|
58
|
+
end
|
59
|
+
|
60
|
+
def load_encrypt_lib
|
61
|
+
File.read("#{bash_source_root}/crypt").strip
|
62
|
+
end
|
63
|
+
|
64
|
+
def encrypted_vars?(stack)
|
65
|
+
!fetch_application_config(stack).select { |k, _| encrypted?(k) }.empty?
|
66
|
+
end
|
67
|
+
|
68
|
+
def decrypt_env(stack)
|
69
|
+
encrypted_vars = fetch_application_config(stack).select { |k, _| encrypted?(k) }
|
70
|
+
unencrypted_vars = fetch_application_config(stack).reject { |k, _| encrypted?(k) }
|
71
|
+
unencrypted_vars.transform_values! { |v| Shellwords.escape(v) }
|
72
|
+
configs = unencrypted_vars.merge(encrypted_vars.transform_values { |v| decrypt_var(v) })
|
73
|
+
configs.transform_keys { |k| k.to_s.sub(/^#{encrypted_prefix}/, '') }
|
74
|
+
end
|
75
|
+
|
76
|
+
def decrypt_var(var)
|
77
|
+
"$(decrypt '#{var}')"
|
78
|
+
end
|
79
|
+
|
80
|
+
def docker_erb_templates
|
81
|
+
fetch(:docker_erb_templates)
|
82
|
+
end
|
83
|
+
|
84
|
+
def docker_cleanup
|
85
|
+
fetch(:docker_cleanup)
|
86
|
+
end
|
87
|
+
|
88
|
+
def build_docker_images
|
89
|
+
fetch(:auto_image_build)
|
90
|
+
end
|
91
|
+
|
92
|
+
def encrypted_prefix
|
93
|
+
'encrypted_'
|
94
|
+
end
|
95
|
+
|
96
|
+
def encrypted?(key)
|
97
|
+
key.to_s.start_with?(encrypted_prefix)
|
98
|
+
end
|
99
|
+
|
100
|
+
def bash_source_root
|
101
|
+
"#{File.dirname(__FILE__)}/../bash"
|
102
|
+
end
|
103
|
+
|
104
|
+
def upload_script(shell_command, description)
|
105
|
+
filename = capture("mktemp /tmp/#{script_prefix}#{description}_XXXXXXX")
|
106
|
+
upload! StringIO.new(shell_command), filename
|
107
|
+
filename
|
108
|
+
end
|
109
|
+
|
110
|
+
def script_prefix
|
111
|
+
'ORCA_SSH_SCRIPT_'
|
112
|
+
end
|
113
|
+
|
114
|
+
def debug_mode?
|
115
|
+
%(true yes 1).include? ENV.fetch('ORCA_DEBUG', 'false')
|
116
|
+
end
|
117
|
+
|
118
|
+
def show_debug_messages(host, shell_command, description)
|
119
|
+
$stdout.puts <<~MESSAGE
|
120
|
+
|
121
|
+
\e[33mExecuting: #{description} ON #{host}
|
122
|
+
Bash Script:\n#{shell_command}\e[0m
|
123
|
+
MESSAGE
|
124
|
+
end
|
125
|
+
|
126
|
+
def execute_orca_script(host, shell_command, description)
|
127
|
+
show_debug_messages(host, shell_command, description) if debug_mode?
|
128
|
+
with ENCRYPTION_KEY: ENV.fetch('ENCRYPTION_KEY', nil) do
|
129
|
+
execute :bash, upload_script(shell_command, description)
|
130
|
+
end
|
131
|
+
execute :rm, "/tmp/#{script_prefix}*"
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'rake'
|
4
|
+
require 'sshkit'
|
5
|
+
require 'capistrano/dsl'
|
6
|
+
|
7
|
+
module Capistrano
|
8
|
+
# Capistrano Local
|
9
|
+
module Local
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
module Capistrano
|
14
|
+
# Capistrano DSL
|
15
|
+
module DSL
|
16
|
+
alias original_on on
|
17
|
+
|
18
|
+
def on(hosts, options = {}, &block)
|
19
|
+
return unless hosts
|
20
|
+
|
21
|
+
localhosts, remotehosts = Array(hosts).partition { |h| h.hostname.to_s =~ /local|127.0.0.1/ }
|
22
|
+
localhost = Configuration.env.filter(localhosts).first
|
23
|
+
|
24
|
+
ssh_backend.new(localhost, &block).run unless localhost.nil?
|
25
|
+
|
26
|
+
original_on(remotehosts, options, &block)
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
def ssh_backend
|
32
|
+
if dry_run?
|
33
|
+
SSHKit::Backend::Printer
|
34
|
+
else
|
35
|
+
SSHKit::Backend::Local
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def dry_run?
|
40
|
+
fetch(:sshkit_backend) == SSHKit::Backend::Printer
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,200 @@
|
|
1
|
+
namespace :deploy do
|
2
|
+
include Capistrano::SwarmOrca
|
3
|
+
|
4
|
+
namespace :stop do
|
5
|
+
desc "Stop all stacks"
|
6
|
+
task :all do
|
7
|
+
stacks.each do |stack|
|
8
|
+
invoke "deploy:stop:#{stack}"
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
stacks.each do |stack|
|
13
|
+
desc "Stop #{stack}"
|
14
|
+
task stack do
|
15
|
+
invoke "docker:deploy:stop_#{stack}"
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
namespace :scale do
|
21
|
+
desc "scale all stacks to 0 instance"
|
22
|
+
task :all_zero do
|
23
|
+
stacks.each do |stack|
|
24
|
+
invoke "docker:deploy:scale_down_#{stack}"
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
desc "scale all stacks to 1 instance"
|
29
|
+
task :all_one do
|
30
|
+
stacks.each do |stack|
|
31
|
+
invoke "docker:deploy:scale_up_#{stack}"
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
namespace :start do
|
37
|
+
desc "Start all stacks"
|
38
|
+
task :all do
|
39
|
+
stacks.each do |stack|
|
40
|
+
invoke "deploy:start:#{stack}"
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
stacks.each do |stack|
|
45
|
+
desc "Start #{stack}"
|
46
|
+
task stack do
|
47
|
+
invoke "docker:deploy:#{stack}"
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
stacks.each do |stack|
|
53
|
+
desc "Deploy #{stack}"
|
54
|
+
task stack do
|
55
|
+
pre_stack_specific_tasks stack if build_docker_images
|
56
|
+
invoke "docker:pull:#{stack}"
|
57
|
+
post_stack_specific_tasks stack
|
58
|
+
invoke "docker:deploy:#{stack}"
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
desc "Deploy all stacks and services"
|
63
|
+
task :all do
|
64
|
+
invoke "docker:deploy:cleanup" if docker_cleanup
|
65
|
+
stacks.each do |stack|
|
66
|
+
invoke "deploy:#{stack}"
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
desc "Deploy all stacks Databases"
|
71
|
+
task :all_dbs do
|
72
|
+
application_stacks.each do |stack|
|
73
|
+
invoke "deploy:create_#{stack}_dbs"
|
74
|
+
invoke "deploy:seed_#{stack}_dbs"
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
|
79
|
+
desc "Build all docker custom docker images"
|
80
|
+
task :build_images do
|
81
|
+
stacks.each do |stack|
|
82
|
+
pre_stack_specific_tasks stack
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
desc "Seed all stacks Databases defined in SEEDED_STACKS ENV var"
|
87
|
+
task :seed_auto do
|
88
|
+
seeded_stacks = ENV.fetch('SEEDED_STACKS', '').split(' ') & application_stacks
|
89
|
+
seeded_stacks.each do |stack|
|
90
|
+
invoke "deploy:seed_#{stack}_dbs"
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
desc "Recreate all Databases"
|
95
|
+
task :recreate_all_dbs do
|
96
|
+
application_stacks.each do |stack|
|
97
|
+
invoke "deploy:drop_#{stack}_dbs"
|
98
|
+
invoke "deploy:create_#{stack}_dbs"
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
desc "Deploy all stacks and services defined in DEPLOYED_STACKS ENV var"
|
103
|
+
task :auto do
|
104
|
+
invoke "deploy:setup"
|
105
|
+
invoke "docker:deploy:cleanup" if docker_cleanup
|
106
|
+
deployed_stacks = ENV.fetch('DEPLOYED_STACKS', stacks.join(' ')).split(' ') & stacks
|
107
|
+
deployed_stacks.each do |stack|
|
108
|
+
invoke "deploy:#{stack}"
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
def pre_stack_specific_tasks(stack)
|
113
|
+
task = "docker:deploy:build_#{stack}"
|
114
|
+
invoke task if Rake::Task.task_defined?(task)
|
115
|
+
end
|
116
|
+
|
117
|
+
def post_stack_specific_tasks(stack)
|
118
|
+
stack_migrate_apps(stack) if application_stacks.include? stack
|
119
|
+
stack_reindex_apps(stack) if stack.eql? 'community'
|
120
|
+
end
|
121
|
+
|
122
|
+
def stack_migrate_apps(stack)
|
123
|
+
Rake::Task["deploy:migrate_#{stack}_dbs"].invoke(stack)
|
124
|
+
end
|
125
|
+
|
126
|
+
def stack_seed_apps(stack)
|
127
|
+
Rake::Task["deploy:seed_#{stack}_dbs"].invoke(stack)
|
128
|
+
end
|
129
|
+
|
130
|
+
def stack_reindex_apps(stack)
|
131
|
+
fetch_config(stack, 'reindex_apps').split.each do |app|
|
132
|
+
Rake::Task["docker:deploy:reindex_elasticsearch_#{app}"].invoke(stack)
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
application_stacks.each do |stack|
|
137
|
+
desc "Create #{stack} Databases"
|
138
|
+
task "create_#{stack}_dbs".to_sym do
|
139
|
+
fetch_stack_db_apps(stack).each do |app|
|
140
|
+
Rake::Task["docker:deploy:create_#{app}_db"].invoke(stack)
|
141
|
+
end
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
145
|
+
application_stacks.each do |stack|
|
146
|
+
fetch_stack_db_apps(stack).each do |app|
|
147
|
+
desc "Execute #{app} one Time Data Migration"
|
148
|
+
task "otm_#{app}".to_sym, :task_name do |t, args|
|
149
|
+
raise "Please provide migration name. ie. deploy:otm_#{app}[MIGRATION]" unless args.key?(:task_name)
|
150
|
+
Rake::Task["docker:deploy:otm_#{app}"].invoke(stack, args[:task_name])
|
151
|
+
end
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
155
|
+
application_stacks.each do |stack|
|
156
|
+
desc "Drop #{stack} Databases"
|
157
|
+
task "drop_#{stack}_dbs".to_sym do
|
158
|
+
fetch_stack_db_apps(stack).each do |app|
|
159
|
+
Rake::Task["docker:deploy:drop_#{app}_db"].invoke(stack)
|
160
|
+
end
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
164
|
+
application_stacks.each do |stack|
|
165
|
+
desc "Seed #{stack} Databases"
|
166
|
+
task "seed_#{stack}_dbs".to_sym do
|
167
|
+
fetch_stack_db_apps(stack).each do |app|
|
168
|
+
Rake::Task["docker:deploy:seed_#{app}_db"].invoke(stack)
|
169
|
+
end
|
170
|
+
end
|
171
|
+
end
|
172
|
+
|
173
|
+
application_stacks.each do |stack|
|
174
|
+
desc "Migrate #{stack} Databases"
|
175
|
+
task "migrate_#{stack}_dbs".to_sym do
|
176
|
+
fetch_stack_db_apps(stack).each do |app|
|
177
|
+
Rake::Task["docker:deploy:migrate_#{app}"].invoke(stack)
|
178
|
+
end
|
179
|
+
end
|
180
|
+
end
|
181
|
+
|
182
|
+
desc "Setup Deployment Project"
|
183
|
+
task :setup do
|
184
|
+
invoke "deploy"
|
185
|
+
invoke "docker:deploy:create_network"
|
186
|
+
end
|
187
|
+
|
188
|
+
desc "Setup Deployment Project"
|
189
|
+
task :development_setup do
|
190
|
+
invoke "deploy"
|
191
|
+
invoke "docker:deploy:create_network"
|
192
|
+
all_service_stacks.each do |stack|
|
193
|
+
invoke "deploy:#{stack}"
|
194
|
+
end
|
195
|
+
invoke "deploy:all_dbs"
|
196
|
+
application_stacks.each do |stack|
|
197
|
+
invoke "deploy:#{stack}"
|
198
|
+
end
|
199
|
+
end
|
200
|
+
end
|