orchestration 0.5.0 → 0.5.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (34) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +0 -9
  3. data/README.md +24 -12
  4. data/config/locales/en.yml +4 -23
  5. data/lib/orchestration.rb +2 -1
  6. data/lib/orchestration/docker_compose/app_service.rb +2 -2
  7. data/lib/orchestration/docker_compose/install_generator.rb +0 -16
  8. data/lib/orchestration/docker_healthcheck.rb +65 -0
  9. data/lib/orchestration/environment.rb +2 -2
  10. data/lib/orchestration/file_helpers.rb +1 -2
  11. data/lib/orchestration/install_generator.rb +25 -22
  12. data/lib/orchestration/service_check.rb +3 -9
  13. data/lib/orchestration/services/database/configuration.rb +2 -2
  14. data/lib/orchestration/services/database/healthcheck.rb +13 -1
  15. data/lib/orchestration/services/mixins/healthcheck_base.rb +4 -0
  16. data/lib/orchestration/templates/Dockerfile.erb +2 -2
  17. data/lib/orchestration/templates/application.mk.erb +10 -0
  18. data/lib/orchestration/templates/database.yml.erb +2 -2
  19. data/lib/orchestration/templates/deploy.mk.erb +4 -6
  20. data/lib/orchestration/templates/entrypoint.sh.erb +1 -1
  21. data/lib/orchestration/templates/env.erb +4 -7
  22. data/lib/orchestration/templates/makefile_macros.mk.erb +13 -11
  23. data/lib/orchestration/templates/orchestration.mk.erb +67 -26
  24. data/lib/orchestration/version.rb +1 -1
  25. data/lib/tasks/orchestration.rake +14 -47
  26. data/orchestration.gemspec +4 -1
  27. metadata +3 -9
  28. data/MANIFEST +0 -78
  29. data/bin/rspec +0 -29
  30. data/bin/rubocop +0 -29
  31. data/bin/strong_versions +0 -29
  32. data/lib/orchestration/templates/docker-compose.override.yml.erb +0 -1
  33. data/lib/orchestration/templates/healthcheck.rb.erb +0 -56
  34. data/lib/orchestration/templates/yaml.bash.erb +0 -22
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 972211f73865daa2a2ea2bcbfc35e031d9d974ba8fc129fda6bc8908073c9821
4
- data.tar.gz: e1c219157ed6911b89f2af2c0b0851209ce9473c4370d9728e0600486495a564
3
+ metadata.gz: e312ede29eb601b4e9413df1b711881997f81629b6f208c0ea7e62102d4a6b44
4
+ data.tar.gz: 4483fd3532b1bf27bb9a6b76e38c996a02f046164ed23ce85d5df5720e933ff3
5
5
  SHA512:
6
- metadata.gz: 23400aeae92d13494edde9881448aa24a7fb4e4d7a96a574062c89cb0c8ff7955d884bb8fb5b1fba7a646d0c51bec4e5bc22743fdb91ea104a67d7b65f1cfc57
7
- data.tar.gz: e06f3cb45140a2f90e95e7ab5492537f40600da1db892c7f9041f474119509a08882870b3a7d69a68e4727cc02a7af3a9cb80b01881cd727ac9671f65a1af1a6
6
+ metadata.gz: 6539ea72eabd6683691749179cb4bd08c9f9e3f334ced7348236058a2926a6e25f6a09176c47efb1f40a0b22f57f96c9d1fb9ba4274c25036a4cd03e3d3f6ead
7
+ data.tar.gz: caed0598c1dc565457e0437943a0c031b78c3bef1ab99d5ae313368af6a4e0a84e7451bc46560e454457a5fa5c8e83c5ff6019fc114c3fd22e0a0dfac00d9c61
data/Makefile CHANGED
@@ -3,12 +3,3 @@ test:
3
3
  bundle exec rspec
4
4
  bundle exec rubocop
5
5
  bundle exec strong_versions
6
-
7
- .PHONY: manifest
8
- manifest:
9
- git ls-files | GREP_OPTIONS='' grep -v '^spec' > MANIFEST
10
- git diff-index --quiet HEAD || (git add MANIFEST && git commit -m "Update manifest" || :)
11
-
12
- .PHONY: release
13
- release: manifest
14
- gem build orchestration.gemspec
data/README.md CHANGED
@@ -1,13 +1,5 @@
1
1
  # Orchestration
2
2
 
3
- ```
4
- I've got two tickets to the game
5
- It'd be great if I could take you to it this Sunday
6
- --Nickelback
7
- ```
8
-
9
- ## Overview
10
-
11
3
  _Orchestration_ aims to provide a convenient and consistent process for working with _Rails_ and _Docker_ without obscuring underlying components.
12
4
 
13
5
  At its core _Orchestration_ is simply a `Makefile` and a set of `docker-compose.yml` files with sensible, general-purpose default settings. Users are encouraged to tailor the generated build-out to suit their application; once the build-out has been generated it belongs to the application.
@@ -35,7 +27,7 @@ The below screenshot demonstrates _Orchestration_ being installed in a brand new
35
27
  Add _Orchestration_ to your Gemfile:
36
28
 
37
29
  ```ruby
38
- gem 'orchestration', '~> 0.5.0'
30
+ gem 'orchestration', '~> 0.5.5'
39
31
  ```
40
32
 
41
33
  Install:
@@ -56,6 +48,11 @@ rake orchestration:install server=unicorn # (or 'puma' [default], etc.)
56
48
 
57
49
  To rebuild all build-out at any time, pass `force=yes` to the above install command.
58
50
 
51
+ To rebuild just `orchestration/Makefile` (useful after upgrading the _Orchestration_ gem):
52
+ ```bash
53
+ rake orchestration:install:makefile
54
+ ```
55
+
59
56
  You will be prompted to enter values for your _Docker_ organisation and repository name. For example, the _organisation_ and _repository_ for https://hub.docker.com/r/rubyorchestration/sampleapp are `rubyorchestration` and `sampleapp` respectively. If you are unsure of these values, they can be modified later by editing `.orchestration.yml` in the root of your project directory.
60
57
 
61
58
  #### Configuration files
@@ -138,7 +135,20 @@ Note that `git archive` is used to generate the build context. Any uncommitted c
138
135
  make build
139
136
  ```
140
137
 
141
- See [build environment](#build-environment) for more details.
138
+ The `include` option can also be passed to provide a manifest file. Any files listed in this file will also be built into the _Docker_ image. Files **must** be located within the project directory.
139
+
140
+ ```bash
141
+ make build include=manifest.txt
142
+ ```
143
+
144
+ ```bash
145
+ # manifest.txt
146
+ doc/api/swagger.json
147
+ doc/api/soap.xml
148
+ doc/api/doc.html
149
+ ```
150
+
151
+ See also [build environment](#build-environment) if you use gems hosted on private _GitHub_/_Bitbucket_ repositories.
142
152
 
143
153
  #### Push latest image
144
154
 
@@ -217,6 +227,8 @@ To connect via _SSH_ to a remote swarm and deploy, pass the `manager` parameter:
217
227
  make deploy manager=user@manager.swarm.example.com
218
228
  ```
219
229
 
