orchestration 0.6.0 → 0.6.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 219067059e72b472f7697df1659e31d7d25b3f531a487ef0270949c95e427238
4
- data.tar.gz: '079a57d5c7a6a3b59eefbd2e4b6be1b1630686d4c447b97a137c8a967f2c51a6'
3
+ metadata.gz: 99bdeb106830843d2a0e600151a4d80b411d21e86f25010d6c2379810ef85273
4
+ data.tar.gz: 4b3828ec78541d1680d3e5749c0a2e428bed328313d17e13d3f4e0dc1bdb0e8b
5
5
  SHA512:
6
- metadata.gz: e277c0fac7a4f73254c8d011eb3a47b40bd92385b3348a21a345ab8188f246ebacd6f031edfb53fc18ba1d815c45540fd9b4c31fbaf44aa555c52fb6852f4159
7
- data.tar.gz: 2ecf615a685df475723c4aef1bb86d60d7e400891a79af22941b2d5dd08f356db461492aa1fd092528e907ca4cc51ff8cb1a55c2d226dc51b99168a8f30fba50
6
+ metadata.gz: 0e5a03e78c1e442daa079a5d92540df52a148b7ea08b8fa3ecd55919d045e7fc239d5638d8a850565044b9c1d7065b39c4401a72db0daef0d299c622e86ee02f
7
+ data.tar.gz: e2061ef7628599f65c05d28380376ef841a329f85408c2dfa84172907ada7392dc0ba556b01a6559f3869b1f7b6809304615ebe91a9970e71adc31d04a0e82ed
data/README.md CHANGED
@@ -13,6 +13,8 @@ make deploy manager=user@swarm.example.com env_file=/var/configs/myapp.env
13
13
 
14
14
  _Orchestration_ has been successfully used to build continuous delivery pipelines for numerous production applications with a wide range or requirements.
15
15
 
16
+ See [upgrade guide](UPGRADE.md) if you are upgrading from `0.5.x` to `0.6.x`.
17
+
16
18
  ## Example
17
19
 
18
20
  The below screenshot demonstrates _Orchestration_ being installed in a brand new _Rails_ application with support for _PostgreSQL_ (via the _PG_ gem) and _RabbitMQ_ (via the _Bunny_ gem):
@@ -27,7 +29,7 @@ The below screenshot demonstrates _Orchestration_ being installed in a brand new
27
29
  Add _Orchestration_ to your Gemfile:
28
30
 
29
31
  ```ruby
30
- gem 'orchestration', '~> 0.6.0'
32
+ gem 'orchestration', '~> 0.6.4'
31
33
  ```
32
34
 
33
35
  Install:
