ruby_yacht 0.3.0 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
|