ruby_yacht 0.3.0 → 0.4.0
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/Gemfile.lock +1 -1
- data/doc/TODO.md +1 -8
- data/lib/ruby_yacht/dsl/app.rb +37 -10
- data/lib/ruby_yacht/dsl/configuration.rb +21 -21
- data/lib/ruby_yacht/dsl/database.rb +53 -0
- data/lib/ruby_yacht/dsl/dsl.rb +14 -8
- data/lib/ruby_yacht/dsl/hook.rb +35 -15
- data/lib/ruby_yacht/dsl/project.rb +23 -10
- data/lib/ruby_yacht/dsl/{app_type.rb → server_type.rb} +39 -29
- data/lib/ruby_yacht/dsl.rb +1 -1
- data/lib/ruby_yacht/images/app/Dockerfile.erb +9 -5
- data/lib/ruby_yacht/images/app-dependencies/Dockerfile.erb +2 -2
- data/lib/ruby_yacht/images/database/Dockerfile.erb +12 -11
- data/lib/ruby_yacht/images/web/Dockerfile.erb +6 -2
- data/lib/ruby_yacht/images/web/add_app.rb +7 -1
- data/lib/ruby_yacht/images/web/app_config.erb +2 -0
- data/lib/ruby_yacht/plugins/mysql/scripts/setup.bash +11 -0
- data/lib/ruby_yacht/plugins/mysql.rb +27 -0
- data/lib/ruby_yacht/plugins/rails/scripts/install_gems.rb +6 -1
- data/lib/ruby_yacht/plugins/rails/scripts/load_seeds.rb +6 -4
- data/lib/ruby_yacht/plugins/rails/scripts/prepare_rails_for_launch.rb +1 -0
- data/lib/ruby_yacht/plugins/rails/scripts/update_rails_config.rb +1 -5
- data/lib/ruby_yacht/plugins/rails.rb +12 -4
- data/lib/ruby_yacht/plugins.rb +2 -1
- data/lib/ruby_yacht/runner/build_images.rb +32 -26
- data/lib/ruby_yacht/runner/checkout.rb +5 -4
- data/lib/ruby_yacht/runner/run_containers.rb +7 -6
- data/lib/ruby_yacht/runner/services.rb +2 -2
- data/lib/ruby_yacht/runner/shell.rb +5 -4
- data/lib/ruby_yacht/runner/update_hosts.rb +2 -1
- data/ruby_yacht.gemspec +1 -1
- data/spec/dsl/app_spec.rb +96 -10
- data/spec/dsl/configuration_spec.rb +53 -55
- data/spec/dsl/database_spec.rb +70 -12
- data/spec/dsl/hook_spec.rb +36 -19
- data/spec/dsl/project_spec.rb +26 -18
- data/spec/dsl/{app_type_spec.rb → server_type_spec.rb} +52 -28
- data/spec/fixtures/app-dependencies-dockerfile-rails +3 -0
- data/spec/fixtures/database-dockerfile +1 -8
- data/spec/fixtures/database-dockerfile-mysql +30 -0
- data/spec/fixtures/database-dockerfile-rails +1 -5
- data/spec/fixtures/database-dockerfile-with-seed-hooks +1 -8
- data/spec/fixtures/mars-before-startup-with-custom-file-copy +6 -0
- data/spec/fixtures/mars-dockerfile +0 -4
- data/spec/fixtures/mars-dockerfile-rails +2 -2
- data/spec/fixtures/mars-dockerfile-with-after-checkout-hooks +0 -4
- data/spec/fixtures/mars-dockerfile-with-before-startup-hooks +0 -4
- data/spec/fixtures/mars-dockerfile-with-custom-file-copy +23 -0
- data/spec/fixtures/mars-dockerfile-with-local-database +27 -0
- data/spec/fixtures/mars-dockerfile-with-remote-database +27 -0
- data/spec/fixtures/web-dockerfile-with-eponymous-app +20 -0
- data/spec/plugins/mysql_spec.rb +64 -0
- data/spec/plugins/rails_spec.rb +103 -43
- data/spec/runner/build_images_spec.rb +142 -11
- data/spec/runner/checkout_spec.rb +4 -4
- data/spec/runner/run_containers_spec.rb +21 -2
- data/spec/runner/runner_spec.rb +1 -1
- data/spec/runner/services_spec.rb +7 -2
- data/spec/runner/shell_spec.rb +3 -3
- data/spec/runner/update_hosts_spec.rb +26 -0
- data/spec/support/test_project.rb +16 -20
- metadata +20 -5
- data/lib/ruby_yacht/images/database/setup.bash +0 -15
@@ -0,0 +1,20 @@
|
|
1
|
+
FROM nginx
|
2
|
+
|
3
|
+
RUN apt-get update
|
4
|
+
RUN apt-get upgrade -y
|
5
|
+
RUN apt-get install -y ruby
|
6
|
+
|
7
|
+
RUN mkdir -p /var/docker
|
8
|
+
|
9
|
+
COPY add_project.rb /var/docker/add_project.rb
|
10
|
+
COPY add_app.rb /var/docker/add_app.rb
|
11
|
+
COPY index.html.erb /var/docker/index.html.erb
|
12
|
+
COPY index_config.erb /var/docker/index_config.erb
|
13
|
+
COPY app_config.erb /var/docker/app_config.erb
|
14
|
+
|
15
|
+
RUN ruby /var/docker/add_app.rb apollo apollo.test.com apollo 8080 true
|
16
|
+
RUN ruby /var/docker/add_app.rb apollo apollo.test.com saturn 8080 false
|
17
|
+
|
18
|
+
RUN rm -r /var/docker
|
19
|
+
RUN apt-get remove -y ruby
|
20
|
+
RUN apt-get autoremove -y
|
@@ -0,0 +1,64 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe RubyYacht::Plugins::MySQL do
|
4
|
+
before do
|
5
|
+
RubyYacht.configuration.clear
|
6
|
+
described_class.load
|
7
|
+
end
|
8
|
+
|
9
|
+
it "adds MySQL to the app type list" do
|
10
|
+
expect(RubyYacht.configuration.server_types.map(&:name)).to include :mysql
|
11
|
+
end
|
12
|
+
|
13
|
+
describe "building images" do
|
14
|
+
subject { RubyYacht::Runner::BuildImages.new }
|
15
|
+
include DockerCommandSpec
|
16
|
+
|
17
|
+
before do
|
18
|
+
RubyYacht.configuration.clear
|
19
|
+
described_class.load
|
20
|
+
|
21
|
+
RubyYacht.configure do
|
22
|
+
server_type :generic do
|
23
|
+
container_type :app
|
24
|
+
baseline_image :ubuntu
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
RubyYacht.configure do
|
29
|
+
project :apollo do
|
30
|
+
system_prefix :apollo
|
31
|
+
domain "apollo.test.com"
|
32
|
+
repository "github.com"
|
33
|
+
|
34
|
+
mysql_database :apollo do
|
35
|
+
host "localhost"
|
36
|
+
username "apollo"
|
37
|
+
password "test"
|
38
|
+
end
|
39
|
+
|
40
|
+
generic_app :mars do
|
41
|
+
repository_name 'brownleej/mars'
|
42
|
+
database_name :apollo
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
it "copies the scripts to the docker folder" do
|
49
|
+
docker.expect("build -t apollo-database tmp") do
|
50
|
+
files = Dir[File.join("tmp", "*")].sort
|
51
|
+
expect(files).to eq ['tmp/Dockerfile', 'tmp/Dockerfile.erb', 'tmp/checkout.bash', 'tmp/setup.bash']
|
52
|
+
end
|
53
|
+
subject.run
|
54
|
+
end
|
55
|
+
it "builds the dockerfile for a MySQL database" do
|
56
|
+
docker.expect("build -t apollo-database tmp") do
|
57
|
+
dockerfile = File.read(File.join('tmp', 'Dockerfile'))
|
58
|
+
expected = File.read(File.join('spec', 'fixtures', 'database-dockerfile-mysql'))
|
59
|
+
expect(dockerfile).to eq expected
|
60
|
+
end
|
61
|
+
subject.run
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
data/spec/plugins/rails_spec.rb
CHANGED
@@ -5,83 +5,135 @@ describe RubyYacht::Plugins::Rails do
|
|
5
5
|
RubyYacht.configuration.clear
|
6
6
|
described_class.load
|
7
7
|
end
|
8
|
+
|
9
|
+
def configure_project(options = {})
|
10
|
+
RubyYacht.configuration.clear
|
11
|
+
RubyYacht::Plugins::Rails.load
|
8
12
|
|
9
|
-
it "adds rails to the app type list" do
|
10
|
-
expect(RubyYacht.configuration.app_types.map(&:name)).to include :rails
|
11
|
-
end
|
12
|
-
|
13
|
-
it "adds attributes for the rails environment and secret key" do
|
14
13
|
RubyYacht.configure do
|
15
14
|
project :test_project do
|
16
15
|
system_prefix :test_project
|
17
16
|
domain 'test.com'
|
18
17
|
repository 'github.com'
|
19
|
-
rails_secret_key_base
|
20
|
-
|
21
|
-
|
22
|
-
host 'localhost'
|
23
|
-
name 'test'
|
24
|
-
password 'test'
|
25
|
-
username 'test'
|
26
|
-
end
|
18
|
+
rails_secret_key_base(options[:secret_key_base]) if options[:secret_key_base]
|
19
|
+
rails_environment(options[:environment]) if options[:environment]
|
20
|
+
rails_excluded_gem_groups(options[:excluded_gem_groups]) if options[:excluded_gem_groups]
|
27
21
|
end
|
28
22
|
end
|
23
|
+
end
|
29
24
|
|
25
|
+
it "adds rails to the app type list" do
|
26
|
+
expect(RubyYacht.configuration.server_types.map(&:name)).to include :rails
|
27
|
+
end
|
28
|
+
|
29
|
+
it "adds an attribute for the rails environment" do
|
30
|
+
configure_project(secret_key_base: 'abc', environment: 'production')
|
31
|
+
project = RubyYacht.configuration.projects.last
|
32
|
+
expect(project.rails_environment).to eq 'production'
|
33
|
+
|
34
|
+
configure_project(secret_key_base: 'abc')
|
30
35
|
project = RubyYacht.configuration.projects.last
|
31
36
|
expect(project.rails_environment).to eq 'development'
|
37
|
+
end
|
38
|
+
|
39
|
+
it "adds an attribute for the rails secret key" do
|
40
|
+
configure_project(secret_key_base: 'abc')
|
41
|
+
project = RubyYacht.configuration.projects.last
|
32
42
|
expect(project.rails_secret_key_base).to eq 'abc'
|
33
43
|
end
|
44
|
+
|
45
|
+
it "adds an attribute for the rails excluded gem groups" do
|
46
|
+
configure_project(secret_key_base: 'abc', excluded_gem_groups: %w(development test))
|
47
|
+
project = RubyYacht.configuration.projects.last
|
48
|
+
expect(project.rails_excluded_gem_groups).to eq %w(development test)
|
49
|
+
|
50
|
+
RubyYacht.configuration.clear
|
51
|
+
configure_project(secret_key_base: 'abc')
|
52
|
+
project = RubyYacht.configuration.projects.last
|
53
|
+
expect(project.rails_excluded_gem_groups).to eq []
|
54
|
+
end
|
34
55
|
|
35
|
-
it "sets environment variables for the RAILS_ENV
|
56
|
+
it "sets an environment variables for the RAILS_ENV" do
|
57
|
+
@project = RubyYacht::Project.new
|
58
|
+
@project.rails_environment = 'staging'
|
59
|
+
variables = RubyYacht.configuration.find_server_type(:rails).environment_variables
|
60
|
+
variable = variables.find { |v| v[:name] == 'RAILS_ENV' }
|
61
|
+
|
62
|
+
expect(variable).not_to be_nil
|
63
|
+
expect(variable[:image]).to eq :app_dependencies
|
64
|
+
expect(instance_eval(&variable[:block])).to eq 'staging'
|
65
|
+
end
|
66
|
+
|
67
|
+
it "sets an environment variable for the SECRET_KEY_BASE" do
|
36
68
|
@project = RubyYacht::Project.new
|
37
|
-
@project.rails_environment = 'development'
|
38
69
|
@project.rails_secret_key_base = 'abc'
|
39
|
-
variables = RubyYacht.configuration.
|
40
|
-
|
41
|
-
|
42
|
-
expect(
|
43
|
-
expect(
|
44
|
-
expect(instance_eval(&
|
45
|
-
|
46
|
-
|
47
|
-
|
70
|
+
variables = RubyYacht.configuration.find_server_type(:rails).environment_variables
|
71
|
+
variable = variables.find { |v| v[:name] == 'SECRET_KEY_BASE' }
|
72
|
+
|
73
|
+
expect(variable).not_to be_nil
|
74
|
+
expect(variable[:image]).to eq :app
|
75
|
+
expect(instance_eval(&variable[:block])).to eq 'abc'
|
76
|
+
end
|
77
|
+
|
78
|
+
it "sets an environment variable for the EXCLUDED_GEM_GROUPS" do
|
79
|
+
@project = RubyYacht::Project.new
|
80
|
+
@project.rails_excluded_gem_groups = %w(assets doc)
|
81
|
+
variables = RubyYacht.configuration.find_server_type(:rails).environment_variables
|
82
|
+
variable = variables.find { |v| v[:name] == 'EXCLUDED_GEM_GROUPS' }
|
83
|
+
|
84
|
+
expect(variable).not_to be_nil
|
85
|
+
expect(variable[:image]).to eq :app_dependencies
|
86
|
+
expect(instance_eval(&variable[:block])).to eq 'assets doc'
|
87
|
+
end
|
88
|
+
|
89
|
+
context "with no gem groups excluded" do
|
90
|
+
it "sets an empty string for the EXCLUDED_GEM_GROUPS environment variable" do
|
91
|
+
@project = RubyYacht::Project.new
|
92
|
+
@project.rails_excluded_gem_groups = []
|
93
|
+
variables = RubyYacht.configuration.find_server_type(:rails).environment_variables
|
94
|
+
variable = variables.find { |v| v[:name] == 'EXCLUDED_GEM_GROUPS' }
|
95
|
+
|
96
|
+
expect(variable).not_to be_nil
|
97
|
+
expect(variable[:image]).to eq :app_dependencies
|
98
|
+
expect(instance_eval(&variable[:block])).to eq '""'
|
99
|
+
end
|
48
100
|
end
|
49
101
|
|
50
|
-
it "creates a during-install-libraries hook for
|
102
|
+
it "creates a during-install-libraries hook for installing the gems" do
|
51
103
|
hooks = RubyYacht.configuration.fetch_hooks(event_time: :during, event_type: :install_libraries)
|
52
104
|
expect(hooks.count).to eq 1
|
53
105
|
expect(hooks[0].command).to eq '/var/docker/install_gems.rb'
|
54
|
-
expect(hooks[0].
|
106
|
+
expect(hooks[0].server_type).to eq :rails
|
55
107
|
end
|
56
108
|
|
57
109
|
it "creates an after-build-checkout hook for cleaning the gems" do
|
58
110
|
hooks = RubyYacht.configuration.fetch_hooks(event_time: :after, event_type: :build_checkout)
|
59
111
|
expect(hooks.count).to eq 1
|
60
|
-
expect(hooks[0].command).to eq 'bundle install
|
61
|
-
expect(hooks[0].
|
112
|
+
expect(hooks[0].command).to eq 'bundle install --clean'
|
113
|
+
expect(hooks[0].server_type).to eq :rails
|
62
114
|
end
|
63
115
|
|
64
116
|
it "creates a during-load-seeds hook for loading the seeds" do
|
65
117
|
hooks = RubyYacht.configuration.fetch_hooks(event_time: :during, event_type: :load_database_seeds)
|
66
118
|
expect(hooks.count).to eq 1
|
67
119
|
expect(hooks[0].command).to eq '/var/docker/load_seeds.rb'
|
68
|
-
expect(hooks[0].
|
120
|
+
expect(hooks[0].server_type).to eq :rails
|
69
121
|
end
|
70
122
|
|
71
123
|
it "creates before-startup hooks for updating the config and preparing the app for launch" do
|
72
124
|
hooks = RubyYacht.configuration.fetch_hooks(event_time: :before, event_type: :startup)
|
73
125
|
expect(hooks.count).to eq 2
|
74
126
|
expect(hooks[0].command).to eq '/var/docker/update_rails_config.rb'
|
75
|
-
expect(hooks[0].
|
127
|
+
expect(hooks[0].server_type).to eq :rails
|
76
128
|
expect(hooks[1].command).to eq '/var/docker/prepare_rails_for_launch.rb'
|
77
|
-
expect(hooks[1].
|
129
|
+
expect(hooks[1].server_type).to eq :rails
|
78
130
|
end
|
79
131
|
|
80
132
|
it "creates a during-startup hook for starting the server" do
|
81
133
|
hooks = RubyYacht.configuration.fetch_hooks(event_time: :during, event_type: :startup)
|
82
134
|
expect(hooks.count).to eq 1
|
83
135
|
expect(hooks[0].command).to eq 'rails s -b 0.0.0.0 -p $APP_PORT -e $RAILS_ENV'
|
84
|
-
expect(hooks[0].
|
136
|
+
expect(hooks[0].server_type).to eq :rails
|
85
137
|
end
|
86
138
|
|
87
139
|
describe "building images" do
|
@@ -92,6 +144,13 @@ describe RubyYacht::Plugins::Rails do
|
|
92
144
|
RubyYacht.configuration.clear
|
93
145
|
described_class.load
|
94
146
|
|
147
|
+
RubyYacht.configure do
|
148
|
+
server_type :sqlite do
|
149
|
+
container_type :database
|
150
|
+
baseline_image 'ubuntu'
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
95
154
|
RubyYacht.configure do
|
96
155
|
project :apollo do
|
97
156
|
system_prefix :apollo
|
@@ -99,19 +158,20 @@ describe RubyYacht::Plugins::Rails do
|
|
99
158
|
repository "github.com"
|
100
159
|
rails_secret_key_base 'abc'
|
101
160
|
|
102
|
-
|
161
|
+
sqlite_database :apollo do
|
103
162
|
host "db.test.com"
|
104
|
-
name "apollo"
|
105
163
|
username "apollo"
|
106
164
|
password "test"
|
107
165
|
end
|
108
166
|
|
109
167
|
rails_app :mars do
|
110
168
|
repository_name 'brownleej/mars'
|
169
|
+
database_name :apollo
|
111
170
|
end
|
112
171
|
|
113
172
|
rails_app :saturn do
|
114
173
|
repository_name 'brownleej/saturn'
|
174
|
+
database_name :apollo
|
115
175
|
end
|
116
176
|
end
|
117
177
|
end
|
@@ -180,18 +240,18 @@ describe RubyYacht::Plugins::Rails do
|
|
180
240
|
|
181
241
|
context "with a local database" do
|
182
242
|
before do
|
183
|
-
RubyYacht.configuration.projects
|
243
|
+
RubyYacht.configuration.projects.first.databases.first.host = 'localhost'
|
184
244
|
end
|
185
245
|
|
186
246
|
it "generates the dockerfiles for the database server" do
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
247
|
+
docker.expect "build -t apollo-database tmp" do
|
248
|
+
files = Dir[File.join("tmp", "*")].sort
|
249
|
+
expect(files).to eq ['tmp/Dockerfile', 'tmp/Dockerfile.erb', 'tmp/checkout.bash', 'tmp/install_gems.rb', 'tmp/load_seeds.rb']
|
250
|
+
dockerfile = File.read(File.join('tmp', 'Dockerfile'))
|
251
|
+
expected = File.read(File.join('spec', 'fixtures', 'database-dockerfile-rails'))
|
252
|
+
expect(dockerfile).to eq expected
|
253
|
+
end
|
254
|
+
subject.run
|
195
255
|
end
|
196
256
|
end
|
197
257
|
end
|
@@ -77,13 +77,39 @@ describe RubyYacht::Runner::BuildImages do
|
|
77
77
|
|
78
78
|
context "with a local database" do
|
79
79
|
before do
|
80
|
-
RubyYacht.
|
80
|
+
RubyYacht.configure do
|
81
|
+
server_type :sqlite do
|
82
|
+
container_type :database
|
83
|
+
baseline_image 'ubuntu'
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
database = RubyYacht::Database.new
|
88
|
+
database.name = 'apollo'
|
89
|
+
database.server_type = :sqlite
|
90
|
+
database.container_label = 'mysql'
|
91
|
+
database.username = 'apollo'
|
92
|
+
database.password = 'test'
|
93
|
+
database.host = 'localhost'
|
94
|
+
RubyYacht.configuration.projects.first.databases << database
|
95
|
+
RubyYacht.configuration.projects.first.apps.first.database_name = 'apollo'
|
96
|
+
end
|
97
|
+
|
98
|
+
it "builds an app dockerfile with the database config" do
|
99
|
+
docker.expect("build -t apollo-mars tmp") do
|
100
|
+
files = Dir[File.join("tmp", "*")].sort
|
101
|
+
expect(files).to eq ['tmp/Dockerfile', 'tmp/Dockerfile.erb', 'tmp/before_startup.bash', 'tmp/before_startup.bash.erb', 'tmp/checkout.bash', 'tmp/startup.bash', 'tmp/startup.bash.erb']
|
102
|
+
dockerfile = File.read(File.join('tmp', 'Dockerfile'))
|
103
|
+
expected = File.read(File.join('spec', 'fixtures', 'mars-dockerfile-with-local-database'))
|
104
|
+
expect(dockerfile).to eq expected
|
105
|
+
end
|
106
|
+
subject.run
|
81
107
|
end
|
82
108
|
|
83
109
|
it "builds the database" do
|
84
|
-
docker.expect("build -t apollo-
|
110
|
+
docker.expect("build -t apollo-mysql tmp") do
|
85
111
|
files = Dir[File.join("tmp", "*")].sort
|
86
|
-
expect(files).to eq ['tmp/Dockerfile', 'tmp/Dockerfile.erb', 'tmp/checkout.bash'
|
112
|
+
expect(files).to eq ['tmp/Dockerfile', 'tmp/Dockerfile.erb', 'tmp/checkout.bash']
|
87
113
|
dockerfile = File.read(File.join('tmp', 'Dockerfile'))
|
88
114
|
expected = File.read(File.join('spec', 'fixtures', 'database-dockerfile'))
|
89
115
|
expect(dockerfile).to eq expected
|
@@ -101,22 +127,22 @@ describe RubyYacht::Runner::BuildImages do
|
|
101
127
|
before do
|
102
128
|
script_folder = self.script_folder
|
103
129
|
RubyYacht.configure do
|
104
|
-
add_hooks folder: script_folder,
|
130
|
+
add_hooks folder: script_folder, server_type: :generic do
|
105
131
|
during(:load_database_seeds) { run_script 'hook1.rb' }
|
106
132
|
end
|
107
133
|
end
|
108
134
|
end
|
109
135
|
|
110
136
|
it "copies the files for the hooks to the database" do
|
111
|
-
docker.expect("build -t apollo-
|
137
|
+
docker.expect("build -t apollo-mysql tmp") do
|
112
138
|
files = Dir[File.join("tmp", "*")].sort
|
113
|
-
expect(files).to eq ['tmp/Dockerfile', 'tmp/Dockerfile.erb', 'tmp/checkout.bash', 'tmp/hook1.rb'
|
139
|
+
expect(files).to eq ['tmp/Dockerfile', 'tmp/Dockerfile.erb', 'tmp/checkout.bash', 'tmp/hook1.rb']
|
114
140
|
end
|
115
141
|
subject.run
|
116
142
|
end
|
117
143
|
|
118
144
|
it "includes the scripts in the database dockerfile" do
|
119
|
-
docker.expect("build -t apollo-
|
145
|
+
docker.expect("build -t apollo-mysql tmp") do
|
120
146
|
dockerfile = File.read(File.join('tmp', 'Dockerfile'))
|
121
147
|
expected = File.read(File.join('spec', 'fixtures', 'database-dockerfile-with-seed-hooks'))
|
122
148
|
expect(dockerfile).to eq expected
|
@@ -125,6 +151,42 @@ describe RubyYacht::Runner::BuildImages do
|
|
125
151
|
end
|
126
152
|
end
|
127
153
|
end
|
154
|
+
|
155
|
+
context 'with a non-local database' do
|
156
|
+
before do
|
157
|
+
database = RubyYacht::Database.new
|
158
|
+
database.name = 'apollo'
|
159
|
+
database.server_type = 'mysql'
|
160
|
+
database.container_label = 'mysql'
|
161
|
+
database.username = 'apollo'
|
162
|
+
database.password = 'test'
|
163
|
+
database.host = 'db1.test.com'
|
164
|
+
RubyYacht.configuration.projects.first.databases << database
|
165
|
+
RubyYacht.configuration.projects.first.apps.first.database_name = 'apollo'
|
166
|
+
end
|
167
|
+
|
168
|
+
it "builds an app dockerfile with the database config" do
|
169
|
+
docker.expect("build -t apollo-mars tmp") do
|
170
|
+
files = Dir[File.join("tmp", "*")].sort
|
171
|
+
expect(files).to eq ['tmp/Dockerfile', 'tmp/Dockerfile.erb', 'tmp/before_startup.bash', 'tmp/before_startup.bash.erb', 'tmp/checkout.bash', 'tmp/startup.bash', 'tmp/startup.bash.erb']
|
172
|
+
dockerfile = File.read(File.join('tmp', 'Dockerfile'))
|
173
|
+
expected = File.read(File.join('spec', 'fixtures', 'mars-dockerfile-with-remote-database'))
|
174
|
+
expect(dockerfile).to eq expected
|
175
|
+
end
|
176
|
+
subject.run
|
177
|
+
end
|
178
|
+
|
179
|
+
it "does not build an image for the database" do
|
180
|
+
docker.fail_unexpected_commands!
|
181
|
+
docker.expect "network create apollo 2> /dev/null"
|
182
|
+
docker.expect "build -t apollo-generic-app-dependencies tmp"
|
183
|
+
docker.expect "build -t apollo-debian-app-dependencies tmp"
|
184
|
+
docker.expect "build -t apollo-mars tmp"
|
185
|
+
docker.expect "build -t apollo-saturn tmp"
|
186
|
+
docker.expect "build -t apollo-web tmp"
|
187
|
+
subject.run
|
188
|
+
end
|
189
|
+
end
|
128
190
|
|
129
191
|
context "with an id_rsa key" do
|
130
192
|
let(:id_file_path) { File.join(ENV['HOME'], '.ssh', 'id_rsa') }
|
@@ -164,7 +226,7 @@ describe RubyYacht::Runner::BuildImages do
|
|
164
226
|
RubyYacht.configuration.projects[0].primary_app = :mars
|
165
227
|
end
|
166
228
|
|
167
|
-
it "includes that app
|
229
|
+
it "includes that app as the primary in the web server dockerfile" do
|
168
230
|
docker.expect "build -t apollo-web tmp" do
|
169
231
|
files = Dir[File.join("tmp", "*")].sort
|
170
232
|
expect(files).to eq ['tmp/Dockerfile', 'tmp/Dockerfile.erb', 'tmp/add_app.rb', 'tmp/add_project.rb', 'tmp/app_config.erb', 'tmp/index.html.erb', 'tmp/index_config.erb']
|
@@ -175,6 +237,34 @@ describe RubyYacht::Runner::BuildImages do
|
|
175
237
|
subject.run
|
176
238
|
end
|
177
239
|
end
|
240
|
+
|
241
|
+
context "with an app with the same name as the system" do
|
242
|
+
before do
|
243
|
+
RubyYacht.configuration.projects[0].apps[0].name = :apollo
|
244
|
+
end
|
245
|
+
|
246
|
+
it "builds all the images for the project" do
|
247
|
+
docker.fail_unexpected_commands!
|
248
|
+
docker.expect "network create apollo 2> /dev/null"
|
249
|
+
docker.expect "build -t apollo-generic-app-dependencies tmp"
|
250
|
+
docker.expect "build -t apollo-debian-app-dependencies tmp"
|
251
|
+
docker.expect "build -t apollo tmp"
|
252
|
+
docker.expect "build -t apollo-saturn tmp"
|
253
|
+
docker.expect "build -t apollo-web tmp"
|
254
|
+
subject.run
|
255
|
+
end
|
256
|
+
|
257
|
+
it "includes that app as the primary in the web server dockerfile" do
|
258
|
+
docker.expect "build -t apollo-web tmp" do
|
259
|
+
files = Dir[File.join("tmp", "*")].sort
|
260
|
+
expect(files).to eq ['tmp/Dockerfile', 'tmp/Dockerfile.erb', 'tmp/add_app.rb', 'tmp/add_project.rb', 'tmp/app_config.erb', 'tmp/index.html.erb', 'tmp/index_config.erb']
|
261
|
+
dockerfile = File.read(File.join('tmp', 'Dockerfile'))
|
262
|
+
expected = File.read(File.join('spec', 'fixtures', 'web-dockerfile-with-eponymous-app'))
|
263
|
+
expect(dockerfile).to eq expected
|
264
|
+
end
|
265
|
+
subject.run
|
266
|
+
end
|
267
|
+
end
|
178
268
|
|
179
269
|
context "with multiple projects" do
|
180
270
|
before do
|
@@ -216,7 +306,7 @@ describe RubyYacht::Runner::BuildImages do
|
|
216
306
|
before do
|
217
307
|
script_folder = self.script_folder
|
218
308
|
RubyYacht.configure do
|
219
|
-
add_hooks folder: script_folder,
|
309
|
+
add_hooks folder: script_folder, server_type: :generic do
|
220
310
|
before(:startup) { run_script 'hook1.rb' }
|
221
311
|
before(:startup) { run_script 'hook2.rb' }
|
222
312
|
end
|
@@ -256,7 +346,7 @@ describe RubyYacht::Runner::BuildImages do
|
|
256
346
|
before do
|
257
347
|
script_folder = self.script_folder
|
258
348
|
RubyYacht.configure do
|
259
|
-
add_hooks folder: script_folder,
|
349
|
+
add_hooks folder: script_folder, server_type: :generic do
|
260
350
|
after(:build_checkout) { run_script 'hook1.rb' }
|
261
351
|
end
|
262
352
|
end
|
@@ -294,7 +384,7 @@ describe RubyYacht::Runner::BuildImages do
|
|
294
384
|
before do
|
295
385
|
script_folder = self.script_folder
|
296
386
|
RubyYacht.configure do
|
297
|
-
add_hooks folder: script_folder,
|
387
|
+
add_hooks folder: script_folder, server_type: :generic do
|
298
388
|
during(:install_libraries) { run_script 'hook2.rb' }
|
299
389
|
end
|
300
390
|
end
|
@@ -326,5 +416,46 @@ describe RubyYacht::Runner::BuildImages do
|
|
326
416
|
subject.run
|
327
417
|
end
|
328
418
|
end
|
419
|
+
|
420
|
+
context "with hooks for copying custom files" do
|
421
|
+
let(:script_folder) { File.join(File.dirname(File.dirname(__FILE__)), 'fixtures', 'hooks') }
|
422
|
+
before do
|
423
|
+
script_folder = self.script_folder
|
424
|
+
RubyYacht.configure do
|
425
|
+
add_hooks folder: script_folder, server_type: :generic do
|
426
|
+
before :startup do
|
427
|
+
copy_file "hook1.rb"
|
428
|
+
command "cp /var/docker/hook1.rb /var/code/scripts/hook1.rb"
|
429
|
+
end
|
430
|
+
end
|
431
|
+
end
|
432
|
+
end
|
433
|
+
|
434
|
+
it "copies the scripts to the tmp directory" do
|
435
|
+
docker.expect("build -t apollo-mars tmp") do
|
436
|
+
files = Dir[File.join('tmp', '*')]
|
437
|
+
expect(files).to include 'tmp/hook1.rb'
|
438
|
+
end
|
439
|
+
subject.run
|
440
|
+
end
|
441
|
+
|
442
|
+
it "builds a before_startup script that copies the file" do
|
443
|
+
docker.expect("build -t apollo-mars tmp") do
|
444
|
+
dockerfile = File.read(File.join('tmp', 'before_startup.bash'))
|
445
|
+
expected = File.read(File.join('spec', 'fixtures', 'mars-before-startup-with-custom-file-copy'))
|
446
|
+
expect(dockerfile).to eq expected
|
447
|
+
end
|
448
|
+
subject.run
|
449
|
+
end
|
450
|
+
|
451
|
+
it "builds a dockerfile that copies the file to the /var/docker directory" do
|
452
|
+
docker.expect("build -t apollo-mars tmp") do
|
453
|
+
startup = File.read(File.join('tmp', 'Dockerfile'))
|
454
|
+
expected = File.read(File.join('spec', 'fixtures', 'mars-dockerfile-with-custom-file-copy'))
|
455
|
+
expect(startup).to eq expected
|
456
|
+
end
|
457
|
+
subject.run
|
458
|
+
end
|
459
|
+
end
|
329
460
|
end
|
330
461
|
end
|
@@ -30,7 +30,7 @@ describe RubyYacht::Runner::Checkout do
|
|
30
30
|
|
31
31
|
it "takes the app and checkout from the command line" do
|
32
32
|
subject.parse_positional_arguments(['venus', 'issue1234'])
|
33
|
-
expect(subject.
|
33
|
+
expect(subject.app_name).to eq 'venus'
|
34
34
|
expect(subject.branch).to eq 'issue1234'
|
35
35
|
end
|
36
36
|
end
|
@@ -38,7 +38,7 @@ describe RubyYacht::Runner::Checkout do
|
|
38
38
|
|
39
39
|
describe "run behavior" do
|
40
40
|
before do
|
41
|
-
subject.
|
41
|
+
subject.app_name = 'saturn'
|
42
42
|
subject.branch = 'issue1234'
|
43
43
|
end
|
44
44
|
|
@@ -61,7 +61,7 @@ describe RubyYacht::Runner::Checkout do
|
|
61
61
|
end
|
62
62
|
|
63
63
|
it "runs the command in that project" do
|
64
|
-
subject.
|
64
|
+
subject.app_name = 'venus'
|
65
65
|
docker.fail_unexpected_commands!
|
66
66
|
docker.expect "exec jupiter-venus bash -c 'cd /var/code; git fetch; git checkout .; git checkout issue1234; git pull'"
|
67
67
|
docker.expect "exec jupiter-venus /var/docker/before_startup.bash"
|
@@ -91,7 +91,7 @@ describe RubyYacht::Runner::Checkout do
|
|
91
91
|
|
92
92
|
context "with no app" do
|
93
93
|
before do
|
94
|
-
subject.
|
94
|
+
subject.app_name = nil
|
95
95
|
end
|
96
96
|
|
97
97
|
it "logs an error" do
|
@@ -34,11 +34,16 @@ describe RubyYacht::Runner::RunContainers do
|
|
34
34
|
|
35
35
|
context "with a local database" do
|
36
36
|
before do
|
37
|
-
|
37
|
+
database = RubyYacht::Database.new
|
38
|
+
database.name = 'apollo'
|
39
|
+
database.server_type = 'mysql'
|
40
|
+
database.container_label = 'mysql'
|
41
|
+
database.host = 'localhost'
|
42
|
+
RubyYacht.configuration.projects.first.databases << database
|
38
43
|
end
|
39
44
|
|
40
45
|
it "runs the database container" do
|
41
|
-
docker.expect 'run -d --net=apollo --net-alias=apollo-
|
46
|
+
docker.expect 'run -d --net=apollo --net-alias=apollo-mysql --name=apollo-mysql apollo-mysql'
|
42
47
|
subject.run
|
43
48
|
end
|
44
49
|
|
@@ -100,6 +105,20 @@ describe RubyYacht::Runner::RunContainers do
|
|
100
105
|
expect(subject.run).to be_truthy
|
101
106
|
end
|
102
107
|
end
|
108
|
+
|
109
|
+
context "with an app with the same name as the project" do
|
110
|
+
before do
|
111
|
+
RubyYacht.configuration.projects.first.apps.first.name = :apollo
|
112
|
+
end
|
113
|
+
|
114
|
+
it "runs the containers for all the apps" do
|
115
|
+
docker.fail_unexpected_commands!
|
116
|
+
docker.expect 'run -d --net=apollo --net-alias=apollo --name=apollo apollo'
|
117
|
+
docker.expect 'run -d --net=apollo --net-alias=apollo-saturn --name=apollo-saturn apollo-saturn'
|
118
|
+
docker.expect 'run -d -p 80:80 --net=apollo --net-alias=apollo-web --name=apollo-web apollo-web'
|
119
|
+
subject.run
|
120
|
+
end
|
121
|
+
end
|
103
122
|
end
|
104
123
|
|
105
124
|
describe "remove_container" do
|
data/spec/runner/runner_spec.rb
CHANGED
@@ -37,7 +37,7 @@ describe RubyYacht::Runner do
|
|
37
37
|
|
38
38
|
it "calls the command" do
|
39
39
|
expect(command.project_name).to eq :apollo
|
40
|
-
expect(command.
|
40
|
+
expect(command.app_name).to eq 'mars'
|
41
41
|
expect(command.branch).to eq 'issue1234'
|
42
42
|
expect(command).to have_received(:run)
|
43
43
|
end
|
@@ -39,11 +39,16 @@ describe RubyYacht::Runner::Services do
|
|
39
39
|
|
40
40
|
context "with a local database" do
|
41
41
|
before do
|
42
|
-
|
42
|
+
database = RubyYacht::Database.new
|
43
|
+
database.name = 'apollo'
|
44
|
+
database.server_type = 'mysql'
|
45
|
+
database.container_label = 'mysql'
|
46
|
+
database.host = 'localhost'
|
47
|
+
RubyYacht.configuration.projects.first.databases << database
|
43
48
|
end
|
44
49
|
|
45
50
|
it "stops the database" do
|
46
|
-
docker.expect 'stop apollo-
|
51
|
+
docker.expect 'stop apollo-mysql'
|
47
52
|
subject.run
|
48
53
|
end
|
49
54
|
|