data/UPGRADE.md ADDED
@@ -0,0 +1,90 @@
1
+ # Upgrade guide
2
+
3
+ ## 0.5 to 0.6
4
+
5
+ ### Delete/rename files
6
+
7
+ Delete all files from `orchestration/` directory except:
8
+
9
+ * `docker-compose.production.yml`
10
+ * `docker-compose.development.yml`
11
+ * `docker-compose.test.yml`
12
+ * `Dockerfile`
13
+ * `entrypoint.sh`
14
+
15
+ Rename:
16
+
17
+ ```bash
18
+ orchestration/docker-compose.production.yml => orchestration/docker-compose.deployment.yml
19
+ ```
20
+
21
+ Any environment-specific compose files (e.g. `staging`) should also be removed as the same compose file is now used for all deployment stages.
22
+
23
+ ### Update Makefile
24
+
25
+ Remove the first line of the main `Makefile` (in root of project) and replace it with the new `include` declaration:
26
+
27
+ #### OLD
28
+
29
+ ```make
30
+ include orchestration/Makefile
31
+ ```
32
+
33
+ #### NEW
34
+
35
+ ```make
36
+ include $(shell bundle exec ruby -e 'require "orchestration/make"')
37
+ ```
38
+
39
+ #### Post-setup target
40
+
41
+ Add a new target anywhere in the `Makefile` called `post-setup`:
42
+
43
+ ```make
44
+ .PHONY: post-setup
45
+ post-setup:
46
+ echo 'doing post setup stuff'
47
+ ```
48
+
49
+ Replace the body of this target with any commands that you want to take place once the initial setup (launching development/test containers, running migrations, etc.) is complete. For example, running migrations for a secondary database.
50
+
51
+ ### Continuous Integration files
52
+
53
+ Update any continuous integration scripts (e.g. `Jenkinsfile`) to run the `setup` target before `test`, e.g.:
54
+
55
+ #### OLD
56
+
57
+ ```Jenkinsfile
58
+ stage('Test') {
59
+ steps {
60
+ sh 'make test sidecar=1'
61
+ }
62
+ }
63
+ ```
64
+
65
+ #### NEW
66
+
67
+ ```Jenkinsfile
68
+ stage('Test') {
69
+ steps {
70
+ sh 'make setup test sidecar=1'
71
+ }
72
+ }
73
+ ```
74
+
75
+ (`sidecar` may or may not be needed depending on your setup but, if it was there prior to upgrade, then it should remain after upgrade).
76
+
77
+ ### General Usage
78
+
79
+ All _Orchestration_ commands behave exactly the same as before with the exception of the `test` target. Now, instead of running `make test` to launch all containers and then run tests, _Rubocop_, etc., you must run `make setup test`.
80
+
81
+ This will set up the test environment and then run tests. You may then run `make test` to just run tests without having to go through the full setup process again.
82
+
83
+ Similarly you can set up the development environment by just running `make setup`.
84
+
85
+ To set up the test environment and run tests as two separate steps (i.e. equivalent of using the shorthand `make setup test`) you can run:
86
+
87
+ ```bash
88
+ make setup RAILS_ENV=test
89
+ make test
90
+ ```
@@ -29,6 +29,7 @@ en:
29
29
  rake:
30
30
  config: "Parse and output Orchestration config (internal use)"
31
31
  healthcheck: "Execute healthcheck; used for HEALTHCHECK command in Docker image"
32
+ compose_services: "Output configured services for a given environment (RAILS_ENV)"
32
33
  install: "Install Orchestration tools"
33
34
  install_makefile: "(Re)create orchestration/Makefile"
34
35
  wait: "Wait for development/test dependencies to be available"
@@ -98,9 +98,10 @@ module Orchestration
98
98
  'RAILS_LOG_TO_STDOUT' => '1',
99
99
  'RAILS_SERVE_STATIC_FILES' => '1',
100
100
  'WEB_PRELOAD_APP' => '1',
101
- 'WEB_HEALTHCHECK_PATH' => '/',
101
+ 'WEB_HEALTHCHECK_PATH' => '/healthcheck',
102
+ 'WEB_PORT' => 8080,
102
103
  'DATABASE_URL' => database_url
103
- }.merge(inherited_environment.map { |key| [key, nil] }.to_h).merge(rabbitmq_urls)
104
+ }.merge(inherited_environment.to_h { |key| [key, nil] }).merge(rabbitmq_urls)
104
105
  end
105
106
 
106
107
  def rabbitmq_urls
@@ -114,7 +115,7 @@ module Orchestration
114
115
  'postgresql' => 'postgresql://postgres:password@database-local:5432/production',
115
116
  'mysql2' => 'mysql2://root:password@database-local:3306/production',
116
117
  'sqlite3' => 'sqlite3:db/production.sqlite3'
117
- }.fetch(DockerCompose::ComposeConfiguration.database_adapter_name)
118
+ }.fetch(DockerCompose::ComposeConfiguration.database_adapter_name, nil)
118
119
  end
119
120
 
120
121
  def inherited_environment
@@ -48,6 +48,8 @@ module Orchestration
48
48
 
49
49
  def config
50
50
  @config ||= @env.docker_compose_config
51
+ rescue Errno::ENOENT
52
+ {}
51
53
  end
52
54
 
53
55
  def listener?(name)
@@ -69,12 +69,12 @@ module Orchestration
69
69
  end
