orchestration 0.3.3 → 0.3.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/README.md +1 -1
- data/TODO +2 -12
- data/config/locales/en.yml +10 -13
- data/lib/orchestration/docker_compose/{application_service.rb → app_service.rb} +6 -5
- data/lib/orchestration/docker_compose/configuration.rb +69 -0
- data/lib/orchestration/docker_compose/database_service.rb +18 -25
- data/lib/orchestration/docker_compose/install_generator.rb +113 -0
- data/lib/orchestration/docker_compose/mongo_service.rb +15 -5
- data/lib/orchestration/docker_compose/nginx_proxy_service.rb +3 -2
- data/lib/orchestration/docker_compose/rabbitmq_service.rb +9 -5
- data/lib/orchestration/docker_compose.rb +3 -2
- data/lib/orchestration/environment.rb +32 -11
- data/lib/orchestration/errors.rb +3 -1
- data/lib/orchestration/file_helpers.rb +10 -5
- data/lib/orchestration/install_generator.rb +38 -51
- data/lib/orchestration/services/{application → app}/configuration.rb +5 -5
- data/lib/orchestration/services/{application → app}/healthcheck.rb +4 -4
- data/lib/orchestration/services/app.rb +13 -0
- data/lib/orchestration/services/configuration_base.rb +3 -1
- data/lib/orchestration/services/database/adapters/mysql2.rb +19 -0
- data/lib/orchestration/services/database/adapters/postgresql.rb +20 -0
- data/lib/orchestration/services/database/adapters/sqlite3.rb +4 -0
- data/lib/orchestration/services/database/configuration.rb +23 -13
- data/lib/orchestration/services/healthcheck_base.rb +1 -1
- data/lib/orchestration/services/nginx_proxy/configuration.rb +7 -2
- data/lib/orchestration/services.rb +1 -1
- data/lib/orchestration/templates/Makefile.erb +99 -40
- data/lib/orchestration/templates/application.mk.erb +14 -0
- data/lib/orchestration/templates/deploy.mk.erb +34 -0
- data/lib/orchestration/templates/docker-compose.override.yml.erb +1 -0
- data/lib/orchestration/templates/env.erb +6 -0
- data/lib/orchestration/templates/unicorn.rb.erb +1 -1
- data/lib/orchestration/terminal.rb +17 -1
- data/lib/orchestration/version.rb +1 -1
- data/lib/orchestration.rb +2 -1
- data/lib/tasks/orchestration.rake +7 -17
- metadata +13 -8
- data/lib/orchestration/docker_compose/services.rb +0 -59
- data/lib/orchestration/services/application.rb +0 -13
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 416fd08805e2ce12b2397a91f5baf894130f26d1ddf047f11a6b788b89783f16
|
4
|
+
data.tar.gz: 7b2f05787d2173d2e160a4ec40a4359e12f9e0d108384c7bd13c6fba43118692
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7a48ebb75ada7116256385d8bcf4d7db9a3bc6a9236b56b641078148a79b4fbb60cf75d4a488d0141415857d85f1d222d99adfd1212dd6346f7a7f6f14c7dbbc
|
7
|
+
data.tar.gz: f9df0d2800ea58090177d05b146236c44aff5e7cbbdd407b10f99214bea3fb8ae5de69f3893fd52eafa996491132cba9a25ecd7119c24320a4d420400e469396
|
data/README.md
CHANGED
data/TODO
CHANGED
@@ -1,5 +1,3 @@
|
|
1
|
-
Provide volumes for databases and mount appropriate directories for adapter
|
2
|
-
|
3
1
|
Refactor docker-compose services - these really belong in
|
4
2
|
lib/orchestration/services/<service-name>/docker_compose.rb
|
5
3
|
|
@@ -7,13 +5,5 @@ Standardise on log formats - by policy or recommendation ?
|
|
7
5
|
|
8
6
|
Redis support
|
9
7
|
|
10
|
-
|
11
|
-
|
12
|
-
locally.
|
13
|
-
|
14
|
-
Build a docker-compose.production.yml for running application in
|
15
|
-
production (i.e. including application as a service and removing local port
|
16
|
-
bindings).
|
17
|
-
|
18
|
-
Make docker-compose file additive - detect existing services and add new ones
|
19
|
-
rather than overwriting.
|
8
|
+
Use `Paint` instead of `Colorize` for colouring output - better licensing and no
|
9
|
+
monkeypatching `String` etc.
|
data/config/locales/en.yml
CHANGED
@@ -3,20 +3,21 @@ en:
|
|
3
3
|
attempt_limit: "Unable to reconnect after %{limit} attempts. Aborting."
|
4
4
|
default: "default"
|
5
5
|
|
6
|
-
|
7
|
-
waiting: "Waiting for
|
8
|
-
ready: "
|
9
|
-
connection_error: "Error attempting to connect to
|
6
|
+
app:
|
7
|
+
waiting: "Waiting for app: %{config}"
|
8
|
+
ready: "App is ready."
|
9
|
+
connection_error: "Error attempting to connect to app: received status code %{code}"
|
10
10
|
|
11
11
|
database:
|
12
12
|
waiting: "Waiting for database: %{config}"
|
13
13
|
ready: "Database is ready."
|
14
|
+
unknown_environment: "Environment not defined in database configuration: %{environment}"
|
14
15
|
|
15
16
|
mongo:
|
16
17
|
waiting: "Waiting for Mongo: %{config}"
|
17
18
|
ready: "Mongo is ready."
|
18
19
|
|
19
|
-
|
20
|
+
nginx_proxy:
|
20
21
|
waiting: "Waiting for Nginx proxy: %{config}"
|
21
22
|
ready: "Nginx proxy is ready."
|
22
23
|
|
@@ -39,11 +40,8 @@ en:
|
|
39
40
|
prompt: "project name"
|
40
41
|
|
41
42
|
rake:
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
application:
|
46
|
-
wait: "Wait for database to become available"
|
43
|
+
app:
|
44
|
+
wait: "Wait for app to become available"
|
47
45
|
|
48
46
|
database:
|
49
47
|
wait: "Wait for database to become available"
|
@@ -54,11 +52,10 @@ en:
|
|
54
52
|
mongo:
|
55
53
|
wait: "Wait for Mongo to become available"
|
56
54
|
|
57
|
-
|
55
|
+
nginx_proxy:
|
58
56
|
wait: "Wait for Nginx proxy to become available"
|
59
57
|
|
60
58
|
rabbitmq:
|
61
59
|
wait: "Wait for RabbitMQ to become available"
|
62
60
|
|
63
|
-
|
64
|
-
wait: "Initialise boilerplate for adding Docker to your application"
|
61
|
+
install: "Install Orchestration tools"
|
@@ -2,8 +2,9 @@
|
|
2
2
|
|
3
3
|
module Orchestration
|
4
4
|
module DockerCompose
|
5
|
-
class
|
6
|
-
def initialize(config)
|
5
|
+
class AppService
|
6
|
+
def initialize(config, environment)
|
7
|
+
@environment = environment
|
7
8
|
@config = config
|
8
9
|
end
|
9
10
|
|
@@ -27,8 +28,7 @@ module Orchestration
|
|
27
28
|
'UNICORN_PRELOAD_APP' => '1',
|
28
29
|
'UNICORN_TIMEOUT' => '60',
|
29
30
|
'UNICORN_WORKER_PROCESSES' => '8',
|
30
|
-
'VIRTUAL_PORT' => '8080'
|
31
|
-
'VIRTUAL_HOST' => 'localhost'
|
31
|
+
'VIRTUAL_PORT' => '8080'
|
32
32
|
}.merge(inherited_environment)
|
33
33
|
end
|
34
34
|
|
@@ -36,7 +36,8 @@ module Orchestration
|
|
36
36
|
{
|
37
37
|
'HOST_UID' => nil,
|
38
38
|
'RAILS_ENV' => nil,
|
39
|
-
'SECRET_KEY_BASE' => nil
|
39
|
+
'SECRET_KEY_BASE' => nil,
|
40
|
+
'VIRTUAL_HOST' => nil
|
40
41
|
}
|
41
42
|
end
|
42
43
|
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Orchestration
|
4
|
+
module DockerCompose
|
5
|
+
class Configuration
|
6
|
+
def initialize(env, environment, selected_services)
|
7
|
+
@env = env # Global environment
|
8
|
+
@environment = environment # Current build environment
|
9
|
+
@selected_services = selected_services
|
10
|
+
end
|
11
|
+
|
12
|
+
def version
|
13
|
+
@env.docker_api_version
|
14
|
+
end
|
15
|
+
|
16
|
+
def services
|
17
|
+
Hash[services_enabled]
|
18
|
+
end
|
19
|
+
|
20
|
+
def volumes
|
21
|
+
public_volume.merge(database_volume).merge(mongo_volume)
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
def services_available
|
27
|
+
{
|
28
|
+
app: AppService,
|
29
|
+
database: DatabaseService,
|
30
|
+
mongo: MongoService,
|
31
|
+
rabbitmq: RabbitMQService,
|
32
|
+
nginx_proxy: NginxProxyService
|
33
|
+
}
|
34
|
+
end
|
35
|
+
|
36
|
+
def services_enabled
|
37
|
+
@selected_services.map do |service, config|
|
38
|
+
definition = service_definition(service, config)
|
39
|
+
next if definition.nil?
|
40
|
+
|
41
|
+
[service.to_s, definition]
|
42
|
+
end.compact
|
43
|
+
end
|
44
|
+
|
45
|
+
def public_volume
|
46
|
+
{ @env.public_volume => {} }
|
47
|
+
end
|
48
|
+
|
49
|
+
def database_volume
|
50
|
+
return {} unless services.key?('database')
|
51
|
+
|
52
|
+
{ @env.database_volume => {} }
|
53
|
+
end
|
54
|
+
|
55
|
+
def mongo_volume
|
56
|
+
return {} unless services.key?('mongo')
|
57
|
+
|
58
|
+
{ @env.mongo_volume => {} }
|
59
|
+
end
|
60
|
+
|
61
|
+
def service_definition(service, config)
|
62
|
+
services_available
|
63
|
+
.fetch(service)
|
64
|
+
.new(config, @environment)
|
65
|
+
.definition
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
@@ -7,44 +7,37 @@ module Orchestration
|
|
7
7
|
# container to simplify port mapping.
|
8
8
|
PORT = 3354
|
9
9
|
|
10
|
-
def initialize(config)
|
10
|
+
def initialize(config, environment)
|
11
|
+
@environment = environment
|
11
12
|
@config = config
|
12
13
|
end
|
13
14
|
|
14
15
|
def definition
|
15
16
|
return nil if @config.settings.nil?
|
17
|
+
return nil if @config.adapter.name == 'sqlite3'
|
16
18
|
|
17
|
-
adapter = @config.settings.fetch('adapter')
|
18
|
-
return nil if adapter == 'sqlite3'
|
19
|
-
|
20
|
-
port = @config.settings.fetch('port')
|
21
19
|
{
|
22
|
-
'image' =>
|
23
|
-
'environment' =>
|
24
|
-
|
25
|
-
}
|
20
|
+
'image' => @config.adapter.image,
|
21
|
+
'environment' => @config.adapter.environment
|
22
|
+
}.merge(ports).merge(volumes)
|
26
23
|
end
|
27
24
|
|
28
25
|
private
|
29
26
|
|
30
|
-
def
|
31
|
-
|
32
|
-
'postgresql' => 'library/postgres',
|
33
|
-
'mysql2' => 'library/mysql'
|
34
|
-
}.fetch(adapter)
|
27
|
+
def volume
|
28
|
+
@config.env.database_volume
|
35
29
|
end
|
36
30
|
|
37
|
-
def
|
38
|
-
{
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
}.fetch(adapter)
|
31
|
+
def ports
|
32
|
+
return {} unless %i[development test].include?(@environment)
|
33
|
+
|
34
|
+
{ 'ports' => ["#{@config.settings.fetch('port')}:#{PORT}"] }
|
35
|
+
end
|
36
|
+
|
37
|
+
def volumes
|
38
|
+
return {} if @environment == :test
|
39
|
+
|
40
|
+
{ 'volumes' => ["#{volume}:#{@config.adapter.data_dir}"] }
|
48
41
|
end
|
49
42
|
end
|
50
43
|
end
|
@@ -0,0 +1,113 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Orchestration
|
4
|
+
module DockerCompose
|
5
|
+
class InstallGenerator
|
6
|
+
include FileHelpers
|
7
|
+
|
8
|
+
def initialize(env, terminal)
|
9
|
+
@env = env
|
10
|
+
@terminal = terminal
|
11
|
+
end
|
12
|
+
|
13
|
+
def docker_compose_yml
|
14
|
+
create_compose_file
|
15
|
+
end
|
16
|
+
|
17
|
+
def docker_compose_test_yml
|
18
|
+
create_compose_file(:test)
|
19
|
+
end
|
20
|
+
|
21
|
+
def docker_compose_development_yml
|
22
|
+
create_compose_file(:development)
|
23
|
+
end
|
24
|
+
|
25
|
+
def docker_compose_production_yml
|
26
|
+
create_compose_file(:production)
|
27
|
+
end
|
28
|
+
|
29
|
+
def docker_compose_override_yml
|
30
|
+
simple_copy(
|
31
|
+
'docker-compose.override.yml',
|
32
|
+
@env.docker_compose_path(:override),
|
33
|
+
overwrite: false
|
34
|
+
)
|
35
|
+
end
|
36
|
+
|
37
|
+
def enabled_services(environment)
|
38
|
+
service_names(environment).select { |name| service_enabled?(name) }
|
39
|
+
end
|
40
|
+
|
41
|
+
private
|
42
|
+
|
43
|
+
def create_compose_file(environment = nil)
|
44
|
+
path = @env.docker_compose_path(environment)
|
45
|
+
create_file(
|
46
|
+
path,
|
47
|
+
structure(environment).to_yaml,
|
48
|
+
overwrite: false
|
49
|
+
)
|
50
|
+
end
|
51
|
+
|
52
|
+
def structure(environment = nil)
|
53
|
+
{
|
54
|
+
'version' => compose_config(environment).version,
|
55
|
+
'services' => services(environment)
|
56
|
+
}.merge('volumes' => volumes(environment))
|
57
|
+
end
|
58
|
+
|
59
|
+
def services(environment)
|
60
|
+
compose_config(environment).services
|
61
|
+
end
|
62
|
+
|
63
|
+
def volumes(environment)
|
64
|
+
return {} if environment.nil? || environment == :test
|
65
|
+
|
66
|
+
compose_config(environment).volumes
|
67
|
+
end
|
68
|
+
|
69
|
+
def compose_config(environment)
|
70
|
+
DockerCompose::Configuration.new(
|
71
|
+
@env,
|
72
|
+
environment,
|
73
|
+
Hash[configurations(environment)]
|
74
|
+
)
|
75
|
+
end
|
76
|
+
|
77
|
+
def service_names(environment)
|
78
|
+
case environment
|
79
|
+
when :test, :development
|
80
|
+
%i[database mongo rabbitmq]
|
81
|
+
when :production
|
82
|
+
%i[nginx_proxy app database mongo rabbitmq]
|
83
|
+
when nil
|
84
|
+
[]
|
85
|
+
else
|
86
|
+
raise ArgumentError, environment.inspect
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
def configurations(environment)
|
91
|
+
service_names(environment).map do |key|
|
92
|
+
[key, configuration(key)]
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
def configuration(service)
|
97
|
+
{
|
98
|
+
app: Orchestration::Services::App::Configuration,
|
99
|
+
database: Orchestration::Services::Database::Configuration,
|
100
|
+
mongo: Orchestration::Services::Mongo::Configuration,
|
101
|
+
rabbitmq: Orchestration::Services::RabbitMQ::Configuration,
|
102
|
+
nginx_proxy: Orchestration::Services::NginxProxy::Configuration
|
103
|
+
}.fetch(service).new(@env)
|
104
|
+
end
|
105
|
+
|
106
|
+
def service_enabled?(service_name)
|
107
|
+
return false if configuration(service_name).settings.nil?
|
108
|
+
|
109
|
+
true
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
@@ -5,21 +5,31 @@ module Orchestration
|
|
5
5
|
class MongoService
|
6
6
|
PORT = 27_020
|
7
7
|
|
8
|
-
def initialize(config)
|
8
|
+
def initialize(config, environment)
|
9
9
|
@config = config
|
10
|
+
@environment = environment
|
10
11
|
end
|
11
12
|
|
12
13
|
def definition
|
13
14
|
return nil if @config.settings.nil?
|
14
15
|
|
15
|
-
{
|
16
|
-
'image' => 'library/mongo',
|
17
|
-
'ports' => ["#{local_port}:#{remote_port}"]
|
18
|
-
}
|
16
|
+
{ 'image' => 'library/mongo' }.merge(ports).merge(volumes)
|
19
17
|
end
|
20
18
|
|
21
19
|
private
|
22
20
|
|
21
|
+
def ports
|
22
|
+
return {} unless %i[development test].include?(@environment)
|
23
|
+
|
24
|
+
{ 'ports' => ["#{local_port}:#{remote_port}"] }
|
25
|
+
end
|
26
|
+
|
27
|
+
def volumes
|
28
|
+
return {} if @environment == :test
|
29
|
+
|
30
|
+
{ 'volumes' => ["#{@config.env.mongo_volume}:/data/db"] }
|
31
|
+
end
|
32
|
+
|
23
33
|
def local_port
|
24
34
|
_host, _, port = clients.fetch('default')
|
25
35
|
.fetch('hosts')
|
@@ -3,14 +3,15 @@
|
|
3
3
|
module Orchestration
|
4
4
|
module DockerCompose
|
5
5
|
class NginxProxyService
|
6
|
-
def initialize(config)
|
6
|
+
def initialize(config, environment)
|
7
|
+
@environment = environment
|
7
8
|
@config = config
|
8
9
|
end
|
9
10
|
|
10
11
|
def definition
|
11
12
|
{
|
12
13
|
'image' => 'rubyorchestration/nginx-proxy',
|
13
|
-
'ports' => %w[
|
14
|
+
'ports' => %w[${LISTEN_PORT}:80],
|
14
15
|
'volumes' => [
|
15
16
|
'/var/run/docker.sock:/tmp/docker.sock:ro',
|
16
17
|
"#{@config.env.public_volume}:/var/www/public/:ro"
|
@@ -3,20 +3,24 @@
|
|
3
3
|
module Orchestration
|
4
4
|
module DockerCompose
|
5
5
|
class RabbitMQService
|
6
|
-
def initialize(config)
|
6
|
+
def initialize(config, environment)
|
7
7
|
@config = config
|
8
|
+
@environment = environment
|
8
9
|
end
|
9
10
|
|
10
11
|
def definition
|
11
12
|
return nil if @config.settings.nil?
|
12
13
|
|
14
|
+
{ 'image' => 'library/rabbitmq' }.merge(ports)
|
15
|
+
end
|
16
|
+
|
17
|
+
def ports
|
18
|
+
return {} unless %i[development test].include?(@environment)
|
19
|
+
|
13
20
|
host_port = @config.settings.fetch('port', 5672)
|
14
21
|
container_port = Orchestration::Services::RabbitMQ::PORT
|
15
22
|
|
16
|
-
{
|
17
|
-
'image' => 'library/rabbitmq',
|
18
|
-
'ports' => ["#{host_port}:#{container_port}"]
|
19
|
-
}
|
23
|
+
{ 'ports' => ["#{host_port}:#{container_port}"] }
|
20
24
|
end
|
21
25
|
end
|
22
26
|
end
|
@@ -5,9 +5,10 @@ module Orchestration
|
|
5
5
|
end
|
6
6
|
end
|
7
7
|
|
8
|
-
require 'orchestration/docker_compose/
|
8
|
+
require 'orchestration/docker_compose/install_generator'
|
9
|
+
require 'orchestration/docker_compose/configuration'
|
9
10
|
|
10
|
-
require 'orchestration/docker_compose/
|
11
|
+
require 'orchestration/docker_compose/app_service'
|
11
12
|
require 'orchestration/docker_compose/database_service'
|
12
13
|
require 'orchestration/docker_compose/mongo_service'
|
13
14
|
require 'orchestration/docker_compose/nginx_proxy_service'
|
@@ -32,23 +32,36 @@ module Orchestration
|
|
32
32
|
root.join('.orchestration.yml')
|
33
33
|
end
|
34
34
|
|
35
|
-
def
|
36
|
-
|
35
|
+
def docker_api_version
|
36
|
+
'3.7'
|
37
37
|
end
|
38
38
|
|
39
|
-
def
|
40
|
-
|
39
|
+
def docker_compose_path(env = nil)
|
40
|
+
return orchestration_root.join('docker-compose.yml') if env.nil?
|
41
|
+
|
42
|
+
orchestration_root.join("docker-compose.#{env}.yml")
|
43
|
+
end
|
44
|
+
|
45
|
+
def docker_compose_config(env = nil)
|
46
|
+
env ||= environment
|
47
|
+
YAML.safe_load(File.read(docker_compose_path(env)))
|
41
48
|
end
|
42
49
|
|
43
|
-
def docker_compose_config?
|
44
|
-
|
50
|
+
def docker_compose_config?(env = nil)
|
51
|
+
env ||= environment
|
52
|
+
docker_compose_path(env).file?
|
45
53
|
end
|
46
54
|
|
47
|
-
def
|
55
|
+
def default_app_name
|
56
|
+
default = root.basename.to_s
|
57
|
+
return default unless defined?(Rails)
|
58
|
+
# Edge case if Rails is used as a dependency but we are not a Rails app:
|
59
|
+
return default if Rails.application.class.parent == Object
|
60
|
+
|
48
61
|
Rails.application.class.parent.name.underscore
|
49
62
|
end
|
50
63
|
|
51
|
-
def
|
64
|
+
def app_name
|
52
65
|
settings.get('docker.repository')
|
53
66
|
end
|
54
67
|
|
@@ -57,8 +70,8 @@ module Orchestration
|
|
57
70
|
end
|
58
71
|
|
59
72
|
def root
|
60
|
-
|
61
|
-
|
73
|
+
defined?(Rails) && Rails.root ? Rails.root : Pathname.new(Dir.pwd)
|
74
|
+
rescue NoMethodError
|
62
75
|
Pathname.new(Dir.pwd)
|
63
76
|
end
|
64
77
|
|
@@ -71,7 +84,15 @@ module Orchestration
|
|
71
84
|
end
|
72
85
|
|
73
86
|
def public_volume
|
74
|
-
"#{
|
87
|
+
"#{app_name}_public"
|
88
|
+
end
|
89
|
+
|
90
|
+
def database_volume
|
91
|
+
"#{app_name}_database"
|
92
|
+
end
|
93
|
+
|
94
|
+
def mongo_volume
|
95
|
+
"#{app_name}_mongo"
|
75
96
|
end
|
76
97
|
end
|
77
98
|
end
|
data/lib/orchestration/errors.rb
CHANGED
@@ -3,7 +3,9 @@
|
|
3
3
|
module Orchestration
|
4
4
|
class OrchestrationError < StandardError; end
|
5
5
|
|
6
|
-
class
|
6
|
+
class AppConnectionError < OrchestrationError; end
|
7
7
|
class DatabaseConfigurationError < OrchestrationError; end
|
8
8
|
class MongoConfigurationError < OrchestrationError; end
|
9
|
+
|
10
|
+
class UnknownEnvironmentError < DatabaseConfigurationError; end
|
9
11
|
end
|
@@ -27,11 +27,15 @@ module Orchestration
|
|
27
27
|
end
|
28
28
|
|
29
29
|
def relative_path(path)
|
30
|
-
path.relative_path_from(
|
30
|
+
path.relative_path_from(@env.root).to_s
|
31
31
|
end
|
32
32
|
|
33
|
-
def simple_copy(template_name, dest)
|
34
|
-
update_file(
|
33
|
+
def simple_copy(template_name, dest, options = {})
|
34
|
+
update_file(
|
35
|
+
dest,
|
36
|
+
template(template_name, env: @env),
|
37
|
+
overwrite: options.fetch(:overwrite, true)
|
38
|
+
)
|
35
39
|
end
|
36
40
|
|
37
41
|
def create_file(path, content, options = {})
|
@@ -44,12 +48,13 @@ module Orchestration
|
|
44
48
|
@terminal.write(:create, relative_path(path))
|
45
49
|
end
|
46
50
|
|
47
|
-
def update_file(path, content)
|
51
|
+
def update_file(path, content, options = {})
|
48
52
|
present = File.exist?(path)
|
49
53
|
return create_file(path, content) unless present
|
50
54
|
|
55
|
+
overwrite = options.fetch(:overwrite, true)
|
51
56
|
previous_content = File.read(path) if present
|
52
|
-
if present && previous_content == content
|
57
|
+
if present && (!overwrite || previous_content == content)
|
53
58
|
return @terminal.write(:skip, relative_path(path))
|
54
59
|
end
|
55
60
|
|