ruby_yacht 0.6.1 → 0.7.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.
Files changed (80) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +1 -1
  3. data/README.md +7 -5
  4. data/doc/TODO.md +1 -5
  5. data/doc/configuration.md +51 -0
  6. data/doc/plugins.md +4 -0
  7. data/lib/ruby_yacht/dsl/configuration.rb +26 -1
  8. data/lib/ruby_yacht/dsl/dsl.rb +35 -3
  9. data/lib/ruby_yacht/dsl/hook.rb +4 -0
  10. data/lib/ruby_yacht/dsl/project.rb +11 -0
  11. data/lib/ruby_yacht/images/app/Dockerfile.erb +2 -1
  12. data/lib/ruby_yacht/images/app/checkout.bash +1 -1
  13. data/lib/ruby_yacht/images/app-dependencies/Dockerfile.erb +7 -1
  14. data/lib/ruby_yacht/images/database/Dockerfile.erb +3 -1
  15. data/lib/ruby_yacht/images/database/checkout.bash +3 -4
  16. data/lib/ruby_yacht/images/web/Dockerfile.erb +2 -0
  17. data/lib/ruby_yacht/plugins/nginx.rb +5 -0
  18. data/lib/ruby_yacht/plugins/rails/scripts/load_seeds.rb +10 -1
  19. data/lib/ruby_yacht/plugins/rails/scripts/prepare_rails_for_launch.rb +1 -1
  20. data/lib/ruby_yacht/plugins/rails/scripts/update_rails_config.rb +6 -4
  21. data/lib/ruby_yacht/plugins/rails.rb +30 -17
  22. data/lib/ruby_yacht/plugins.rb +1 -1
  23. data/lib/ruby_yacht/runner/build_images.rb +5 -7
  24. data/lib/ruby_yacht/runner/run_containers.rb +1 -2
  25. data/ruby_yacht.gemspec +2 -2
  26. data/spec/docker/run.bash +4 -0
  27. data/spec/dsl/configuration_spec.rb +29 -0
  28. data/spec/dsl/dsl_spec.rb +56 -0
  29. data/spec/dsl/hook_spec.rb +28 -5
  30. data/spec/dsl/project_spec.rb +46 -0
  31. data/spec/dsl/server_type_spec.rb +3 -0
  32. data/spec/fixtures/app-dependencies-dockerfile-generic +3 -1
  33. data/spec/fixtures/app-dependencies-dockerfile-generic-with-library-install +3 -1
  34. data/spec/fixtures/app-dependencies-dockerfile-rails +4 -3
  35. data/spec/fixtures/app-dependencies-dockerfile-rails-production +35 -0
  36. data/spec/fixtures/app-dependencies-dockerfile-with-https-repository +25 -0
  37. data/spec/fixtures/app-dependencies-dockerfile-with-no-repository +2 -0
  38. data/spec/fixtures/database-dockerfile +1 -1
  39. data/spec/fixtures/database-dockerfile-mysql +1 -1
  40. data/spec/fixtures/database-dockerfile-rails +2 -6
  41. data/spec/fixtures/database-dockerfile-rails-mysql +38 -0
  42. data/spec/fixtures/database-dockerfile-rails-with-no-repository +1 -3
  43. data/spec/fixtures/database-dockerfile-with-seed-hooks +1 -1
  44. data/spec/fixtures/local_config.yml +8 -0
  45. data/spec/fixtures/mars-dockerfile +0 -1
  46. data/spec/fixtures/mars-dockerfile-rails +0 -1
  47. data/spec/fixtures/mars-dockerfile-rails-with-no-repository +0 -1
  48. data/spec/fixtures/mars-dockerfile-with-after-checkout-hooks +0 -1
  49. data/spec/fixtures/mars-dockerfile-with-before-startup-hooks +0 -1
  50. data/spec/fixtures/mars-dockerfile-with-custom-file-copy +0 -1
  51. data/spec/fixtures/mars-dockerfile-with-local-database +0 -1
  52. data/spec/fixtures/mars-dockerfile-with-no-repository +0 -1
  53. data/spec/fixtures/mars-dockerfile-with-remote-database +0 -1
  54. data/spec/fixtures/mars-startup-rails +1 -1
  55. data/spec/fixtures/mars-startup-rails-with-no-repository +1 -1
  56. data/spec/fixtures/web-dockerfile-nginx +3 -0
  57. data/spec/integration/01_normal_config_spec.rb +352 -0
  58. data/spec/integration/{create_new_project_spec.rb → 02_creating_new_project_spec.rb} +2 -2
  59. data/spec/integration/03_no_repository_spec.rb +56 -0
  60. data/spec/integration/04_no_database_spec.rb +58 -0
  61. data/spec/integration/05_https_repository_spec.rb +52 -0
  62. data/spec/integration/06_production_environment_spec.rb +72 -0
  63. data/spec/integration/07_local_checkout_spec.rb +52 -0
  64. data/spec/integration/08_multiple_projects_spec.rb +46 -0
  65. data/spec/integration/09_titular_app_spec.rb +53 -0
  66. data/spec/integration/10_misc_scenarios_spec.rb +97 -0
  67. data/spec/integration/run.rb +18 -2
  68. data/spec/plugins/rails_spec.rb +73 -16
  69. data/spec/runner/build_images_spec.rb +17 -1
  70. data/spec/runner/run_containers_spec.rb +3 -3
  71. data/spec/support/integration_helpers.rb +18 -4
  72. metadata +30 -20
  73. data/spec/integration/build_images_spec.rb +0 -210
  74. data/spec/integration/build_spec.rb +0 -23
  75. data/spec/integration/checkout_spec.rb +0 -94
  76. data/spec/integration/implode_spec.rb +0 -20
  77. data/spec/integration/run_containers_spec.rb +0 -279
  78. data/spec/integration/services_spec.rb +0 -99
  79. data/spec/integration/shell_spec.rb +0 -31
  80. data/spec/integration/update_hosts_spec.rb +0 -35