70
70
 
71
71
  def default_app_name
72
- default = docker_filter(root.basename.to_s)
72
+ default = docker_filter(root.basename.to_s, underscore: true)
73
73
  return default unless defined?(Rails)
74
74
  # Edge case if Rails is used as a dependency but we are not a Rails app:
75
75
  return default if rails_application == Object
76
76
 
77
- docker_filter(rails_application.name.underscore)
77
+ docker_filter(rails_application.name.underscore, underscore: true)
78
78
  end
79
79
 
80
80
  def rabbitmq_url
@@ -126,10 +126,14 @@ module Orchestration
126
126
  app_class.parent
127
127
  end
128
128
 
129
- def docker_filter(string)
129
+ def docker_filter(string, underscore: false)
130
130
  # Filter out characters not accepted by Docker Hub
131
131
  permitted = [('0'..'9'), ('a'..'z')].map(&:to_a).flatten
132
- string.chars.select { |char| permitted.include?(char) }.join
132
+ string.chars.select do |char|
133
+ next true if underscore && char == '_'
134
+
135
+ permitted.include?(char)
136
+ end.join
133
137
  end
134
138
  end
135
139
  end
@@ -30,7 +30,6 @@ module Orchestration
30
30
  def application_makefile
31
31
  path = @env.root.join('Makefile')
32
32
  simple_copy('application.mk', path) unless File.exist?(path)
33
- inject_if_missing(path, 'include orchestration/Makefile')
34
33
  end
35
34
 
36
35
  def dockerfile