230
+ The file `orchestration/docker-compose.production.yml` is created automatically. If your `RAILS_ENV` is set to something other than `production` then another file will need to be created (e.g. `orchestration/docker-compose.staging.yml`). In most cases this file can be a _symlink_ to the original `production` configuration and environment variables can be used to customise the content.
231
+
220
232
  #### Roll back a deployment
221
233
 
222
234
  Roll back the `app` service of your stack:
@@ -260,7 +272,7 @@ Note that the following two variables _must_ be set in the relevant `.env` file
260
272
 
261
273
  ```
262
274
  # Published port for your application service:
263
- CONTAINER_PORT=3000
275
+ PUBLISH_PORT=3000
264
276
 
265
277
  # Number of replicas of your application service:
266
278
  REPLICAS=5
@@ -315,7 +327,7 @@ See related documentation:
315
327
  | `WEB_HEALTHCHECK_PATH` | Path expected to return a successful response | `/` |
316
328
  | `WEB_HEALTHCHECK_READ_TIMEOUT` | Number of seconds to wait for data before failing healthcheck | `10` |
317
329
  | `WEB_HEALTHCHECK_OPEN_TIMEOUT` | Number of seconds to wait for connection before failing healthcheck | `10` |
318
- | `WEB_HEALTHCHECK_SUCCESS_CODES` | Comma-separated list of HTTP status codes that will be deemed a success | `200,202,204` |
330
+ | `WEB_HEALTHCHECK_SUCCESS_CODES` | Comma-separated list of HTTP status codes that will be deemed a success | `200,201,202,204` |
319
331
 
320
332
  If your application does not have a suitable always-available route to use as a healthcheck, the following one-liner may be useful:
321
333
 
@@ -2,6 +2,7 @@ en:
2
2
  orchestration:
3
3
  attempt_limit: "Unable to reconnect after %{limit} attempts. Aborting."
4
4
  default: "default"
5
+ auto_update: "Orchestration Makefile was automatically updated to the latest version."
5
6
 
6
7
  app:
7
8
  waiting: "Waiting for app: %{config}"
@@ -19,10 +20,6 @@ en:
19
20
  ready: "Mongo is ready."
20
21
  bad_config: "Unable to parse Mongo config: %{path}. Expected section for one of: %{expected}"
21
22
 
22
- haproxy:
23
- waiting: "Waiting for HAProxy: %{config}"
24
- ready: "HAProxy is ready."
25
-
26
23
  rabbitmq:
27
24
  waiting: "Waiting for RabbitMQ: %{config}"
28
25
  ready: "RabbitMQ is ready."
@@ -42,24 +39,8 @@ en:
42
39
  prompt: "project name"
43
40
 
44
41
  rake:
45
- app:
46
- wait: "Wait for app to become available"
47
- unknown_web_server: "Unrecognised web server '%{server}'. Expected: %{expected}"
48
-
49
- database:
50
- wait: "Wait for database to become available"
51
-
52
- listener:
53
- wait: "Wait for a locally-bound service to accept connections (pass `service=NAME`)"
54
-
55
- mongo:
56
- wait: "Wait for Mongo to become available"
57
-
58
- haproxy:
59
- wait: "Wait for HAProxy to become available"
60
-
61
- rabbitmq:
62
- wait: "Wait for RabbitMQ to become available"
63
-
42
+ config: "Parse and output Orchestration config (internal use)"
43
+ healthcheck: "Execute healthcheck; used for HEALTHCHECK command in Docker image"
64
44
  install: "Install Orchestration tools"
65
45
  install_makefile: "(Re)create orchestration/Makefile"
46
+ wait: "Wait for development/test dependencies to be available"
@@ -11,7 +11,7 @@ require 'paint'
11
11
  begin
12
12
  require 'rails'
13
13
  rescue LoadError
14
- warn('[orchestration] Rails not detected; skipping.')
14
+ warn('[orchestration] Running in non-Rails mode.')
15
15
  end
16
16
 
17
17
  I18n.load_path += Dir[File.join(File.expand_path('..', __dir__),
@@ -22,6 +22,7 @@ require 'orchestration/file_helpers'
22
22
  require 'orchestration/docker_compose'
23
23
  require 'orchestration/environment'
24
24
  require 'orchestration/errors'
25
+ require 'orchestration/docker_healthcheck'
25
26
  require 'orchestration/install_generator'
26
27
  require 'orchestration/railtie' if defined?(Rails)
27
28
  require 'orchestration/service_check'
@@ -27,7 +27,7 @@ module Orchestration
27
27
 
28
28
  def healthcheck
29
29
  {
30
- 'test' => ['ruby', "/app/#{orchestration}/healthcheck.rb"],
30
+ 'test' => ['bundle', 'exec', 'rake', 'orchestration:healthcheck'],
31
31
  # Defaults according to
32
32
  # https://docs.docker.com/engine/reference/builder/#healthcheck
33
33
  # Except start_period which cannot be set to 0s
@@ -113,7 +113,7 @@ module Orchestration
113
113
  end
114
114
 
115
115
  def ports
116
- ['${CONTAINER_PORT:?CONTAINER_PORT must be provided}:8080']
116
+ ['${PUBLISH_PORT:?PUBLISH_PORT must be provided}:8080']
117
117
  end
118
118
  end
119
119
  end
@@ -10,10 +10,6 @@ module Orchestration
10
10
  @terminal = terminal
11
11
  end
12
12
 
13
- def docker_compose_yml
14
- create_compose_file
15
- end
16
-
17
13
  def docker_compose_test_yml
18
14
  create_compose_file(:test)
19
15
  end
@@ -22,22 +18,10 @@ module Orchestration
22
18
  create_compose_file(:development)
23
19
  end
24
20
 
25
- def docker_compose_local_yml
26
- create_compose_file(:local)
27
- end
28
-
29
21
  def docker_compose_production_yml
30
22
  create_compose_file(:production)
31
23
  end
32
24
 
33
- def docker_compose_override_yml
34
- simple_copy(
35
- 'docker-compose.override.yml',
36
- @env.docker_compose_path(:override),
37
- overwrite: false
38
- )
39
- end
40
-
41
25
  def enabled_services(environment)
42
26
  service_names(environment).select { |name| service_enabled?(name) }
43
27
  end
@@ -0,0 +1,65 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'net/http'
4
+ module Orchestration
5
+ class DockerHealthcheck
6
+ def self.execute
7
+ new.execute
8
+ end
9
+
10
+ def execute
11
+ return_code = 1
12
+
13
+ # rubocop:disable Lint/RescueException
14
+ begin
15
+ response = run
16
+ return_code = 0 if success?(response.code)
17
+ puts message(response.code)
18
+ rescue Exception => e
19
+ puts "[#{__FILE__}] ERROR: #{e.inspect}"
20
+ ensure
21
+ exit return_code
22
+ end
23
+ # rubocop:enable Lint/RescueException
24
+ end
25
+
26
+ private
27
+
28
+ def run
29
+ client = Net::HTTP.new(
30
+ ENV.fetch('WEB_HOST', 'localhost'),
31
+ ENV.fetch('WEB_PORT', '8080').to_i
32
+ )
33
+
34
+ client.read_timeout = ENV.fetch('WEB_HEALTHCHECK_READ_TIMEOUT', '10').to_i
35
+ client.open_timeout = ENV.fetch('WEB_HEALTHCHECK_OPEN_TIMEOUT', '10').to_i
36
+
37
+ client.start do |request|
38
+ request.get(ENV.fetch('WEB_HEALTHCHECK_PATH') { '/' })
39
+ end
40
+ end
41
+
42
+ def success_codes
43
+ ENV.fetch('WEB_HEALTHCHECK_SUCCESS_CODES', '200,201,202,204').split(',')
44
+ end
45
+
46
+ def success?(code)
47
+ success_codes.include?(code.to_s)
48
+ end
49
+
50
+ def message(code)
51
+ if success?(code)
52
+ outcome = 'SUCCESS ✓ '
53
+ in_or_not = 'IN'
54
+ else
55
+ outcome = 'FAILURE ✘ '
56
+ in_or_not = 'NOT IN'
57
+ end
58
+
59
+ accepted = success_codes.join(', ')
60
+ message = "#{in_or_not} [#{accepted}] : #{outcome} [#{__FILE__}]"
61
+
62
+ "# HTTP_STATUS(#{code}) #{message}"
63
+ end
64
+ end
65
+ end
@@ -53,7 +53,7 @@ module Orchestration
53
53
  end
54
54
 
55
55
  def docker_compose_path(env = nil)
56
- return orchestration_root.join('docker-compose.yml') if env.nil?
56
+ env ||= 'development'
57
57
 
58
58
  orchestration_root.join("docker-compose.#{env}.yml")
59
59
  end
@@ -82,7 +82,7 @@ module Orchestration
82
82
  end
83
83
 
84
84
  def app_port
85
- ENV.fetch('CONTAINER_PORT', ENV.fetch('WEB_PORT', '3000')).to_i
85
+ ENV.fetch('PUBLISH_PORT', ENV.fetch('WEB_PORT', '3000')).to_i
86
86
  end
87
87
 
88
88
  def app_name
@@ -66,9 +66,8 @@ module Orchestration
66
66
  end
67
67
 
68
68
  def skip?(present, content, previous_content, options)
69
- overwrite = options.fetch(:overwrite, true)
70
69
  return false unless present
71
- return true unless overwrite || force?
70
+ return true unless options.fetch(:overwrite, true) || force?
72
71
 
73
72
  previous_content == content
74
73
  end
@@ -27,10 +27,18 @@ module Orchestration
27
27
  @terminal.write(:skip, relpath)
28
28
  end
29
29
 
30
- def orchestration_makefile
30
+ def verify_makefile(skip = true)
31
+ # Only run when called explicitly [from Rake tasks].
32
+ # (I know this is hacky).
33
+ return if skip
34
+
31
35
  content = template('orchestration.mk', makefile_environment)
32
36
  path = @env.orchestration_root.join('Makefile')
33
- path.exist? ? update_file(path, content) : create_file(path, content)
37
+ return if path.exist? && content == File.read(path)
38
+
39
+ write_file(path, content)
40
+ @terminal.write(:update, 'Makefile')
41
+ @terminal.write(:status, t(:auto_update))
34
42
  end
35
43
 
36
44
  def application_makefile
@@ -39,6 +47,12 @@ module Orchestration
39
47
  inject_if_missing(path, 'include orchestration/Makefile')
40
48
  end
41
49
 
50
+ def orchestration_makefile
51
+ content = template('orchestration.mk', makefile_environment)
52
+ path = @env.orchestration_root.join('Makefile')
53
+ path.exist? ? update_file(path, content) : create_file(path, content)
54
+ end
55
+
42
56
  def dockerfile
43
57
  create_file(
44
58
  orchestration_dir.join('Dockerfile'),
@@ -54,23 +68,10 @@ module Orchestration
54
68
  FileUtils.chmod('a+x', path)
55
69
  end
56
70
 
57
- def gitignore
58
- path = @env.root.join('.gitignore')
59
- globs = %w[.build/ .deploy/ Gemfile Gemfile.lock docker-compose.local.yml]
60
- lines = %w[orchestration/.sidecar .env deploy.tar] + globs.map do |line|
61
- "#{@env.orchestration_dir_name}/#{line}"
62
- end
63
-
64
- ensure_lines_in_file(path, lines)
65
- end
66
-
67
71
  def docker_compose
68
- @docker_compose.docker_compose_yml
69
72
  @docker_compose.docker_compose_test_yml
70
73
  @docker_compose.docker_compose_development_yml
71
- @docker_compose.docker_compose_local_yml
72
74
  @docker_compose.docker_compose_production_yml
73
- @docker_compose.docker_compose_override_yml
74
75
  end
75
76
 
76
77
  def puma
@@ -112,16 +113,18 @@ module Orchestration
112
113
  service_config('rabbitmq.yml', Services::RabbitMQ::Configuration)
113
114
  end
114
115
 
115
- def healthcheck
116
- simple_copy('healthcheck.rb')
116
+ def env
117
+ simple_copy('env', @env.root.join('.env'), overwrite: false)
117
118
  end
118
119
 
119
- def yaml_bash
120
- simple_copy('yaml.bash')
121
- end
120
+ def gitignore
121
+ path = @env.root.join('.gitignore')
122
+ globs = %w[.build/ .deploy/ Gemfile Gemfile.lock docker-compose.local.yml]
123
+ lines = %w[orchestration/.sidecar .env deploy.tar] + globs.map do |line|
124
+ "#{@env.orchestration_dir_name}/#{line}"
125
+ end
122
126
 
123
- def env
124
- simple_copy('env', @env.root.join('.env'), overwrite: false)
127
+ ensure_lines_in_file(path, lines)
125
128
  end
126
129
 
127
130
  def deploy_mk
@@ -16,11 +16,13 @@ module Orchestration
16
16
  end
17
17
 
18
18
  def run
19
- return echo_missing unless @service.configuration.configured?
19
+ return unless @service.configuration.configured?
20
20
 
21
+ @service.modify_environment
21
22
  echo_start
22
23
  success = attempt_connection
23
24
  echo_ready if success
25
+ @service.unmodify_environment
24
26
  success
25
27
  end
26
28
 
@@ -39,14 +41,6 @@ module Orchestration
39
41
  false
40
42
  end
41
43
 
42
- def echo_missing
43
- @terminal.write(
44
- @service_name.to_sym,
45
- "#{@service.configuration.error} (skipping)",
46
- :error
47
- )
48
- end
49
-
50
44
  def echo_start
51
45
  @terminal.write(@service_name.to_sym, '', :status)
52
46
  end
@@ -18,14 +18,14 @@ module Orchestration
18
18
  "[#{adapter.name}] #{host}:#{port}"
19
19
  end
20
20
 
21
- def settings
21
+ def settings(healthcheck: false)
22
22
  {
23
23
  adapter: adapter.name,
24
24
  host: host,
25
25
  port: port,
26
26
  username: username,
27
27
  password: password,
28
- database: database
28
+ database: healthcheck ? adapter.credentials['database'] : database
29
29
  }.transform_keys(&:to_s)
30
30
  end
31
31
 
@@ -19,6 +19,18 @@ module Orchestration
19
19
  [ActiveRecord::ConnectionNotEstablished].concat(adapter_errors)
20
20
  end
21
21
 
22
+ def modify_environment
23
+ @database_url = ENV.delete('DATABASE_URL')
24
+ @development_database_url = ENV.delete('DEVELOPMENT_DATABASE_URL')
25
+ @test_database_url = ENV.delete('TEST_DATABASE_URL')
26
+ end
27
+
28
+ def unmodify_environment
29
+ ENV['DATABASE_URL'] = @database_url
30
+ ENV['DEVELOPMENT_DATABASE_URL'] = @development_database_url
31
+ ENV['TEST_DATABASE_URL'] = @test_database_url
32
+ end
33
+
22
34
  private
23
35
 
24
36
  def adapter_errors
@@ -26,7 +38,7 @@ module Orchestration
26
38
  end
27
39
 
28
40
  def settings
29
- @configuration.settings
41
+ @configuration.settings(healthcheck: true)
30
42
  end
31
43
  end
32
44
  end
@@ -26,6 +26,10 @@ module Orchestration
26
26
  @dependencies = args
27
27
  end
28
28
 
29
+ def modify_environment; end
30
+
31
+ def unmodify_environment; end
32
+
29
33
  private
30
34
 
31
35
  def load_dependencies
@@ -20,10 +20,10 @@ COPY .build/Gemfile .build/Gemfile.lock ./
20
20
  RUN bundle install --without development test --deployment
21
21
  <% if defined?(Webpacker) %>
22
22
  COPY .build/package.json .build/yarn.lock ./
23
- RUN . /root/.bashrc && yarn install
23
+ RUN . /root/.bashrc ; yarn install
24
24
  <% end %>
25
25
  ADD .build/context.tar .
26
- <% if defined?(Webpacker) %>RUN . /root/.bashrc && NODE_ENV=production RAILS_ENV=production yarn install && NODE_ENV=production RAILS_ENV=production SECRET_KEY_BASE=abc123 bundle exec rake assets:precompile<% elsif Rake::Task.tasks.map(&:name).include?('assets:precompile') %>RUN NODE_ENV=production RAILS_ENV=production SECRET_KEY_BASE=abc123 bundle exec rake assets:precompile<% end %>
26
+ <% if defined?(Webpacker) %>RUN . /root/.bashrc ; NODE_ENV=production RAILS_ENV=production yarn install && NODE_ENV=production RAILS_ENV=production SECRET_KEY_BASE=abc123 bundle exec rake assets:precompile<% elsif Rake::Task.tasks.map(&:name).include?('assets:precompile') %>RUN NODE_ENV=production RAILS_ENV=production SECRET_KEY_BASE=abc123 bundle exec rake assets:precompile<% end %>
27
27
  RUN echo "${GIT_COMMIT}" > /app/GIT_COMMIT
28
28
  HEALTHCHECK --interval=<%= healthcheck['interval'] %> \
29
29
  --timeout=<%= healthcheck['timeout'] %> \
@@ -12,3 +12,13 @@
12
12
  test: test-setup
13
13
  bundle exec rspec
14
14
  bundle exec rubocop
15
+
16
+ # Start development containers and create/migrate/seed database
17
+ .PHONY: develop
18
+ develop:
19
+ bundle install
20
+ @$(MAKE) start env=test
21
+ @$(MAKE) start env=development
22
+ bundle exec rake db:create
23
+ bundle exec rake db:migrate
24
+ bundle exec rake db:seed
@@ -8,7 +8,7 @@ development:
8
8
  port: <%= compose.call('development').local_port('database') %>
9
9
  username: <%= compose.call(nil).database_adapter.credentials['username'] %>
10
10
  password: <%= compose.call(nil).database_adapter.credentials['password'] %>
11
- database: <%= compose.call(nil).database_adapter.credentials['database'] %>
11
+ database: development
12
12
  <%% if ENV.key?('DEVELOPMENT_DATABASE_URL') %>
13
13
  url: <%%= ENV['DEVELOPMENT_DATABASE_URL'] %>
14
14
  <%% end %>
@@ -21,7 +21,7 @@ test:
21
21
  port: <%= compose.call('test').local_port('database') %>
22
22
  username: <%= compose.call(nil).database_adapter.credentials['username'] %>
23
23
  password: <%= compose.call(nil).database_adapter.credentials['password'] %>
24
- database: <%= compose.call(nil).database_adapter.credentials['database'] %>
24
+ database: test
25
25
  # Useful for certain continuous integration environments (e.g. Jenkins in
26
26
  # Docker) where the DB hostname may be a service name rather than `127.0.0.1`:
27
27
  <%% if ENV.key?('TEST_DATABASE_URL') %>
@@ -8,8 +8,8 @@ else ifneq (,$(RACK_ENV))
8
8
  endif
9
9
 
10
10
  verify-environment:
11
- ifndef CONTAINER_PORT
12
- @$(error `CONTAINER_PORT` must be defined in environment)
11
+ ifndef PUBLISH_PORT
12
+ @$(error `PUBLISH_PORT` must be defined in environment)
13
13
  endif
14
14
 
15
15
  ifndef env
@@ -22,9 +22,7 @@ compose_base:=env HOST_UID=$(shell id -u) \
22
22
  DOCKER_REPOSITORY=%%REPOSITORY%%:%%VERSION%% \
23
23
  docker-compose \
24
24
  -p ${project_name} \
25
- -f docker-compose.yml
26
-
27
- compose:=${compose_base} -f docker-compose.production.yml -f docker-compose.override.yml
25
+ -f docker-compose.production.yml
28
26
 
29
27
  .PHONY: deploy
30
28
  deploy:
@@ -36,7 +34,7 @@ endif
36
34
 
37
35
  .PHONY: deploy-stack
38
36
  deploy-stack:
39
- @${compose} config | docker stack deploy --prune --with-registry-auth -c - ${project_name}
37
+ ${compose} config | docker stack deploy --prune --with-registry-auth -c - ${project_name}
40
38
 
41
39
  .PHONY: console
42
40
  service := app
@@ -2,7 +2,7 @@
2
2
  HOST_UID=${HOST_UID:-$(id -u)}
3
3
  set -e
4
4
  id owner >/dev/null 2>&1 || useradd -u ${HOST_UID} -m -o owner
5
- mkdir -p /app/tmp/pids
5
+ mkdir -p /app/tmp/pids /app/log /app/db
6
6
  chown -Rf owner:owner /app/tmp /app/log /app/db
7
7
  rm -f /app/tmp/pids/server.pid
8
8
 
@@ -1,7 +1,4 @@
1
- # Configure which port your `app` service will listen on:
2
- CONTAINER_PORT=3000
3
-
4
- # Use `make deploy` to deploy your application stack to a Docker Swarm.
5
- # Use this setting to control the number of replicas to create for your
6
- # application service:
7
- REPLICAS=1
1
+ # Set any development environment variables here
2
+ # e.g.:
3
+ #
4
+ # DISABLE_SPRING=1
@@ -87,17 +87,19 @@ restore_env:=( \
87
87
 
88
88
  key_chars:=[a-zA-Z0-9_]
89
89
  censored:=**********
90
- censor=sed 's/\(^${key_chars}*$(1)${key_chars}*\)=\(.*\)$$/\1=${censored}/'
91
- censor_urls:=sed 's|\([a-zA-Z0-9_+]\+://.*:\).*\(@.*\)$$|\1${censored}\2|'
92
- format_env:=$(call censor,SECRET) | \
93
- $(call censor,PASSWORD) | \
94
- $(call censor,TOKEN) | \
95
- $(call censor,PRIVATE) | \
96
- $(call censor,KEY) | \
97
- ${censor_urls} | \
98
- sed 's/\(^[a-zA-Z0-9_]\+\)=/${blue}\1${reset}=/' | \
99
- sed 's/^/ /' | \
100
- sed 's/=\(.*\)$$/=${yellow}\1${reset}/'
90
+ censor=s/\(^${key_chars}*$(1)${key_chars}*\)=\(.*\)$$/\1=${censored}/
91
+ censor_urls:=s|\([a-zA-Z0-9_+]\+://.*:\).*\(@.*\)$$|\1${censored}\2|
92
+ format_env:=sed '$(call censor,SECRET); \
93
+ $(call censor,TOKEN); \
94
+ $(call censor,PRIVATE); \
95
+ $(call censor,KEY); \
96
+ $(censor_urls); \
97
+ /^\s*$$/d; \
98
+ /^\s*\#/d; \
99
+ s/\(^[a-zA-Z0-9_]\+\)=/${blue}\1${reset}=/; \
100
+ s/^/ /; \
101
+ s/=\(.*\)$$/=${yellow}\1${reset}/' | \
102
+ sort
101
103
 
102
104
  fail=( \
103
105
  $(call printraw,' ${cross}') ; \
@@ -38,8 +38,15 @@ ifneq (,$(wildcard ${env_file}))
38
38
  rake=. ${env_file} && ${rake_cmd}
39
39
  endif
40
40
 
41
- docker_organization=$(shell bash ${orchestration_dir}/yaml.bash docker_organization)
42
- docker_repository=$(shell bash ${orchestration_dir}/yaml.bash docker_repository)
41
+ ifeq (,$(findstring serve,$(MAKECMDGOALS)))
42
+ ifeq (,$(findstring console,$(MAKECMDGOALS)))
43
+ ifeq (,$(findstring test,$(MAKECMDGOALS)))
44
+ docker_config:=$(shell ${rake} orchestration:config)
45
+ docker_organization=$(word 1,$(docker_config))
46
+ docker_repository=$(word 2,$(docker_config))
47
+ endif
48
+ endif
49
+ endif
43
50
 
44
51
  ifeq (,$(project_name))
45
52
  project_base = ${docker_repository}_${env}
@@ -73,19 +80,26 @@ else
73
80
  compose_project_name = ${project_base}
74
81
  endif
75
82
 
76
- compose_base=env HOST_UID=$(shell id -u) \
83
+ compose_base=env -i \
84
+ PATH=$(PATH) \
85
+ HOST_UID=$(shell id -u) \
77
86
  DOCKER_ORGANIZATION="${docker_organization}" \
78
87
  DOCKER_REPOSITORY="${docker_repository}" \
79
88
  COMPOSE_PROJECT_NAME="${compose_project_name}" \
80
89
  ${sidecar_compose} \
81
90
  docker-compose \
82
- -f "${orchestration_dir}/docker-compose.yml"
91
+ -f ${orchestration_dir}/docker-compose.${env}.yml
83
92
 
84
93
  git_branch ?= $(if $(branch),$(branch),$(shell git rev-parse --abbrev-ref HEAD))
85
- git_version ?= $(shell git rev-parse --short --verify ${git_branch})
94
+ ifndef dev
95
+ git_version ?= $(shell git rev-parse --short --verify ${git_branch})
96
+ else
97
+ git_version = dev
98
+ endif
99
+
86
100
  docker_image=${docker_organization}/${docker_repository}:${git_version}
87
101
 
88
- compose=${compose_base} -f ${orchestration_dir}/docker-compose.${env}.yml -f ${orchestration_dir}/docker-compose.override.yml
102
+ compose=${compose_base}
89
103
  random_str=cat /dev/urandom | LC_ALL=C tr -dc 'a-z' | head -c $1
90
104
 
91
105
  ifneq (,$(wildcard ${orchestration_dir}/docker-compose.local.yml))
@@ -100,10 +114,10 @@ all: build
100
114
  ifndef network
101
115
  start: network := ${compose_project_name}_default
102
116
  endif
103
- start: _clean-logs
104
- @$(call print,'${yellow}Starting containers${reset} ...')
117
+ start: _create-log-directory _clean-logs
118
+ @$(call print,'${yellow}Starting ${cyan}${env}${yellow} containers${reset} ...')
105
119
  ifeq (${env},$(filter ${env},test development))
106
- @${compose} up --detach --force-recreate --renew-anon-volumes ${services} ${log} || ${fail}
120
+ @${compose} up --detach --force-recreate --renew-anon-volumes --remove-orphans ${services} ${log} || ${fail}
107
121
  @[ -n '${sidecar}' ] && \
108
122
  ( \
109
123
  $(call printraw,' ${yellow}(joining dependency network ${green}${network}${yellow})${reset} ... ') ; \
@@ -132,7 +146,7 @@ start-<%= service %>:
132
146
  .PHONY: stop
133
147
  stop: network := ${compose_project_name}_default
134
148
  stop:
135
- @$(call print,'${yellow}Stopping containers${reset} ...')
149
+ @$(call print,'${yellow}Stopping ${cyan}${env}${yellow} containers${reset} ...')
136
150
  @if docker ps --format "{{.ID}}" | grep -q $(shell hostname) ; \
137
151
  then \
138
152
  ( docker network disconnect ${network} $(shell hostname) ${log} || : ) \
@@ -165,7 +179,7 @@ serve:
165
179
  then ( \
166
180
  $(call println,'${yellow}Environment${reset}: ${green}${env_file}${reset}') && \
167
181
  cat '${env_file}' | ${format_env} && \
168
- $(call println,'') \
182
+ $(call printrawln,'') \
169
183
  ) ; \
170
184
  fi
171
185
  ${rails}
@@ -178,7 +192,7 @@ console:
178
192
  then ( \
179
193
  $(call println,'${yellow}Environment${reset}: ${green}${env_file}${reset}') && \
180
194
  cat '${env_file}' | ${format_env} && \
181
- $(call println,'') \
195
+ $(call printrawln,'') \
182
196
  ) ; \
183
197
  fi
184
198
  ${rails} console
@@ -186,23 +200,25 @@ console:
186
200
  .PHONY: test-setup
187
201
  test-setup: env := test
188
202
  test-setup:
203
+ ifndef light
189
204
  @$(call make,start env=test)
190
- ifneq (,$(wildcard config/database.yml))
205
+ ifneq (,$(wildcard config/database.yml))
191
206
  ${rake} db:create || :
192
- ifneq (,$(wildcard db/structure.sql))
207
+ ifneq (,$(wildcard db/structure.sql))
193
208
  ${rake} db:structure:load
194
- else ifneq (,$(wildcard db/schema.rb))
209
+ else ifneq (,$(wildcard db/schema.rb))
195
210
  ${rake} db:schema:load
196
- endif
211
+ endif
197
212
 
198
213
  ${rake} db:migrate
214
+ endif
199
215
  endif
200
216
 
201
217
  .PHONY: dump
202
218
  dump:
203
219
  ifndef verbose
204
220
  @$(call println)
205
- @$(call println,'${yellow}Captured${reset} ${green}stdout${reset} ${yellow}and${reset} ${red}stderr${reset} ${yellow}log data${reset}:')
221
+ @$(call println,'${yellow}Captured${reset} ${green}stdout${reset} ${yellow}and${reset} ${red}stderr${reset} ${yellow}log data [${cyan}${env}${yellow}]${reset}:')
206
222
  @$(call println)
207
223
  @echo
208
224
  @test -f '${stdout}' && ( \
@@ -249,10 +265,6 @@ endif
249
265
  -e "s/%%ORGANIZATION%%/${docker_organization}/g" \
250
266
  ${orchestration_dir}/deploy.mk > \
251
267
  ${orchestration_dir}/.deploy/${docker_repository}/Makefile
252
- @cp ${orchestration_dir}/docker-compose.yml \
253
- ${orchestration_dir}/docker-compose.production.yml \
254
- ${orchestration_dir}/docker-compose.override.yml \
255
- ${orchestration_dir}/.deploy/${docker_repository}/
256
268
  @bundle_path="${path}" ; tar -C '${orchestration_dir}/.deploy' -cf "$${bundle_path:-./bundle.tar}" ./${docker_repository}
257
269
 
258
270
  .PHONY: deploy
@@ -264,7 +276,7 @@ deploy:
264
276
  ifndef manager
265
277
  @$(call println_error,'Missing `manager` parameter: `make deploy manager=swarm-manager.example.com`') ; exit 1
266
278
  endif
267
- @$(call println,'${yellow}Deploying stack via${reset} ${green}${manager}${reset} ...') && \
279
+ @$(call println,'${yellow}Deploying ${green}${env}${reset} stack via${reset} ${green}${manager}${reset} ...') && \
268
280
  ( \
269
281
  $(call make,bundle path='${path}/bundle.tar') ${log} && \
270
282
  cd '${path}' ${log} && \
@@ -312,17 +324,31 @@ wait-listener:
312
324
  ### Docker build commands ###
313
325
 
314
326
  .PHONY: build
315
- build: context = ${orchestration_dir}/.build/context.tar
316
- build:
327
+ build: build_dir = ${orchestration_dir}/.build
328
+ build: context = ${build_dir}/context.tar
329
+ build: _create-log-directory check-local-changes
317
330
  @$(call print,'${yellow}Preparing build context from${reset} ${cyan}${git_branch}:${git_version}${reset} ... ')
318
331
  @mkdir -p ${orchestration_dir}/.build ${log} || ${fail}
332
+ ifndef dev
319
333
  @git show ${git_branch}:./Gemfile > ${orchestration_dir}/.build/Gemfile 2>${stderr} || ${fail}
320
334
  @git show ${git_branch}:./Gemfile.lock > ${orchestration_dir}/.build/Gemfile.lock 2>${stderr} || ${fail}
321
335
  <% if defined?(Webpacker) %> @git show ${git_branch}:./package.json > ${orchestration_dir}/.build/package.json 2>${stderr} || ${fail}<% end %>
322
336
  <% if defined?(Webpacker) %> @git show ${git_branch}:./yarn.lock > ${orchestration_dir}/.build/yarn.lock 2>${stderr} || ${fail}<% end %>
323
337
  @git archive --format 'tar' -o '${context}' '${git_branch}' ${log} || ${fail}
324
- @temp=$$(mktemp -d) ; ( cd "$${temp}" && tar -uvf '${context}' . ) ${log} || ${fail}
338
+ else
339
+ @tar -cvf '${context}' . ${log} || ${fail}
340
+ endif
325
341
  @$(call printrawln,'${green}complete.${reset} ${tick}')
342
+ ifdef include
343
+ @$(call print,'${yellow}Including files from:${reset} ${cyan}${include}${reset} ...')
344
+ @(while read line; do \
345
+ export line; \
346
+ include_dir="${build_dir}/$$(dirname "$${line}")/" && \
347
+ mkdir -p "$${include_dir}" && cp "$${line}" "$${include_dir}" \
348
+ && (cd '${orchestration_dir}/.build/' && tar rf 'context.tar' "$${line}"); \
349
+ done < '${include}') ${log} || ${fail}
350
+ @$(call printrawln,' ${green}complete.${reset} ${tick}')
351
+ endif
326
352
  ifdef sidecar
327
353
  # Assume we are in a line-buffered environment (e.g. Jenkins)
328
354
  @$(call println,'${yellow}Building image${reset} ...')
@@ -341,14 +367,29 @@ endif
341
367
  @$(call println,'[${green}tag${reset}] ${cyan}${docker_organization}/${docker_repository}:${git_version}${reset}')
342
368
 
343
369
  .PHONY: push
344
- push:
370
+ push: _create-log-directory
345
371
  @$(call print,'${yellow}Pushing${reset} ${cyan}${docker_image}${reset} ...')
346
372
  @docker push ${docker_image} ${log_progress} || ${fail}
347
373
  @$(call printrawln,' ${green}complete${reset}. ${tick}')
348
374
 
375
+ .PHONY: check-local-changes
376
+ check-local-changes:
377
+ ifndef dev
378
+ @if [[ ! -z "$$(git status --porcelain)" ]] ; \
379
+ then \
380
+ $(call println,'${red}You have uncommitted changes which will not be included in your build:${reset}') ; \
381
+ git status --porcelain ; \
382
+ $(call println,'${yellow}Use ${cyan}make build dev=1${reset} ${yellow}to include these files.${reset}\n') ; \
383
+ fi
384
+ endif
385
+
349
386
  ### Internal Commands ###
350
387
  #
351
388
  .PHONY: _clean-logs
352
389
  _clean-logs:
353
390
  @rm -f '${stdout}' '${stderr}'
354
391
  @touch '${stdout}' '${stderr}'
392
+
393
+ .PHONY: _create-log-directory
394
+ _create-log-directory:
395
+ @mkdir -p log
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Orchestration
4
- VERSION = '0.5.0'
4
+ VERSION = '0.5.5'
5
5
  end
@@ -15,10 +15,23 @@ namespace :orchestration do
15
15
  end
16
16
  end
17
17
 
18
+ desc I18n.t('orchestration.rake.config')
19
+ task :config do
20
+ config = YAML.safe_load(File.read('.orchestration.yml'))
21
+ puts "#{config['docker']['organization']} #{config['docker']['repository']}"
22
+ end
23
+
24
+ desc I18n.t('orchestration.rake.healthcheck')
25
+ task :healthcheck do
26
+ Orchestration::DockerHealthcheck.execute
27
+ end
28
+
29
+ desc I18n.t('orchestration.rake.wait')
18
30
  task :wait do
31
+ Orchestration::InstallGenerator.new.verify_makefile(false)
19
32
  env = Orchestration::Environment.new
20
33
  services = Orchestration::Services
21
- env.docker_compose_config['services'].each do |name, service|
34
+ env.docker_compose_config['services'].each do |name, _service|
22
35
  path = nil
23
36
 
24
37
  adapter = if name == 'database'
@@ -39,50 +52,4 @@ namespace :orchestration do
39
52
  )
40
53
  end
41
54
  end
42
-
43
- namespace :app do
44
- desc I18n.t('orchestration.rake.app.wait')
45
- task :wait do
46
- Orchestration::Services::App::Healthcheck.start(
47
- nil, nil, config_path: ENV['config'], service_name: ENV['service']
48
- )
49
- end
50
- end
51
-
52
- namespace :database do
53
- desc I18n.t('orchestration.rake.database.wait')
54
- task :wait do
55
- Orchestration::Services::Database::Healthcheck.start(
56
- nil, nil, config_path: ENV['config'], service_name: ENV['service']
57
- )
58
- end
59
- end
60
-
61
- namespace :mongo do
62
- desc I18n.t('orchestration.rake.mongo.wait')
63
- task :wait do
64
- Orchestration::Services::Mongo::Healthcheck.start(
65
- nil, nil, config_path: ENV['config'], service_name: ENV['service']
66
- )
67
- end
68
- end
69
-
70
- namespace :rabbitmq do
71
- desc I18n.t('orchestration.rake.rabbitmq.wait')
72
- task :wait do
73
- Orchestration::Services::RabbitMQ::Healthcheck.start(
74
- nil, nil, config_path: ENV['config'], service_name: ENV['service']
75
- )
76
- end
77
- end
78
-
79
- namespace :listener do
80
- desc I18n.t('orchestration.rake.listener.wait')
81
- task :wait do
82
- Orchestration::Services::Listener::Healthcheck.start(
83
- nil, nil, service_name: ENV.fetch('service'),
84
- sidecar: ENV['sidecar']
85
- )
86
- end
87
- end
88
55
  end
@@ -16,8 +16,11 @@ Gem::Specification.new do |spec|
16
16
  spec.homepage = url
17
17
 
18
18
  spec.files = Dir.chdir(File.expand_path(__dir__)) do
19
- File.readlines('MANIFEST').map(&:chomp)
19
+ `git ls-files -z`.split("\x0").reject do |f|
20
+ f.match(%r{^(test|spec|features)/})
21
+ end
20
22
  end
23
+
21
24
  spec.bindir = 'bin'
22
25
  spec.executables = []
23
26
  spec.require_paths = ['lib']
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: orchestration
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.0
4
+ version: 0.5.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bob Farrell
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-01-19 00:00:00.000000000 Z
11
+ date: 2020-09-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: database_url
@@ -318,15 +318,11 @@ files:
318
318
  - ".travis.yml"
319
319
  - Gemfile
320
320
  - LICENSE
321
- - MANIFEST
322
321
  - Makefile
323
322
  - README.md
324
323
  - Rakefile
325
324
  - bin/console
326
- - bin/rspec
327
- - bin/rubocop
328
325
  - bin/setup
329
- - bin/strong_versions
330
326
  - config/locales/en.yml
331
327
  - doc/images/example.png
332
328
  - lib/Rakefile
@@ -340,6 +336,7 @@ files:
340
336
  - lib/orchestration/docker_compose/install_generator.rb
341
337
  - lib/orchestration/docker_compose/mongo_service.rb
342
338
  - lib/orchestration/docker_compose/rabbitmq_service.rb
339
+ - lib/orchestration/docker_healthcheck.rb
343
340
  - lib/orchestration/environment.rb
344
341
  - lib/orchestration/errors.rb
345
342
  - lib/orchestration/file_helpers.rb
@@ -374,17 +371,14 @@ files:
374
371
  - lib/orchestration/templates/application.mk.erb
375
372
  - lib/orchestration/templates/database.yml.erb
376
373
  - lib/orchestration/templates/deploy.mk.erb
377
- - lib/orchestration/templates/docker-compose.override.yml.erb
378
374
  - lib/orchestration/templates/entrypoint.sh.erb
379
375
  - lib/orchestration/templates/env.erb
380
- - lib/orchestration/templates/healthcheck.rb.erb
381
376
  - lib/orchestration/templates/makefile_macros.mk.erb
382
377
  - lib/orchestration/templates/mongoid.yml.erb
383
378
  - lib/orchestration/templates/orchestration.mk.erb
384
379
  - lib/orchestration/templates/puma.rb.erb
385
380
  - lib/orchestration/templates/rabbitmq.yml.erb
386
381
  - lib/orchestration/templates/unicorn.rb.erb
387
- - lib/orchestration/templates/yaml.bash.erb
388
382
  - lib/orchestration/terminal.rb
389
383
  - lib/orchestration/version.rb
390
384
  - lib/tasks/orchestration.rake
data/MANIFEST DELETED
@@ -1,78 +0,0 @@
1
- .gitignore
2
- .rspec
3
- .rubocop.yml
4
- .strong_versions.yml
5
- .travis.yml
6
- Gemfile
7
- LICENSE
8
- MANIFEST
9
- Makefile
10
- README.md
11
- Rakefile
12
- bin/console
13
- bin/rspec
14
- bin/rubocop
15
- bin/setup
16
- bin/strong_versions
17
- config/locales/en.yml
18
- doc/images/example.png
19
- lib/Rakefile
20
- lib/orchestration.rb
21
- lib/orchestration/docker_compose.rb
22
- lib/orchestration/docker_compose/app_service.rb
23
- lib/orchestration/docker_compose/compose_configuration.rb
24
- lib/orchestration/docker_compose/compose_helpers.rb
25
- lib/orchestration/docker_compose/configuration.rb
26
- lib/orchestration/docker_compose/database_service.rb
27
- lib/orchestration/docker_compose/install_generator.rb
28
- lib/orchestration/docker_compose/mongo_service.rb
29
- lib/orchestration/docker_compose/rabbitmq_service.rb
30
- lib/orchestration/environment.rb
31
- lib/orchestration/errors.rb
32
- lib/orchestration/file_helpers.rb
33
- lib/orchestration/install_generator.rb
34
- lib/orchestration/railtie.rb
35
- lib/orchestration/service_check.rb
36
- lib/orchestration/services.rb
37
- lib/orchestration/services/app.rb
38
- lib/orchestration/services/app/configuration.rb
39
- lib/orchestration/services/app/healthcheck.rb
40
- lib/orchestration/services/database.rb
41
- lib/orchestration/services/database/adapters.rb
42
- lib/orchestration/services/database/adapters/mysql2.rb
43
- lib/orchestration/services/database/adapters/postgresql.rb
44
- lib/orchestration/services/database/adapters/sqlite3.rb
45
- lib/orchestration/services/database/configuration.rb
46
- lib/orchestration/services/database/healthcheck.rb
47
- lib/orchestration/services/listener.rb
48
- lib/orchestration/services/listener/configuration.rb
49
- lib/orchestration/services/listener/healthcheck.rb
50
- lib/orchestration/services/mixins/configuration_base.rb
51
- lib/orchestration/services/mixins/healthcheck_base.rb
52
- lib/orchestration/services/mixins/http_healthcheck.rb
53
- lib/orchestration/services/mongo.rb
54
- lib/orchestration/services/mongo/configuration.rb
55
- lib/orchestration/services/mongo/healthcheck.rb
56
- lib/orchestration/services/rabbitmq.rb
57
- lib/orchestration/services/rabbitmq/configuration.rb
58
- lib/orchestration/services/rabbitmq/healthcheck.rb
59
- lib/orchestration/settings.rb
60
- lib/orchestration/templates/Dockerfile.erb
61
- lib/orchestration/templates/application.mk.erb
62
- lib/orchestration/templates/database.yml.erb
63
- lib/orchestration/templates/deploy.mk.erb
64
- lib/orchestration/templates/docker-compose.override.yml.erb
65
- lib/orchestration/templates/entrypoint.sh.erb
66
- lib/orchestration/templates/env.erb
67
- lib/orchestration/templates/healthcheck.rb.erb
68
- lib/orchestration/templates/makefile_macros.mk.erb
69
- lib/orchestration/templates/mongoid.yml.erb
70
- lib/orchestration/templates/orchestration.mk.erb
71
- lib/orchestration/templates/puma.rb.erb
72
- lib/orchestration/templates/rabbitmq.yml.erb
73
- lib/orchestration/templates/unicorn.rb.erb
74
- lib/orchestration/templates/yaml.bash.erb
75
- lib/orchestration/terminal.rb
76
- lib/orchestration/version.rb
77
- lib/tasks/orchestration.rake
78
- orchestration.gemspec
data/bin/rspec DELETED
@@ -1,29 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # frozen_string_literal: true
3
-
4
- #
5
- # This file was generated by Bundler.
6
- #
7
- # The application 'rspec' is installed as part of a gem, and
8
- # this file is here to facilitate running it.
9
- #
10
-
11
- require "pathname"
12
- ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
13
- Pathname.new(__FILE__).realpath)
14
-
15
- bundle_binstub = File.expand_path("../bundle", __FILE__)
16
-
17
- if File.file?(bundle_binstub)
18
- if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/
19
- load(bundle_binstub)
20
- else
21
- abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
22
- Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
23
- end
24
- end
25
-
26
- require "rubygems"
27
- require "bundler/setup"
28
-
29
- load Gem.bin_path("rspec-core", "rspec")
@@ -1,29 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # frozen_string_literal: true
3
-
4
- #
5
- # This file was generated by Bundler.
6
- #
7
- # The application 'rubocop' is installed as part of a gem, and
8
- # this file is here to facilitate running it.
9
- #
10
-
11
- require "pathname"
12
- ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
13
- Pathname.new(__FILE__).realpath)
14
-
15
- bundle_binstub = File.expand_path("../bundle", __FILE__)
16
-
17
- if File.file?(bundle_binstub)
18
- if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/
19
- load(bundle_binstub)
20
- else
21
- abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
22
- Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
23
- end
24
- end
25
-
26
- require "rubygems"
27
- require "bundler/setup"
28
-
29
- load Gem.bin_path("rubocop", "rubocop")
@@ -1,29 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # frozen_string_literal: true
3
-
4
- #
5
- # This file was generated by Bundler.
6
- #
7
- # The application 'strong_versions' is installed as part of a gem, and
8
- # this file is here to facilitate running it.
9
- #
10
-
11
- require "pathname"
12
- ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
13
- Pathname.new(__FILE__).realpath)
14
-
15
- bundle_binstub = File.expand_path("../bundle", __FILE__)
16
-
17
- if File.file?(bundle_binstub)
18
- if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/
19
- load(bundle_binstub)
20
- else
21
- abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
22
- Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
23
- end
24
- end
25
-
26
- require "rubygems"
27
- require "bundler/setup"
28
-
29
- load Gem.bin_path("strong_versions", "strong_versions")
@@ -1 +0,0 @@
1
- version: <%= env.docker_api_version.to_json %>
@@ -1,56 +0,0 @@
1
- #
2
- # Orchestration Healthcheck Utility
3
- #
4
- #
5
- # https://github.com/bobf/orchestration
6
- #
7
-
8
- require 'net/http'
9
-
10
- def run
11
- client = Net::HTTP.new(
12
- ENV.fetch('WEB_HOST', 'localhost'),
13
- ENV.fetch('WEB_PORT', '8080').to_i
14
- )
15
-
16
- client.read_timeout = ENV.fetch('WEB_HEALTHCHECK_READ_TIMEOUT', '10').to_i
17
- client.open_timeout = ENV.fetch('WEB_HEALTHCHECK_OPEN_TIMEOUT', '10').to_i
18
-
19
- client.start do |request|
20
- request.get(ENV.fetch('WEB_HEALTHCHECK_PATH') { '/' })
21
- end
22
- end
23
-
24
- def success_codes
25
- ENV.fetch('WEB_HEALTHCHECK_SUCCESS_CODES', '200,202,204').split(',')
26
- end
27
-
28
- def success?(code)
29
- success_codes.include?(code.to_s)
30
- end
31
-
32
- def message(code)
33
- if success?(code)
34
- outcome = 'SUCCESS ✓ '
35
- in_or_not = 'IN'
36
- else
37
- outcome = 'FAILURE ✘ '
38
- in_or_not = 'NOT IN'
39
- end
40
-
41
- accepted = success_codes.join(', ')
42
-
43
- "# HTTP_STATUS(#{code}) #{in_or_not} [#{accepted}] : #{outcome} [#{__FILE__}]"
44
- end
45
-
46
- return_code = 1
47
-
48
- begin
49
- response = run
50
- return_code = 0 if success?(response.code)
51
- puts message(response.code)
52
- rescue Exception => e
53
- puts "[#{__FILE__}] ERROR: #{e.inspect}"
54
- ensure
55
- exit return_code
56
- end
@@ -1,22 +0,0 @@
1
- # https://stackoverflow.com/a/21189044 - thanks.
2
- function parse_yaml {
3
- local prefix=$2
4
- local s='[[:space:]]*' w='[a-zA-Z0-9_]*' fs=$(echo @|tr @ '\034')
5
- sed -ne "s|^\($s\):|\1|" \
6
- -e "s|^\($s\)\($w\)$s:$s[\"']\(.*\)[\"']$s\$|\1$fs\2$fs\3|p" \
7
- -e "s|^\($s\)\($w\)$s:$s\(.*\)$s\$|\1$fs\2$fs\3|p" $1 |
8
- awk -F$fs '{
9
- indent = length($1)/2;
10
- vname[indent] = $2;
11
- for (i in vname) {if (i > indent) {delete vname[i]}}
12
- if (length($3) > 0) {
13
- vn=""; for (i=0; i<indent; i++) {vn=(vn)(vname[i])("_")}
14
- printf("%s%s%s=\"%s\"\n", "'$prefix'",vn, $2, $3);
15
- }
16
- }'
17
- }
18
-
19
- eval $(parse_yaml ./.orchestration.yml)
20
-
21
- set -u
22
- echo -n "$(eval echo \$$1)"