@@ -6,6 +6,8 @@
6
6
 
7
7
  FROM ubuntu
8
8
 
9
+ ENV REPOSITORY_HOST ssh://git@github.com
10
+
9
11
  RUN mkdir -p /root/.ssh
10
12
  COPY id_rsa /root/.ssh
11
13
  RUN ssh-keyscan github.com >> /root/.ssh/known_hosts
@@ -15,7 +17,7 @@ RUN mkdir -p /var/code/
15
17
 
16
18
  RUN apt-get update && apt-get upgrade -y
17
19
 
18
- RUN git clone git@github.com:brownleej/mars /var/code/mars
20
+ RUN git clone $REPOSITORY_HOST/brownleej/mars /var/code/mars
19
21
  WORKDIR /var/code/mars
20
22
 
21
23
  RUN rm -f /var/docker/*
@@ -6,6 +6,8 @@
6
6
 
7
7
  FROM ubuntu
8
8
 
9
+ ENV REPOSITORY_HOST ssh://git@github.com
10
+
9
11
  RUN mkdir -p /root/.ssh
10
12
  COPY id_rsa /root/.ssh
11
13
  RUN ssh-keyscan github.com >> /root/.ssh/known_hosts
@@ -15,7 +17,7 @@ RUN mkdir -p /var/code/
15
17
 
16
18
  RUN apt-get update && apt-get upgrade -y
17
19
 
18
- RUN git clone git@github.com:brownleej/mars /var/code/mars
20
+ RUN git clone $REPOSITORY_HOST/brownleej/mars /var/code/mars
19
21
  WORKDIR /var/code/mars
20
22
  COPY hook2.rb /var/docker/
21
23
  RUN ruby /var/docker/hook2.rb
@@ -6,7 +6,8 @@
6
6
 
7
7
  FROM ruby:2.3
8
8
 
9
- ENV RAILS_ENV development
9
+ ENV REPOSITORY_HOST ssh://git@github.com
10
+
10
11
  ENV SECRET_KEY_BASE abc
11
12
  ENV EXCLUDED_GEM_GROUPS ""
12
13
 
@@ -19,12 +20,12 @@ RUN mkdir -p /var/code/
19
20
 
20
21
  RUN apt-get update && apt-get upgrade -y
21
22
 
22
- RUN git clone git@github.com:brownleej/mars /var/code/mars
23
+ RUN git clone $REPOSITORY_HOST/brownleej/mars /var/code/mars
23
24
  WORKDIR /var/code/mars
24
25
  COPY install_gems.rb /var/docker/
25
26
  RUN ruby /var/docker/install_gems.rb
26
27
 
27
- RUN git clone git@github.com:brownleej/saturn /var/code/saturn
28
+ RUN git clone $REPOSITORY_HOST/brownleej/saturn /var/code/saturn
28
29
  WORKDIR /var/code/saturn
29
30
  COPY install_gems.rb /var/docker/
30
31
  RUN ruby /var/docker/install_gems.rb
@@ -0,0 +1,35 @@
1
+ # This Dockerfile creates an image for installing all of the dependencies
2
+ # for all of the apps.
3
+ #
4
+ # This is a slow process, so this should be kept as simple as possible so that
5
+ # it can remain unchanged.
6
+
7
+ FROM ruby:2.3
8
+
9
+ ENV REPOSITORY_HOST ssh://git@github.com
10
+ ENV RAILS_ENV production
11
+ ENV SECRET_KEY_BASE abc
12
+ ENV EXCLUDED_GEM_GROUPS ""
13
+
14
+ RUN mkdir -p /root/.ssh
15
+ COPY id_rsa /root/.ssh
16
+ RUN ssh-keyscan github.com >> /root/.ssh/known_hosts
17
+
18
+ RUN mkdir -p /var/docker/
19
+ RUN mkdir -p /var/code/
20
+
21
+ RUN apt-get update && apt-get upgrade -y
22
+
23
+ RUN git clone $REPOSITORY_HOST/brownleej/mars /var/code/mars
24
+ WORKDIR /var/code/mars
25
+ COPY install_gems.rb /var/docker/
26
+ RUN ruby /var/docker/install_gems.rb
27
+
28
+ RUN git clone $REPOSITORY_HOST/brownleej/saturn /var/code/saturn
29
+ WORKDIR /var/code/saturn
30
+ COPY install_gems.rb /var/docker/
31
+ RUN ruby /var/docker/install_gems.rb
32
+
33
+ RUN rm -f /var/docker/*
34
+
35
+ WORKDIR /
@@ -0,0 +1,25 @@
1
+ # This Dockerfile creates an image for installing all of the dependencies
2
+ # for all of the apps.
3
+ #
4
+ # This is a slow process, so this should be kept as simple as possible so that
5
+ # it can remain unchanged.
6
+
7
+ FROM ubuntu
8
+
9
+ ENV REPOSITORY_HOST https://github.com
10
+
11
+ RUN mkdir -p /root/.ssh
12
+ COPY id_rsa /root/.ssh
13
+ RUN ssh-keyscan github.com >> /root/.ssh/known_hosts
14
+
15
+ RUN mkdir -p /var/docker/
16
+ RUN mkdir -p /var/code/
17
+
18
+ RUN apt-get update && apt-get upgrade -y
19
+
20
+ RUN git clone $REPOSITORY_HOST/brownleej/mars /var/code/mars
21
+ WORKDIR /var/code/mars
22
+
23
+ RUN rm -f /var/docker/*
24
+
25
+ WORKDIR /
@@ -6,6 +6,8 @@
6
6
 
7
7
  FROM ubuntu
8
8
 
9
+ ENV REPOSITORY_HOST ssh://git@github.com
10
+
9
11
  RUN mkdir -p /root/.ssh
10
12
  COPY id_rsa /root/.ssh
11
13
  RUN ssh-keyscan github.com >> /root/.ssh/known_hosts
@@ -10,7 +10,7 @@ COPY startup.bash /var/docker/startup.bash
10
10
 
11
11
  RUN chmod u+x /var/docker/*
12
12
 
13
- RUN /var/docker/checkout.bash github.com mars brownleej/mars
13
+ RUN /var/docker/checkout.bash mars brownleej/mars
14
14
  WORKDIR /var/code/mars
15
15
 
16
16
  RUN rm -r /var/code
@@ -16,7 +16,7 @@ RUN apt-get install -y mysql-server
16
16
  COPY setup.bash /var/docker/
17
17
  RUN bash /var/docker/setup.bash
18
18
 
19
- RUN /var/docker/checkout.bash github.com mars brownleej/mars
19
+ RUN /var/docker/checkout.bash mars brownleej/mars
20
20
  WORKDIR /var/code/mars
21
21
 
22
22
  RUN rm -r /var/code
@@ -10,15 +10,11 @@ COPY startup.bash /var/docker/startup.bash
10
10
 
11
11
  RUN chmod u+x /var/docker/*
12
12
 
13
- RUN /var/docker/checkout.bash github.com mars brownleej/mars
13
+ RUN /var/docker/checkout.bash mars brownleej/mars
14
14
  WORKDIR /var/code/mars
15
- COPY load_seeds.rb /var/docker/
16
- RUN ruby /var/docker/load_seeds.rb
17
15
 
18
- RUN /var/docker/checkout.bash github.com saturn brownleej/saturn
16
+ RUN /var/docker/checkout.bash saturn brownleej/saturn
19
17
  WORKDIR /var/code/saturn
20
- COPY load_seeds.rb /var/docker/
21
- RUN ruby /var/docker/load_seeds.rb
22
18
 
23
19
  RUN rm -r /var/code
24
20
  WORKDIR /
@@ -0,0 +1,38 @@
1
+ FROM apollo-rails-app-dependencies
2
+
3
+ ENV DATABASE_USERNAME apollo
4
+ ENV DATABASE_PASSWORD test
5
+ ENV DATABASE_NAME apollo
6
+ ENV DATABASE_TYPE mysql
7
+
8
+ COPY checkout.bash /var/docker/checkout.bash
9
+ COPY startup.bash /var/docker/startup.bash
10
+
11
+ RUN chmod u+x /var/docker/*
12
+
13
+ ENV DEBIAN_FRONTEND noninteractive
14
+ RUN apt-get install -y mysql-server
15
+
16
+ COPY setup.bash /var/docker/
17
+ RUN bash /var/docker/setup.bash
18
+
19
+ RUN /var/docker/checkout.bash mars brownleej/mars
20
+ WORKDIR /var/code/mars
21
+ COPY load_seeds.rb /var/docker/
22
+ RUN ruby /var/docker/load_seeds.rb
23
+
24
+ RUN /var/docker/checkout.bash saturn brownleej/saturn
25
+ WORKDIR /var/code/saturn
26
+ COPY load_seeds.rb /var/docker/
27
+ RUN ruby /var/docker/load_seeds.rb
28
+
29
+ RUN rm -r /var/code
30
+ WORKDIR /
31
+
32
+ ENV DATABASE_USERNAME ''
33
+ ENV DATABASE_PASSWORD ''
34
+ ENV DATABASE_NAME ''
35
+
36
+ EXPOSE 1234
37
+
38
+ CMD /var/docker/startup.bash
@@ -10,10 +10,8 @@ COPY startup.bash /var/docker/startup.bash
10
10
 
11
11
  RUN chmod u+x /var/docker/*
12
12
 
13
- RUN /var/docker/checkout.bash github.com saturn brownleej/saturn
13
+ RUN /var/docker/checkout.bash saturn brownleej/saturn
14
14
  WORKDIR /var/code/saturn
15
- COPY load_seeds.rb /var/docker/
16
- RUN ruby /var/docker/load_seeds.rb
17
15
 
18
16
  RUN rm -r /var/code
19
17
  WORKDIR /
@@ -10,7 +10,7 @@ COPY startup.bash /var/docker/startup.bash
10
10
 
11
11
  RUN chmod u+x /var/docker/*
12
12
 
13
- RUN /var/docker/checkout.bash github.com mars brownleej/mars
13
+ RUN /var/docker/checkout.bash mars brownleej/mars
14
14
  WORKDIR /var/code/mars
15
15
  COPY hook1.rb /var/docker/
16
16
  RUN ruby /var/docker/hook1.rb
@@ -0,0 +1,8 @@
1
+ :system_prefix: jupiter
2
+ :check_out_locally: true
3
+ :rails_environment: production
4
+ :database:
5
+ :host: localhost
6
+ :name: jupiter_testing
7
+ :username: jupiter
8
+ :password: jupiterpass
@@ -1,7 +1,6 @@
1
1
  FROM apollo-generic-app-dependencies
2
2
 
3
3
  ENV APP_PORT 8080
4
- ENV REPOSITORY_HOST github.com
5
4
  ENV SYSTEM_PREFIX apollo
6
5
  ENV REPOSITORY_NAME brownleej/mars
7
6
 
@@ -7,7 +7,6 @@ ENV DATABASE_USERNAME apollo
7
7
  ENV DATABASE_TYPE sqlite
8
8
  ENV DATABASE_PORT 1234
9
9
  ENV APP_PORT 8080
10
- ENV REPOSITORY_HOST github.com
11
10
  ENV SYSTEM_PREFIX apollo
12
11
  ENV REPOSITORY_NAME brownleej/mars
13
12
 
@@ -7,7 +7,6 @@ ENV DATABASE_USERNAME apollo
7
7
  ENV DATABASE_TYPE sqlite
8
8
  ENV DATABASE_PORT 1234
9
9
  ENV APP_PORT 8080
10
- ENV REPOSITORY_HOST github.com
11
10
  ENV SYSTEM_PREFIX apollo
12
11
 
13
12
  RUN rm -r /var/code
@@ -1,7 +1,6 @@
1
1
  FROM apollo-generic-app-dependencies
2
2
 
3
3
  ENV APP_PORT 8080
4
- ENV REPOSITORY_HOST github.com
5
4
  ENV SYSTEM_PREFIX apollo
6
5
  ENV REPOSITORY_NAME brownleej/mars
7
6
 
@@ -1,7 +1,6 @@
1
1
  FROM apollo-generic-app-dependencies
2
2
 
3
3
  ENV APP_PORT 8080
4
- ENV REPOSITORY_HOST github.com
5
4
  ENV SYSTEM_PREFIX apollo
6
5
  ENV REPOSITORY_NAME brownleej/mars
7
6
 
@@ -1,7 +1,6 @@
1
1
  FROM apollo-generic-app-dependencies
2
2
 
3
3
  ENV APP_PORT 8080
4
- ENV REPOSITORY_HOST github.com
5
4
  ENV SYSTEM_PREFIX apollo
6
5
  ENV REPOSITORY_NAME brownleej/mars
7
6
 
@@ -7,7 +7,6 @@ ENV DATABASE_USERNAME apollo
7
7
  ENV DATABASE_TYPE sqlite
8
8
  ENV DATABASE_PORT 1234
9
9
  ENV APP_PORT 8080
10
- ENV REPOSITORY_HOST github.com
11
10
  ENV SYSTEM_PREFIX apollo
12
11
  ENV REPOSITORY_NAME brownleej/mars
13
12
 
@@ -1,7 +1,6 @@
1
1
  FROM apollo-generic-app-dependencies
2
2
 
3
3
  ENV APP_PORT 8080
4
- ENV REPOSITORY_HOST github.com
5
4
  ENV SYSTEM_PREFIX apollo
6
5
 
7
6
  RUN rm -r /var/code
@@ -7,7 +7,6 @@ ENV DATABASE_USERNAME apollo
7
7
  ENV DATABASE_TYPE mysql
8
8
  ENV DATABASE_PORT 3306
9
9
  ENV APP_PORT 8080
10
- ENV REPOSITORY_HOST github.com
11
10
  ENV SYSTEM_PREFIX apollo
12
11
  ENV REPOSITORY_NAME brownleej/mars
13
12
 
@@ -1,3 +1,3 @@
1
1
  #! /bin/bash
2
2
  /var/docker/before_startup.bash
3
- rails s -b 0.0.0.0 -p $APP_PORT -e $RAILS_ENV
3
+ rails s -b 0.0.0.0 -p $APP_PORT
@@ -2,4 +2,4 @@
2
2
 
3
3
  ruby /var/docker/build_new_app.rb
4
4
  /var/docker/before_startup.bash
5
- rails s -b 0.0.0.0 -p $APP_PORT -e $RAILS_ENV
5
+ rails s -b 0.0.0.0 -p $APP_PORT
@@ -28,6 +28,9 @@ ENV APP_PRIMARY false
28
28
  COPY add_app.rb /var/docker/
29
29
  RUN ruby /var/docker/add_app.rb
30
30
 
31
+ RUN apt-get remove -y ruby
32
+ RUN apt-get autoremove -y
33
+
31
34
  RUN rm -r /var/docker
32
35
 
33
36
  ENV PROJECT ""
@@ -0,0 +1,352 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'normal config', :integration do
4
+ include IntegrationHelpers
5
+
6
+ before :all do
7
+ run_command 'build_images'
8
+ end
9
+
10
+ after :all do
11
+ IntegrationHelpers.clear_docker_containers
12
+ end
13
+
14
+ describe 'building images' do
15
+ after do
16
+ system 'docker rm -f apollo-database 1> /dev/null 2> /dev/null'
17
+ end
18
+
19
+ it "creates images for the app, dependencies, database, and web server" do
20
+ expect(images).to eq ['apollo-database', 'apollo-mars', 'apollo-rails-app-dependencies', 'apollo-saturn', 'apollo-web']
21
+ end
22
+
23
+ it "populates the tables in the database image" do
24
+ start_database
25
+
26
+ results = run_command_in_docker :mars, 'mysql -uapollo -ptestpass -hapollo-database -e "use apollo; show tables"'
27
+ results = results.split("\n").collect { |line| line.delete('|').strip }.sort
28
+ results.shift
29
+ expect(results).to eq %w(clients posts schema_migrations users)
30
+ end
31
+
32
+ it "populates the seed data in the database image" do
33
+ start_database
34
+
35
+ results = run_command_in_docker :mars, 'mysql -uapollo -ptestpass -hapollo-database -e "select count(*) FROM apollo.users"'
36
+ results = results.split("\n").collect { |line| line.delete('|').strip }
37
+ results.shift
38
+ expect(results).to eq ['1']
39
+
40
+ results = run_command_in_docker :mars, 'mysql -uapollo -ptestpass -hapollo-database -e "select name FROM apollo.clients"'
41
+ results = results.split("\n").collect { |line| line.delete('|').strip }
42
+ results.shift
43
+ expect(results).to eq ['Test Client']
44
+ end
45
+
46
+ it "creates a test database" do
47
+ start_database
48
+
49
+ results = run_command_in_docker :mars, 'mysql -uapollo -ptestpass -hapollo-database apollo_test 2>&1'
50
+ expect(results).not_to include 'ERROR'
51
+ end
52
+
53
+ it "installs the gems on the app dependency image" do
54
+ results = run_command_in_docker 'rails-app-dependencies', 'gem list'
55
+ expect(results).to include 'mysql2'
56
+ expect(results).to include 'sass-rails'
57
+ expect(results).to include 'byebug'
58
+ expect(results).to include 'factory_girl'
59
+ end
60
+
61
+ it "leaves all the apps checked out on the app dependency image" do
62
+ results = run_command_in_docker 'rails-app-dependencies', 'ls /var/code'
63
+ folders = results.split("\n")
64
+ expect(folders).to include 'mars'
65
+ expect(folders).to include 'saturn'
66
+ end
67
+
68
+ it "installs the gems on the app images" do
69
+ results = run_command_in_docker :mars, 'gem list'
70
+ expect(results).to include 'mysql2'
71
+ expect(results).not_to include 'sass-rails'
72
+ expect(results).to include 'byebug'
73
+ expect(results).to include 'factory_girl'
74
+
75
+ results = run_command_in_docker :saturn, 'gem list'
76
+ expect(results).to include 'mysql2'
77
+ expect(results).to include 'sass-rails'
78
+ expect(results).not_to include 'byebug'
79
+ expect(results).not_to include 'factory_girl'
80
+ end
81
+
82
+ it 'installs mysql on the app images' do
83
+ results = run_command_in_docker :mars, 'which mysql'
84
+ expect(results).to eq "/usr/bin/mysql\n"
85
+ end
86
+
87
+ it "checks out just the single app on the app image" do
88
+ results = run_command_in_docker :mars, 'ls /var/code'
89
+ folders = results.split("\n")
90
+ expect(folders).to include 'app'
91
+ expect(folders).to include 'db'
92
+ end
93
+
94
+ it "installs the scripts in the /var/docker folder in the app image" do
95
+ results = run_command_in_docker :mars, 'ls /var/docker'
96
+ files = results.split("\n")
97
+ expect(files).to include 'checkout.bash'
98
+ expect(files).to include 'before_startup.bash'
99
+ expect(files).to include 'startup.bash'
100
+ expect(files).to include 'update_rails_config.rb'
101
+ expect(files).to include 'prepare_rails_for_launch.rb'
102
+ end
103
+
104
+ it 'leaves the RAILS_ENV empty' do
105
+ results = run_command_in_docker :mars, 'env'
106
+ expect(results).not_to include 'RAILS_ENV'
107
+ end
108
+ end
109
+
110
+ describe 'running containers' do
111
+ before :all do
112
+ run_command 'run_containers'
113
+
114
+ wait_on_command_success 'curl localhost'
115
+ wait_on_command_result 'curl -I -H Host:mars.apollo.johnbrownlee.com localhost', contains: '200 OK'
116
+ wait_on_command_result 'curl -I -H Host:saturn.apollo.johnbrownlee.com localhost', contains: '200 OK'
117
+ end
118
+
119
+ it "starts all the containers" do
120
+ expect(containers).to eq %w(apollo-database apollo-mars apollo-saturn apollo-web)
121
+ end
122
+
123
+ it "makes the app servers accessible from the web server" do
124
+ results = run_command_in_docker :web, 'bash -c "apt-get install -y curl 2>&1; curl apollo-mars:8080/users 2>&1"'
125
+ expect(results).to include 'test_user@mars.apollo.johnbrownlee.com'
126
+ end
127
+
128
+ it "makes the web server accessible from the host machine" do
129
+ results = `curl -H Host:apollo.johnbrownlee.com localhost 2>&1`
130
+ expect(results).to include '<a href="http://mars.apollo.johnbrownlee.com/">'
131
+ end
132
+
133
+ it "makes the app servers accessible from the host machine through the web server" do
134
+ results = `curl -H Host:mars.apollo.johnbrownlee.com localhost/users 2>&1`
135
+ expect(results).to include 'test_user@mars.apollo.johnbrownlee.com'
136
+
137
+ results = `curl -H Host:saturn.apollo.johnbrownlee.com localhost 2>&1`
138
+ expect(results).to include 'Welcome to Saturn'
139
+ end
140
+
141
+ it "does not generate static assets" do
142
+ results = `docker exec -it apollo-mars ls /var/code/public`
143
+ expect(results).not_to include 'assets'
144
+ end
145
+
146
+ it 'starts the server in development mode' do
147
+ results = `curl -H Host:mars.apollo.johnbrownlee.com localhost/bad/path 2>&1`
148
+ expect(results).to include '<title>Action Controller: Exception caught</title>'
149
+ end
150
+ end
151
+
152
+ describe 'build command' do
153
+ before :all do
154
+ run_command 'build'
155
+ wait_on_command_success 'curl apollo.johnbrownlee.com'
156
+ end
157
+
158
+ after :all do
159
+ restore_hosts_file
160
+ end
161
+
162
+ it "allows accessing the containers through their hostnames" do
163
+ results = `curl apollo.johnbrownlee.com 2>&1`
164
+ expect(results).to include '<a href="http://mars.apollo.johnbrownlee.com/">'
165
+ end
166
+ end
167
+
168
+ describe 'checking out new branches' do
169
+ before :all do
170
+ run_command 'run_containers'
171
+ wait_on_command_result 'curl -I -H Host:mars.apollo.johnbrownlee.com localhost', contains: '200 OK'
172
+ end
173
+
174
+ context 'with a valid command' do
175
+ before :all do
176
+ @result = run_command 'checkout mars checkout-test-branch'
177
+ wait_on_command_result 'curl -H Host:mars.apollo.johnbrownlee.com localhost/posts -d ""', contains: '"tag":null'
178
+ end
179
+
180
+ it 'returns true' do
181
+ expect(@result).to be_truthy
182
+ end
183
+
184
+ it "updates the code from the server" do
185
+ results = `docker exec apollo-mars ls app/controllers`.split("\n")
186
+ expect(results).to include 'users_controller.rb'
187
+ expect(results).to include 'posts_controller.rb'
188
+ end
189
+
190
+ it "runs new database migrations" do
191
+ results = run_command_in_docker(:mars, 'mysql -uapollo -ptestpass -hapollo-database -e "show fields from apollo.posts"').split("\n")
192
+ expect(results).to include "tag\tvarchar(255)\tYES\t\tNULL\t"
193
+ end
194
+
195
+ it "starts the server with the new code base" do
196
+ results = `docker exec apollo-mars curl localhost:8080/posts -d "user_id=1&title=First%20Post&contents=Hello,%20World&tag=party" 2>&1`
197
+ expect(results).to include '"tag":"party"'
198
+ end
199
+ end
200
+
201
+ context 'with no branch' do
202
+ it 'returns false' do
203
+ result = run_command 'checkout mars'
204
+ expect(result).to be_falsey
205
+ end
206
+ end
207
+
208
+ context 'with no app name' do
209
+ it 'returns false' do
210
+ result = run_command 'checkout'
211
+ expect(result).to be_falsey
212
+ end
213
+ end
214
+ end
215
+
216
+ describe 'starting and stopping services' do
217
+ before :all do
218
+ run_command 'run_containers'
219
+ end
220
+
221
+ context "with the start command" do
222
+ before :all do
223
+ IntegrationHelpers.image_names.each do |image|
224
+ system "docker stop #{image} 1> /dev/null 2> /dev/null"
225
+ end
226
+
227
+ @result = run_command 'services start'
228
+ end
229
+
230
+ it "returns a success" do
231
+ expect(@result).to be_truthy
232
+ end
233
+
234
+ it "starts the containers" do
235
+ results = `docker ps | grep apollo`.split("\n")
236
+ results = results.collect { |line| line.split(/\s+/).last }
237
+ results.sort!
238
+
239
+ expect(results).to eq %w(apollo-database apollo-mars apollo-saturn apollo-web)
240
+ end
241
+ end
242
+
243
+ context "with the stop command" do
244
+ before :all do
245
+ IntegrationHelpers.image_names.each do |image|
246
+ system "docker start #{image} 1> /dev/null 2> /dev/null"
247
+ end
248
+
249
+ @result = run_command 'services stop'
250
+ end
251
+
252
+ it "returns a success" do
253
+ expect(@result).to be_truthy
254
+ end
255
+
256
+ it "stops the containers" do
257
+ results = `docker ps | grep apollo`
258
+ expect(results).to eq ''
259
+
260
+ results = `docker ps -a | grep apollo`.split("\n")
261
+ results = results.collect { |line| line.split(/\s+/).last }
262
+ results.sort!
263
+
264
+ expect(results).to eq %w(apollo-database apollo-mars apollo-saturn apollo-web)
265
+ end
266
+ end
267
+
268
+ context "with an invalid command" do
269
+ before :all do
270
+ @result = run_command 'services crash'
271
+ end
272
+
273
+ it "returns a failure" do
274
+ expect(@result).to be_falsey
275
+ end
276
+ end
277
+
278
+ context "with no command" do
279
+ before :all do
280
+ @result = run_command 'services'
281
+ end
282
+
283
+ it "returns a failure" do
284
+ expect(@result).to be_falsey
285
+ end
286
+ end
287
+ end
288
+
289
+ describe 'shell' do
290
+ before :all do
291
+ run_command 'run_containers'
292
+ end
293
+
294
+ context 'with a normal command' do
295
+ it "returns the results of running that command" do
296
+ results = run_command 'shell mars ls', capture_output: true
297
+ results = results.split(/\s+/)
298
+ expect(results).to include "app"
299
+ expect(results).to include "db"
300
+ end
301
+ end
302
+
303
+ context 'with no app name' do
304
+ it 'returns a failure' do
305
+ results = run_command 'shell'
306
+ expect(results).to be_falsey
307
+ end
308
+ end
309
+ end
310
+
311
+ describe 'update_hosts' do
312
+ before :all do
313
+ run_command 'update_hosts'
314
+ end
315
+
316
+ after :all do
317
+ restore_hosts_file
318
+ end
319
+
320
+ it "puts the domains for the apps in the hosts file" do
321
+ results = File.read('/etc/hosts').split("\n")
322
+ expect(results).to include '127.0.0.1 apollo.johnbrownlee.com'
323
+ expect(results).to include '127.0.0.1 mars.apollo.johnbrownlee.com'
324
+ expect(results).to include '127.0.0.1 saturn.apollo.johnbrownlee.com'
325
+ end
326
+
327
+ it "puts an old copy in the backup" do
328
+ file = Dir["/etc/hosts.*.backup"].last
329
+ expect(file).not_to be_nil
330
+ results = File.read(file).split("\n")
331
+ expect(results.count).to be > 0
332
+ expect(results).not_to include 'apollo.johnbrownlee.com'
333
+ expect(results).not_to include 'mars.apollo.johnbrownlee.com'
334
+ expect(results).not_to include 'saturn.apollo.johnbrownlee.com'
335
+ end
336
+ end
337
+
338
+ describe 'imploding' do
339
+ before :all do
340
+ run_command 'run_containers'
341
+ run_command 'implode'
342
+ end
343
+
344
+ it 'removes all the images and containers' do
345
+ containers = `docker ps -a | grep apollo`
346
+ expect(containers).to eq ''
347
+
348
+ images = `docker images -a | grep apollo`
349
+ expect(images).to eq ''
350
+ end
351
+ end
352
+ end