@@ -141,6 +141,8 @@ docker_config:=$(shell DEVPACK_DISABLE=1 RAILS_ENV=development ${bundle_cmd} rak
141
141
  docker_organization=$(word 1,$(docker_config))
142
142
  docker_repository=$(word 2,$(docker_config))
143
143
 
144
+ compose_services:=$(shell ${rake} orchestration:compose_services RAILS_ENV=${env})
145
+
144
146
  ifeq (,$(project_name))
145
147
  project_base = ${docker_repository}_${env}
146
148
  else
@@ -209,9 +211,10 @@ ifndef network
209
211
  start: network := ${compose_project_name}
210
212
  endif
211
213
  start: _create-log-directory _clean-logs
214
+ ifneq (,${compose_services})
212
215
  @$(call system,${compose_human} up --detach)
213
216
  ifeq (${env},$(filter ${env},test development))
214
- @${compose} up --detach --force-recreate --renew-anon-volumes --remove-orphans ${services} ${log} || ${exit_fail}
217
+ ${compose} up --detach --force-recreate --renew-anon-volumes --remove-orphans ${services} ${log} || ${exit_fail}
215
218
  @[ -n '${sidecar}' ] && \
216
219
  ( \
217
220
  $(call echo,(joining dependency network ${cyan}${network}${reset})) ; \
@@ -229,10 +232,12 @@ endif
229
232
  @$(call echo,${env_human} containers started ${tick})
230
233
  @$(call echo,Waiting for services to become available)
231
234
  @$(call make,wait) 2>${stderr} || ${exit_fail}
235
+ endif
232
236
 
233
237
  .PHONY: stop
234
238
  stop: network := ${compose_project_name}
235
239
  stop:
240
+ ifneq (,${compose_services})
236
241
  @$(call echo,Stopping ${env_human} containers)
237
242
  @$(call system,${compose_human} down)
238
243
  @if docker ps --format "{{.ID}}" | grep -q $(shell hostname) ; \
@@ -244,6 +249,7 @@ stop:
244
249
  ${compose} down ${log} || ${exit_fail} ; \
245
250
  fi
246
251
  @$(call echo,${env_human} containers stopped ${tick})
252
+ endif
247
253
 
248
254
  .PHONY: logs
249
255
  logs:
@@ -288,7 +294,9 @@ db-console:
288
294
  @${rake} orchestration:db:console RAILS_ENV=${env}
289
295
 
290
296
  .PHONY: setup
297
+ ifneq (,$(wildcard config/database.yml))
291
298
  setup: url = $(shell ${rake} orchestration:db:url RAILS_ENV=${env})
299
+ endif
292
300
  setup: _log-notify
293
301
  @$(call echo,Setting up ${env_human} environment)
294
302
  @$(call make,start env=${env})
@@ -297,8 +305,8 @@ ifneq (,$(wildcard config/database.yml))
297
305
  @$(call system,rake db:create DATABASE_URL="${url}")
298
306
  @${rake} db:create RAILS_ENV=${env} ${log} || : ${log}
299
307
  ifneq (,$(wildcard db/structure.sql))
300
- @$(call system,rake db:structure:load DATABASE_URL="${url}")
301
- @${rake} db:structure:load DATABASE_URL='${url}' ${log} || ${exit_fail}
308
+ @$(call system,rake db:schema:load DATABASE_URL="${url}")
309
+ @${rake} db:schema:load DATABASE_URL='${url}' ${log} || ${exit_fail}
302
310
  else ifneq (,$(wildcard db/schema.rb))
303
311
  @$(call system,rake db:schema:load DATABASE_URL="${url}")
304
312
  @${rake} db:schema:load DATABASE_URL='${url}' ${log} || ${exit_fail}
@@ -306,9 +314,9 @@ ifneq (,$(wildcard config/database.yml))
306
314
  @$(call system,rake db:migrate DATABASE_URL="${url}")
307
315
  @${rake} db:migrate RAILS_ENV=${env}
308
316
  endif
309
- @$(MAKE) -n post-setup >/dev/null 2>&1 \
310
- && $(call system,make post-setup RAILS_ENV=${env}) \
311
- && $(MAKE) post-setup RAILS_ENV=${env}
317
+ @if $(MAKE) -n post-setup >/dev/null 2>&1; then \
318
+ $(call system,make post-setup RAILS_ENV=${env}) \
319
+ && $(MAKE) post-setup RAILS_ENV=${env}; fi
312
320
  @$(call echo,${env_human} environment setup complete ${tick})
313
321
 
314
322
  .PHONY: dump
@@ -437,12 +445,11 @@ endif
437
445
  ifdef include
438
446
  @$(call echo,Including files from: ${cyan}${include}${reset})
439
447
  @(while read line; do \
440
- _system () { echo '${system_prefix}' $$1 }
441
448
  export line; \
442
449
  include_dir="${build_dir}/$$(dirname "$${line}")/" && \
443
450
  mkdir -p "$${include_dir}" && cp "$${line}" "$${include_dir}" \
444
451
  && (cd '${orchestration_dir}/.build/' && tar rf 'context.tar' "$${line}"); \
445
- _system "tar rf 'context.tar' '$${line}'")
452
+ echo "${system_prefix}" "tar rf 'context.tar' '$${line}'"; \
446
453
  done < '${include}') ${log} || ${exit_fail}
447
454
  @$(call echo,Build context ${green}ready${reset} ${tick})
448
455
  endif
@@ -19,7 +19,9 @@ RUN curl -sL https://deb.nodesource.com/setup_14.x | bash - \
19
19
  && npm install -g yarn<% end %>
20
20
  WORKDIR /app
21
21
  COPY .build/Gemfile .build/Gemfile.lock ./
22
- RUN bundle install --without development test --deployment
22
+ RUN bundle config set deployment 'true' \
23
+ && bundle config set without 'development test' \
24
+ && bundle install
23
25
  ADD .build/context.tar .
24
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 %>
25
27
  RUN echo "${GIT_COMMIT}" > /app/GIT_COMMIT
@@ -24,7 +24,7 @@ test:
24
24
  #
25
25
  .PHONY: post-setup
26
26
  post-setup:
27
- # Setup tasks that are not already provided by Orchestration go here.
27
+ @# Setup tasks that are not already provided by Orchestration go here.
28
28
 
29
29
  #
30
30
  # Launch all dependencies needed for a development environment and set up the
@@ -1,6 +1,6 @@
1
1
  environment ENV.fetch('RAILS_ENV') { 'development' }
2
2
 
3
- port ENV.fetch('WEB_PORT') { 8080 }
3
+ port ENV.fetch('WEB_PORT') { 3000 }
4
4
  workers ENV.fetch('WEB_CONCURRENCY') { 4 }
5
5
  threads_count = ENV.fetch('RAILS_MAX_THREADS') { 8 }
6
6
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Orchestration
4
- VERSION = '0.6.0'
4
+ VERSION = '0.6.4'
5
5
  end
@@ -22,7 +22,13 @@ namespace :orchestration do
22
22
  namespace :db do
23
23
  desc I18n.t('orchestration.rake.db.url')
24
24
  task :url do
25
- puts DatabaseUrl.to_active_record_url(Rails.application.config_for(:database))
25
+ config = Rails.application.config_for(:database)
26
+
27
+ if config[:adapter] == 'sqlite3'
28
+ puts "sqlite3:#{config[:database]}"
29
+ else
30
+ puts DatabaseUrl.to_active_record_url(config)
31
+ end
26
32
  end
27
33
 
28
34
  desc I18n.t('orchestration.rake.db.console')
@@ -33,6 +39,12 @@ namespace :orchestration do
33
39
  end
34
40
  end
35
41
 
42
+ desc I18n.t('orchestration.rake.compose_services')
43
+ task :compose_services do
44
+ config = Orchestration::DockerCompose::ComposeConfiguration.new(Orchestration::Environment.new)
45
+ puts config.services.keys.join(' ') unless config.services.nil? || config.services.empty?
46
+ end
47
+
36
48
  desc I18n.t('orchestration.rake.healthcheck')
37
49
  task :healthcheck do
38
50
  Orchestration::DockerHealthcheck.execute
@@ -14,6 +14,7 @@ Gem::Specification.new do |spec|
14
14
  spec.summary = 'Docker orchestration toolkit'
15
15
  spec.description = 'Tools to help launch apps in Docker'
16
16
  spec.homepage = url
17
+ spec.metadata['rubygems_mfa_required'] = 'true'
17
18
 
18
19
  spec.files = Dir.chdir(File.expand_path(__dir__)) do
19
20
  `git ls-files -z`.split("\x0").reject do |f|
@@ -21,7 +22,7 @@ Gem::Specification.new do |spec|
21
22
  end
22
23
  end
23
24
 
24
- spec.required_ruby_version = '~> 2.6'
25
+ spec.required_ruby_version = '~> 2.7'
25
26
  spec.bindir = 'bin'
26
27
  spec.executables = []
27
28
  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.6.0
4
+ version: 0.6.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bob Farrell
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-04-06 00:00:00.000000000 Z
11
+ date: 2021-12-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: database_url
@@ -349,6 +349,7 @@ files:
349
349
  - Makefile
350
350
  - README.md
351
351
  - Rakefile
352
+ - UPGRADE.md
352
353
  - bin/console
353
354
  - bin/setup
354
355
  - config/locales/en.yml
@@ -413,7 +414,8 @@ files:
413
414
  - orchestration.gemspec
414
415
  homepage: https://github.com/bobf/orchestration
415
416
  licenses: []
416
- metadata: {}
417
+ metadata:
418
+ rubygems_mfa_required: 'true'
417
419
  post_install_message:
418
420
  rdoc_options: []
419
421
  require_paths:
@@ -422,14 +424,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
422
424
  requirements:
423
425
  - - "~>"
424
426
  - !ruby/object:Gem::Version
425
- version: '2.6'
427
+ version: '2.7'
426
428
  required_rubygems_version: !ruby/object:Gem::Requirement
427
429
  requirements:
428
430
  - - ">="
429
431
  - !ruby/object:Gem::Version
430
432
  version: '0'
431
433
  requirements: []
432
- rubygems_version: 3.0.3
434
+ rubygems_version: 3.1.6
433
435
  signing_key:
434
436
  specification_version: 4
435
437
  summary: Docker orchestration toolkit