matrixeval-ruby 0.2.2 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3c1fa003fd849f1a5baf6c9393c5210e030e52a14c044308f6732b602c196027
4
- data.tar.gz: 652ab5ecd63138e426a002aae768c7bd61214785ef8a8eaa698cffa2eddda1ae
3
+ metadata.gz: 526b698efa76d623a97a48ec4f9ed2d365ed9c05f2d6ea8230d7778997173dd9
4
+ data.tar.gz: fcb6eb6971632aaf115e00390c7b0230e903e4ef57421e9e0d3a192535b645b8
5
5
  SHA512:
6
- metadata.gz: fc85db98392512e7683fbfa96c54e4f34ff2f5c248ab07ceac57bd18a6781cdfac45325b874c1580c068b5a1f56a8653bc0d943baea6fcd391e3baf521038dd4
7
- data.tar.gz: af503dd911a0522975061dfb37696470adedafc4a6868019480e89cfd51c686bb5aa4f5d848683dfe9b52ba94be0d34cb7fbb7478a262c6fe62f8964f0c5c6a1
6
+ metadata.gz: fc21ef4da660bddffb12d523559c7609b6d8b232c2b38409184c9e67260b37d5acf23a0d2456afe977076f09ccf436b0b138502caf3b3db90b4d330a0050d2dd
7
+ data.tar.gz: 35085fc143ce553458ebbab452aec1a062f1faed2915098c6d9753115ca906cd19d2f335bbf5def2310f18bddd380bf43351ad23f00191d3401035892580ba0f
data/CHANGELOG.md CHANGED
@@ -1,5 +1,10 @@
1
1
  ## [Unreleased]
2
2
 
3
+ ## [0.3.0] - 2022-02-21
4
+
5
+ - Support add extra docker compose services and volumes
6
+ - Isolate each job with docker compose project name and network
7
+
3
8
  ## [0.2.2] - 2022-02-11
4
9
 
5
10
  - Auto remove containers
data/README.md CHANGED
@@ -1,6 +1,15 @@
1
1
  # matrixeval-ruby
2
2
 
3
3
  Test your ruby code against multiple versions of dependencies like Ruby, Rails, Env ...
4
+
5
+ ![](https://raw.githubusercontent.com/MatrixEval/assets/main/screenshots/summary.png)
6
+
7
+ ## Features
8
+
9
+ - Parallel test your ruby code against multiple versions of dependencies combinations.
10
+ - Test your ruby code against a specific dependencies combination.
11
+ - Choose any docker image you like for each job.
12
+ - Easy to use CLI to speed up your development efficiency
4
13
  ## Installation
5
14
 
6
15
  Add this line to your application's Gemfile:
@@ -36,6 +45,82 @@ matrixeval bash
36
45
  ```
37
46
  Run `matrixeval --help` for more details
38
47
 
48
+ ![](https://raw.githubusercontent.com/MatrixEval/assets/main/screenshots/help.png)
49
+
50
+ ### Configuration Example
51
+
52
+ Here is the configuration file `matrixeval.yml` which will auto created by `matrixeval init`
53
+
54
+ ```yaml
55
+ version: 0.3
56
+ project_name: REPLACE_ME
57
+ target: ruby
58
+ parallel_workers: number_of_processors
59
+ # commands:
60
+ # - ps
61
+ # - top
62
+ # - an_additional_command
63
+ # mounts:
64
+ # - /a/path/need/to/mount:/a/path/mount/to
65
+ matrix:
66
+ ruby:
67
+ variants:
68
+ - key: 2.7
69
+ container:
70
+ image: ruby:2.7.1
71
+ - key: 3.0
72
+ default: true
73
+ container:
74
+ image: ruby:3.0.0
75
+ - key: 3.1
76
+ container:
77
+ image: ruby:3.1.0
78
+ # - key: jruby-9.3
79
+ # container:
80
+ # image: jruby:9.3
81
+ # env:
82
+ # PATH: "/opt/jruby/bin:/app/bin:/bundle/bin:$PATH"
83
+ # mounts:
84
+ # - /a/path/need/to/mount:/a/path/mount/to
85
+
86
+ # rails:
87
+ # variants:
88
+ # - key: 6.1
89
+ # default: true
90
+ # env:
91
+ # RAILS_VERSION: "~> 6.1.0"
92
+ # - key: 7.0
93
+ # env:
94
+ # RAILS_VERSION: "~> 7.0.0"
95
+ # another:
96
+ # variants:
97
+ # - key: key1
98
+ # default: true
99
+ # env:
100
+ # ENV_KEY: 1
101
+ # - key: key2
102
+ # env:
103
+ # ENV_KEY: 2
104
+
105
+ exclude:
106
+ # - ruby: 3.0
107
+ # rails: 4.2
108
+ # - ruby: jruby-9.3
109
+ # rails: 7.0
110
+ ```
111
+
112
+ ### Gemfile configuration example
113
+
114
+ Here is an example from [ruby-trello](https://github.com/jeremytregunna/ruby-trello)
115
+
116
+ ```ruby
117
+ if active_model_version = ENV['ACTIVE_MODEL_VERSION']
118
+ gem 'activemodel', active_model_version
119
+ end
120
+ ```
121
+
122
+ You can also check its corresponding [`matrixeval.yml`](https://github.com/jeremytregunna/ruby-trello/blob/master/matrixeval.yml)
123
+
39
124
  ## Development
40
125
 
41
126
  After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
@@ -2,7 +2,11 @@ require_relative "./command_line/parse_context_arguments"
2
2
 
3
3
  module Matrixeval
4
4
  module Ruby
5
- COMMANDS = ['rake', 'rspec', 'bundle', 'bash']
5
+ COMMANDS = [
6
+ 'ruby', 'rake', 'rails', 'rspec', 'bundle',
7
+ 'bin/rake', 'bin/rails', 'bin/rspec', 'bin/test',
8
+ 'bash', 'dash', 'sh', 'zsh'
9
+ ]
6
10
 
7
11
  class CommandLine
8
12
 
@@ -1,6 +1,8 @@
1
1
  require 'yaml'
2
2
  require_relative "./vector"
3
3
  require_relative "./config/yaml"
4
+ require_relative "./docker_compose/extend_raw"
5
+ require_relative "./docker_compose/extend"
4
6
 
5
7
  module Matrixeval
6
8
  module Ruby
@@ -15,6 +17,16 @@ module Matrixeval
15
17
  YAML["target"]
16
18
  end
17
19
 
20
+ def project_name
21
+ name = YAML["project_name"]
22
+
23
+ if name.nil? || name.strip.empty?
24
+ raise Error.new('missing project_name')
25
+ end
26
+
27
+ name
28
+ end
29
+
18
30
  def vectors
19
31
  @vectors = YAML["matrix"].map do |key, vector_config|
20
32
  Vector.new(key, vector_config)
@@ -54,6 +66,32 @@ module Matrixeval
54
66
  COMMANDS + cmds
55
67
  end
56
68
 
69
+ def docker_compose_extend_raw
70
+ DockerCompose::ExtendRaw.new(
71
+ YAML["docker-compose-extend"] || {}
72
+ )
73
+ end
74
+
75
+ def env
76
+ YAML["env"] || {}
77
+ end
78
+
79
+ def mounts
80
+ YAML["mounts"] || []
81
+ end
82
+
83
+ def all_mounts
84
+ mounts + all_variant_mounts
85
+ end
86
+
87
+ private
88
+
89
+ def all_variant_mounts
90
+ Config.vectors
91
+ .map(&:variants).flatten
92
+ .map(&:mounts).flatten
93
+ end
94
+
57
95
  end
58
96
  end
59
97
  end
@@ -0,0 +1,43 @@
1
+ require 'erb'
2
+ require 'json'
3
+
4
+ module Matrixeval
5
+ module Ruby
6
+ class Context
7
+ class BuildDockerComposeExtend
8
+ class << self
9
+ def call(context)
10
+ new(context).call
11
+ end
12
+ end
13
+
14
+ attr_reader :context
15
+
16
+ def initialize(context)
17
+ @context = context
18
+ end
19
+
20
+ def matrix_combination_id
21
+ context.id
22
+ end
23
+
24
+ def call
25
+ DockerCompose::Extend.new(docker_compose_extend)
26
+ end
27
+
28
+ private
29
+
30
+ def docker_compose_extend
31
+ JSON.parse(render_erb)
32
+ end
33
+
34
+ def render_erb
35
+ ERB.new(
36
+ Config.docker_compose_extend_raw.content
37
+ ).result(binding)
38
+ end
39
+
40
+ end
41
+ end
42
+ end
43
+ end
@@ -1,4 +1,5 @@
1
1
  require_relative "./context/find_by_command_options"
2
+ require_relative "./context/build_docker_compose_extend"
2
3
 
3
4
  module Matrixeval
4
5
  module Ruby
@@ -52,7 +53,11 @@ module Matrixeval
52
53
  end
53
54
 
54
55
  def gemfile_lock_path
55
- Matrixeval.working_dir.join(".matrixeval/Gemfile.lock.#{id}")
56
+ Matrixeval.working_dir.join(".matrixeval/gemfile_locks/#{id}")
57
+ end
58
+
59
+ def docker_compose_file_path
60
+ Matrixeval.working_dir.join(".matrixeval/docker-compose/#{id}.yml")
56
61
  end
57
62
 
58
63
  def variants
@@ -72,6 +77,10 @@ module Matrixeval
72
77
  end
73
78
  end
74
79
 
80
+ def docker_compose_extend
81
+ BuildDockerComposeExtend.call(self)
82
+ end
83
+
75
84
  end
76
85
  end
77
86
  end
@@ -0,0 +1,21 @@
1
+ module Matrixeval
2
+ module Ruby
3
+ class DockerCompose
4
+ class Extend
5
+
6
+ def initialize(config)
7
+ @config = config || {}
8
+ end
9
+
10
+ def volumes
11
+ @config["volumes"] || {}
12
+ end
13
+
14
+ def services
15
+ @config["services"] || {}
16
+ end
17
+
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,19 @@
1
+ require 'json'
2
+
3
+ module Matrixeval
4
+ module Ruby
5
+ class DockerCompose
6
+ class ExtendRaw
7
+
8
+ def initialize(config)
9
+ @config = config || {}
10
+ end
11
+
12
+ def content
13
+ @config.to_json
14
+ end
15
+
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,135 @@
1
+ require "erb"
2
+
3
+ module Matrixeval
4
+ module Ruby
5
+ class DockerCompose
6
+ class File
7
+ class << self
8
+
9
+ def create_all
10
+ FileUtils.mkdir_p folder
11
+
12
+ Context.all.each do |context|
13
+ new(context).create
14
+ end
15
+ end
16
+
17
+ private
18
+
19
+ def folder
20
+ Matrixeval.working_dir.join(".matrixeval/docker-compose")
21
+ end
22
+ end
23
+
24
+ attr_reader :context
25
+
26
+ def initialize(context)
27
+ @context = context
28
+ end
29
+
30
+ def create
31
+ ::File.open(docker_compose_file_path, 'w+') do |file|
32
+ file.puts build_content
33
+ end
34
+ end
35
+
36
+ private
37
+
38
+ def docker_compose_file_path
39
+ context.docker_compose_file_path
40
+ end
41
+
42
+ def build_content
43
+ {
44
+ "version" => "3",
45
+ "services" => services_json,
46
+ "volumes" => volumes_json
47
+ }.to_yaml.sub(/---\n/, "")
48
+ end
49
+
50
+ def services_json
51
+ services = {}
52
+
53
+ services[main_variant.docker_compose_service_name] = {
54
+ "image" => main_variant.container.image,
55
+ "volumes" => mounts(main_variant),
56
+ "environment" => {
57
+ "BUNDLE_PATH" => "/bundle",
58
+ "GEM_HOME" => "/bundle",
59
+ "BUNDLE_APP_CONFIG" => "/bundle",
60
+ "BUNDLE_BIN" => "/bundle/bin",
61
+ "PATH" => "/app/bin:/bundle/bin:$PATH"
62
+ }.merge(extra_env),
63
+ "working_dir" => "/app"
64
+ }.merge(depends_on)
65
+
66
+ services.merge(docker_compose_extend.services)
67
+ end
68
+
69
+ def volumes_json
70
+ {
71
+ bundle_volume => {
72
+ "name" => bundle_volume
73
+ }
74
+ }.merge(docker_compose_extend.volumes)
75
+ end
76
+
77
+ def depends_on
78
+ if docker_compose_extend.services.keys.empty?
79
+ {}
80
+ else
81
+ { "depends_on" => docker_compose_extend.services.keys }
82
+ end
83
+ end
84
+
85
+ def extra_env
86
+ Config.env.merge(context.env)
87
+ .merge(main_variant.container.env)
88
+ end
89
+
90
+ def main_variant
91
+ context.main_variant
92
+ end
93
+
94
+ def bundle_volume
95
+ main_variant.bundle_volume_name
96
+ end
97
+
98
+ def mounts(variant)
99
+ [
100
+ "../..:/app:cached",
101
+ "#{variant.bundle_volume_name}:/bundle",
102
+ "../gemfile_locks/#{context.id}:/app/Gemfile.lock"
103
+ ] + extra_mounts
104
+ end
105
+
106
+ def extra_mounts
107
+ mounts = Config.mounts + context.variants.map(&:mounts).flatten
108
+ mounts.map do |mount|
109
+ local_path, in_docker_path = mount.split(':')
110
+ next mount if Pathname.new(local_path).absolute?
111
+
112
+ local_path = Matrixeval.working_dir.join(local_path)
113
+ docker_compose_folder_path = Matrixeval.working_dir.join(".matrixeval/docker-compose")
114
+ local_path = local_path.relative_path_from docker_compose_folder_path
115
+
116
+ "#{local_path}:#{in_docker_path}"
117
+ end
118
+ end
119
+
120
+ def docker_compose_extend
121
+ @docker_compose_extend ||= context.docker_compose_extend
122
+ end
123
+
124
+ def working_dir_name
125
+ Matrixeval.working_dir.basename
126
+ end
127
+
128
+ def project_name
129
+ Config.project_name.gsub(/[^A-Za-z0-9-]/,'_').downcase
130
+ end
131
+
132
+ end
133
+ end
134
+ end
135
+ end
@@ -1,16 +1,10 @@
1
1
 
2
- require_relative "./docker_compose/yaml"
2
+ require_relative "./docker_compose/file"
3
3
 
4
4
  module Matrixeval
5
5
  module Ruby
6
6
  class DockerCompose
7
7
 
8
- class << self
9
- def clean_containers
10
- system("docker compose -f .matrixeval/docker-compose.yml rm --all -f >> /dev/null 2>&1")
11
- end
12
- end
13
-
14
8
  attr_reader :context
15
9
 
16
10
  def initialize(context)
@@ -18,34 +12,55 @@ module Matrixeval
18
12
  end
19
13
 
20
14
  def run(arguments)
21
- forward_arguments = arguments.join(" ")
15
+ forward_arguments = arguments.map do |arg|
16
+ arg.match(/\s/) ? "\"#{arg}\"" : arg
17
+ end.join(" ")
18
+
19
+ no_tty = %w[bash sh zsh dash].include?(arguments[0]) ? '' : '--no-TTY'
22
20
 
23
21
  system(
24
22
  <<~DOCKER_COMPOSE_COMMAND
25
- docker compose -f .matrixeval/docker-compose.yml \
23
+ #{docker_compose} \
26
24
  run --rm \
27
- #{env} \
28
- #{gemfile_mount} \
29
- #{docker_compose_service_name} \
25
+ #{no_tty} \
26
+ #{context.docker_compose_service_name} \
30
27
  #{forward_arguments}
31
28
  DOCKER_COMPOSE_COMMAND
32
29
  )
30
+ ensure
31
+ stop_containers
32
+ clean_containers_and_anonymous_volumes
33
+ turn_on_stty_opost
33
34
  end
34
35
 
35
36
  private
36
37
 
37
- def env
38
- context.env.map do |k, v|
39
- "-e #{k}='#{v}'"
40
- end.join(" ")
38
+ def stop_containers
39
+ system("#{docker_compose} stop >> /dev/null 2>&1")
40
+ end
41
+
42
+ def clean_containers_and_anonymous_volumes
43
+ system("#{docker_compose} rm -v -f >> /dev/null 2>&1")
44
+ end
45
+
46
+ def docker_compose
47
+ <<~DOCKER_COMPOSE_COMMAND.strip
48
+ docker --log-level error compose \
49
+ -f #{yaml_file} \
50
+ -p matrixeval-#{project_name}-#{context.id}
51
+ DOCKER_COMPOSE_COMMAND
52
+ end
53
+
54
+ def yaml_file
55
+ ".matrixeval/docker-compose/#{context.id}.yml"
41
56
  end
42
57
 
43
- def gemfile_mount
44
- "-v ./.matrixeval/Gemfile.lock.#{context.id}:/app/Gemfile.lock"
58
+ def turn_on_stty_opost
59
+ system("stty opost")
45
60
  end
46
61
 
47
- def docker_compose_service_name
48
- context.docker_compose_service_name
62
+ def project_name
63
+ Config.project_name.gsub(/[^A-Za-z0-9-]/,'_').downcase
49
64
  end
50
65
 
51
66
  end
@@ -0,0 +1,23 @@
1
+ module Matrixeval
2
+ module Ruby
3
+ class ExtraMountFiles
4
+ class << self
5
+
6
+ def create
7
+ Config.all_mounts.each do |mount|
8
+ local_path, _ = mount.split(':')
9
+ next mount if Pathname.new(local_path).absolute?
10
+
11
+ local_path = Matrixeval.working_dir.join(local_path)
12
+ next if local_path.extname.empty?
13
+ next if local_path.ascend.none? { |path| path == Matrixeval.working_dir }
14
+
15
+ FileUtils.mkdir_p local_path.dirname
16
+ FileUtils.touch local_path
17
+ end
18
+ end
19
+
20
+ end
21
+ end
22
+ end
23
+ end
@@ -4,7 +4,7 @@ module Matrixeval
4
4
  class << self
5
5
 
6
6
  def create
7
- FileUtils.mkdir_p dot_matrixeval_folder
7
+ FileUtils.mkdir_p gemfile_lock_folder
8
8
 
9
9
  Context.all.each do |context|
10
10
  FileUtils.touch context.gemfile_lock_path
@@ -13,8 +13,8 @@ module Matrixeval
13
13
 
14
14
  private
15
15
 
16
- def dot_matrixeval_folder
17
- Matrixeval.working_dir.join(".matrixeval")
16
+ def gemfile_lock_folder
17
+ Matrixeval.working_dir.join(".matrixeval/gemfile_locks")
18
18
  end
19
19
 
20
20
  end
@@ -41,7 +41,7 @@ module Matrixeval
41
41
  end
42
42
 
43
43
  def gemfile_locks
44
- ".matrixeval/Gemfile.lock.*"
44
+ ".matrixeval/gemfile_locks"
45
45
  end
46
46
 
47
47
  def gitignore_path
@@ -45,7 +45,6 @@ module Matrixeval
45
45
  exit
46
46
  ensure
47
47
  turn_on_stty_opost
48
- DockerCompose.clean_containers
49
48
  end
50
49
 
51
50
  private
@@ -67,9 +66,10 @@ module Matrixeval
67
66
 
68
67
  def run_all_contexts
69
68
  Config::YAML.create
70
- DockerCompose::YAML.create
69
+ DockerCompose::File.create_all
71
70
  GemfileLocks.create
72
71
  Gitignore.update
72
+ ExtraMountFiles.create
73
73
 
74
74
  pull_all_images
75
75
 
@@ -111,9 +111,10 @@ module Matrixeval
111
111
 
112
112
  def run_a_specific_context
113
113
  Config::YAML.create
114
- DockerCompose::YAML.create
114
+ DockerCompose::File.create_all
115
115
  GemfileLocks.create
116
116
  Gitignore.update
117
+ ExtraMountFiles.create
117
118
 
118
119
  context = Context.find_by_command_options!(command.context_options)
119
120
 
@@ -1,14 +1,15 @@
1
- version: 0.2
1
+ version: 0.3
2
+ project_name: REPLACE_ME
2
3
  target: ruby
3
4
  parallel_workers: number_of_processors
4
5
  # commands:
5
6
  # - ps
6
7
  # - top
7
8
  # - an_additional_command
9
+ # mounts:
10
+ # - /a/path/need/to/mount:/a/path/mount/to
8
11
  matrix:
9
12
  ruby:
10
- # mounts:
11
- # - /a/path/need/to/mount:/a/path/mount/to
12
13
  variants:
13
14
  - key: 2.7
14
15
  container:
@@ -23,8 +24,10 @@ matrix:
23
24
  # - key: jruby-9.3
24
25
  # container:
25
26
  # image: jruby:9.3
26
- # env:
27
+ # env:
27
28
  # PATH: "/opt/jruby/bin:/app/bin:/bundle/bin:$PATH"
29
+ # mounts:
30
+ # - /a/path/need/to/mount:/a/path/mount/to
28
31
 
29
32
  # rails:
30
33
  # variants:
@@ -9,7 +9,7 @@ module Matrixeval
9
9
  end
10
10
  end
11
11
 
12
- attr_reader :key, :env, :vector, :default, :container
12
+ attr_reader :key, :env, :vector, :default, :container, :mounts
13
13
 
14
14
  def initialize(config = {}, vector)
15
15
  raise Error.new("Variant#key is missing") if config["key"].nil?
@@ -19,6 +19,7 @@ module Matrixeval
19
19
  @container = Container.new(config["container"])
20
20
  @env = config["env"] || {}
21
21
  @default = config["default"] || false
22
+ @mounts = config["mounts"] || []
22
23
  end
23
24
 
24
25
  def name
@@ -3,11 +3,10 @@ require_relative "./variant"
3
3
  module Matrixeval
4
4
  module Ruby
5
5
  class Vector
6
- attr_reader :key, :variants, :mounts
6
+ attr_reader :key, :variants
7
7
 
8
8
  def initialize(key, config)
9
9
  @key = key.to_s
10
- @mounts = config["mounts"] || []
11
10
  @variants = (config["variants"] || []).map do |variant_config|
12
11
  config = if variant_config.is_a?(Hash)
13
12
  variant_config
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Matrixeval
4
4
  module Ruby
5
- VERSION = "0.2.2"
5
+ VERSION = "0.3.0"
6
6
  end
7
7
  end
@@ -5,6 +5,7 @@ require 'rainbow'
5
5
  require 'matrixeval/ruby/docker_compose'
6
6
  require 'matrixeval/ruby/context'
7
7
  require 'matrixeval/ruby/gemfile_locks'
8
+ require 'matrixeval/ruby/extra_mount_files'
8
9
  require 'matrixeval/ruby/runner'
9
10
  require 'matrixeval/ruby/gitignore'
10
11
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: matrixeval-ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.2
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Hopper Gee
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-02-11 00:00:00.000000000 Z
11
+ date: 2022-02-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rainbow
@@ -79,9 +79,13 @@ files:
79
79
  - lib/matrixeval/ruby/config/yaml.rb
80
80
  - lib/matrixeval/ruby/container.rb
81
81
  - lib/matrixeval/ruby/context.rb
82
+ - lib/matrixeval/ruby/context/build_docker_compose_extend.rb
82
83
  - lib/matrixeval/ruby/context/find_by_command_options.rb
83
84
  - lib/matrixeval/ruby/docker_compose.rb
84
- - lib/matrixeval/ruby/docker_compose/yaml.rb
85
+ - lib/matrixeval/ruby/docker_compose/extend.rb
86
+ - lib/matrixeval/ruby/docker_compose/extend_raw.rb
87
+ - lib/matrixeval/ruby/docker_compose/file.rb
88
+ - lib/matrixeval/ruby/extra_mount_files.rb
85
89
  - lib/matrixeval/ruby/gemfile_locks.rb
86
90
  - lib/matrixeval/ruby/gitignore.rb
87
91
  - lib/matrixeval/ruby/runner.rb
@@ -1,77 +0,0 @@
1
- require "erb"
2
-
3
- module Matrixeval
4
- module Ruby
5
- class DockerCompose
6
- class YAML
7
- class << self
8
-
9
- def create
10
- FileUtils.mkdir_p dot_matrixeval_folder
11
-
12
- File.open(path, 'w+') do |file|
13
- file.puts build_content
14
- end
15
- end
16
-
17
- private
18
-
19
- def build_content
20
- {
21
- "version" => "3",
22
- "services" => services_json,
23
- "volumes" => volumes_json
24
- }.to_yaml.sub(/---\n/, "")
25
- end
26
-
27
- def services_json
28
- services = {}
29
-
30
- Config.main_vector_variants.map do |variant|
31
- services[variant.docker_compose_service_name] = {
32
- "image" => variant.container.image,
33
- "volumes" => mounts(variant),
34
- "environment" => {
35
- "BUNDLE_PATH" => "/bundle",
36
- "GEM_HOME" => "/bundle",
37
- "BUNDLE_APP_CONFIG" => "/bundle",
38
- "BUNDLE_BIN" => "/bundle/bin",
39
- "PATH" => "/app/bin:/bundle/bin:$PATH"
40
- }.merge(variant.container.env),
41
- "working_dir" => "/app"
42
- }
43
- end
44
-
45
- services
46
- end
47
-
48
- def volumes_json
49
- bundle_volumes.map do |volume|
50
- [volume, {"name" => volume}]
51
- end.to_h
52
- end
53
-
54
- def bundle_volumes
55
- Config.main_vector_variants.map(&:bundle_volume_name)
56
- end
57
-
58
- def mounts(variant)
59
- [
60
- "..:/app:cached",
61
- "#{variant.bundle_volume_name}:/bundle",
62
- ] + Config.main_vector.mounts
63
- end
64
-
65
- def path
66
- dot_matrixeval_folder.join("docker-compose.yml")
67
- end
68
-
69
- def dot_matrixeval_folder
70
- Matrixeval.working_dir.join(".matrixeval")
71
- end
72
-
73
- end
74
- end
75
- end
76
- end
77
- end