gemika 0.3.2 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.github/workflows/test.yml +122 -0
- data/.gitignore +1 -1
- data/.ruby-version +1 -1
- data/CHANGELOG.md +75 -0
- data/{gemfiles/Gemfile.3.2.mysql2 → Gemfile.3.2.mysql2} +3 -2
- data/{gemfiles/Gemfile.3.2.mysql2.lock → Gemfile.3.2.mysql2.lock} +19 -5
- data/{gemfiles/Gemfile.4.2.mysql2 → Gemfile.4.2.mysql2} +3 -2
- data/{gemfiles/Gemfile.4.2.mysql2.lock → Gemfile.4.2.mysql2.lock} +11 -4
- data/{gemfiles/Gemfile.4.2.pg → Gemfile.4.2.pg} +2 -1
- data/{gemfiles/Gemfile.4.2.pg.lock → Gemfile.4.2.pg.lock} +9 -3
- data/{gemfiles/Gemfile.5.0.mysql2 → Gemfile.5.2.mysql2} +4 -3
- data/{gemfiles/Gemfile.5.0.mysql2.lock → Gemfile.5.2.mysql2.lock} +28 -20
- data/{gemfiles/Gemfile.5.0.pg → Gemfile.5.2.pg} +3 -2
- data/{gemfiles/Gemfile.5.0.pg.lock → Gemfile.5.2.pg.lock} +26 -18
- data/Gemfile.5.2.sqlite3 +17 -0
- data/Gemfile.5.2.sqlite3.lock +67 -0
- data/Gemfile.6.0.pg +17 -0
- data/Gemfile.6.0.pg.lock +67 -0
- data/README.md +144 -71
- data/gemika.gemspec +2 -2
- data/lib/gemika/database.rb +13 -3
- data/lib/gemika/env.rb +6 -0
- data/lib/gemika/errors.rb +2 -0
- data/lib/gemika/github_actions_generator.rb +150 -0
- data/lib/gemika/matrix.rb +38 -33
- data/lib/gemika/matrix/github_actions_config.rb +61 -0
- data/lib/gemika/matrix/travis_config.rb +42 -0
- data/lib/gemika/tasks.rb +1 -0
- data/lib/gemika/tasks/gemika.rb +14 -0
- data/lib/gemika/tasks/matrix.rb +4 -4
- data/lib/gemika/version.rb +1 -1
- data/spec/fixtures/github_actions_yml/Gemfile_without_gemika +1 -0
- data/spec/fixtures/github_actions_yml/excludes.yml +13 -0
- data/spec/fixtures/github_actions_yml/gemfile_without_gemika.yml +8 -0
- data/spec/fixtures/github_actions_yml/includes.yml +20 -0
- data/spec/fixtures/github_actions_yml/invalid.yml +8 -0
- data/spec/fixtures/github_actions_yml/missing_gemfile.yml +8 -0
- data/spec/fixtures/github_actions_yml/multiple_jobs.yml +16 -0
- data/spec/fixtures/github_actions_yml/two_by_two.yml +10 -0
- data/spec/fixtures/migrate/expected_github_actions.yml +129 -0
- data/spec/fixtures/migrate/travis.yml +66 -0
- data/spec/fixtures/travis_yml/includes.yml +12 -0
- data/spec/gemika/matrix_spec.rb +116 -0
- data/spec/spec_helper.rb +1 -0
- data/spec/support/database.github.yml +13 -0
- metadata +35 -19
- data/.travis.yml +0 -58
- data/gemfiles/Gemfile.2.3.mysql2 +0 -17
- data/gemfiles/Gemfile.2.3.mysql2.lock +0 -34
- data/spec/support/database.travis.yml +0 -9
- data/spec/support/database.yml +0 -10
@@ -4,13 +4,14 @@ source 'https://rubygems.org'
|
|
4
4
|
ruby '>= 2.2'
|
5
5
|
|
6
6
|
# Runtime dependencies
|
7
|
-
gem 'activerecord', '~>5.
|
7
|
+
gem 'activerecord', '~>5.2.0'
|
8
8
|
gem 'rspec', '~>3.5'
|
9
9
|
gem 'pg', '~>0.18.4'
|
10
10
|
|
11
11
|
# Development dependencies
|
12
12
|
gem 'rake'
|
13
13
|
gem 'database_cleaner'
|
14
|
+
gem 'pry'
|
14
15
|
|
15
16
|
# Gem under test
|
16
|
-
gem 'gemika', :path => '
|
17
|
+
gem 'gemika', :path => '.'
|
@@ -1,28 +1,35 @@
|
|
1
1
|
PATH
|
2
|
-
remote:
|
2
|
+
remote: .
|
3
3
|
specs:
|
4
|
+
gemika (0.5.0)
|
4
5
|
|
5
6
|
GEM
|
6
7
|
remote: https://rubygems.org/
|
7
8
|
specs:
|
8
|
-
activemodel (5.
|
9
|
-
activesupport (= 5.
|
10
|
-
activerecord (5.
|
11
|
-
activemodel (= 5.
|
12
|
-
activesupport (= 5.
|
13
|
-
arel (
|
14
|
-
activesupport (5.
|
9
|
+
activemodel (5.2.3)
|
10
|
+
activesupport (= 5.2.3)
|
11
|
+
activerecord (5.2.3)
|
12
|
+
activemodel (= 5.2.3)
|
13
|
+
activesupport (= 5.2.3)
|
14
|
+
arel (>= 9.0)
|
15
|
+
activesupport (5.2.3)
|
15
16
|
concurrent-ruby (~> 1.0, >= 1.0.2)
|
16
|
-
i18n (
|
17
|
+
i18n (>= 0.7, < 2)
|
17
18
|
minitest (~> 5.1)
|
18
19
|
tzinfo (~> 1.1)
|
19
|
-
arel (
|
20
|
-
|
21
|
-
|
20
|
+
arel (9.0.0)
|
21
|
+
coderay (1.1.2)
|
22
|
+
concurrent-ruby (1.1.5)
|
23
|
+
database_cleaner (1.7.0)
|
22
24
|
diff-lcs (1.2.5)
|
23
|
-
i18n (
|
24
|
-
|
25
|
+
i18n (1.5.1)
|
26
|
+
concurrent-ruby (~> 1.0)
|
27
|
+
method_source (0.9.2)
|
28
|
+
minitest (5.11.3)
|
25
29
|
pg (0.18.4)
|
30
|
+
pry (0.12.2)
|
31
|
+
coderay (~> 1.1.0)
|
32
|
+
method_source (~> 0.9.0)
|
26
33
|
rake (11.3.0)
|
27
34
|
rspec (3.5.0)
|
28
35
|
rspec-core (~> 3.5.0)
|
@@ -37,18 +44,19 @@ GEM
|
|
37
44
|
diff-lcs (>= 1.2.0, < 2.0)
|
38
45
|
rspec-support (~> 3.5.0)
|
39
46
|
rspec-support (3.5.0)
|
40
|
-
thread_safe (0.3.
|
41
|
-
tzinfo (1.2.
|
47
|
+
thread_safe (0.3.6)
|
48
|
+
tzinfo (1.2.5)
|
42
49
|
thread_safe (~> 0.1)
|
43
50
|
|
44
51
|
PLATFORMS
|
45
52
|
ruby
|
46
53
|
|
47
54
|
DEPENDENCIES
|
48
|
-
activerecord (~> 5.
|
55
|
+
activerecord (~> 5.2.0)
|
49
56
|
database_cleaner
|
50
57
|
gemika!
|
51
58
|
pg (~> 0.18.4)
|
59
|
+
pry
|
52
60
|
rake
|
53
61
|
rspec (~> 3.5)
|
54
62
|
|
@@ -56,4 +64,4 @@ RUBY VERSION
|
|
56
64
|
ruby 2.2.4p230
|
57
65
|
|
58
66
|
BUNDLED WITH
|
59
|
-
1.
|
67
|
+
1.17.3
|
data/Gemfile.5.2.sqlite3
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
source 'https://rubygems.org'
|
2
|
+
|
3
|
+
# Ruby
|
4
|
+
ruby '>= 2.2'
|
5
|
+
|
6
|
+
# Runtime dependencies
|
7
|
+
gem 'activerecord', '~>5.2.0'
|
8
|
+
gem 'rspec', '~>3.5'
|
9
|
+
gem 'sqlite3'
|
10
|
+
|
11
|
+
# Development dependencies
|
12
|
+
gem 'rake'
|
13
|
+
gem 'database_cleaner'
|
14
|
+
gem 'pry'
|
15
|
+
|
16
|
+
# Gem under test
|
17
|
+
gem 'gemika', :path => '.'
|
@@ -0,0 +1,67 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
gemika (0.5.0)
|
5
|
+
|
6
|
+
GEM
|
7
|
+
remote: https://rubygems.org/
|
8
|
+
specs:
|
9
|
+
activemodel (5.2.3)
|
10
|
+
activesupport (= 5.2.3)
|
11
|
+
activerecord (5.2.3)
|
12
|
+
activemodel (= 5.2.3)
|
13
|
+
activesupport (= 5.2.3)
|
14
|
+
arel (>= 9.0)
|
15
|
+
activesupport (5.2.3)
|
16
|
+
concurrent-ruby (~> 1.0, >= 1.0.2)
|
17
|
+
i18n (>= 0.7, < 2)
|
18
|
+
minitest (~> 5.1)
|
19
|
+
tzinfo (~> 1.1)
|
20
|
+
arel (9.0.0)
|
21
|
+
coderay (1.1.2)
|
22
|
+
concurrent-ruby (1.1.5)
|
23
|
+
database_cleaner (1.7.0)
|
24
|
+
diff-lcs (1.3)
|
25
|
+
i18n (1.5.1)
|
26
|
+
concurrent-ruby (~> 1.0)
|
27
|
+
method_source (0.9.2)
|
28
|
+
minitest (5.11.3)
|
29
|
+
pry (0.12.2)
|
30
|
+
coderay (~> 1.1.0)
|
31
|
+
method_source (~> 0.9.0)
|
32
|
+
rake (12.3.1)
|
33
|
+
rspec (3.7.0)
|
34
|
+
rspec-core (~> 3.7.0)
|
35
|
+
rspec-expectations (~> 3.7.0)
|
36
|
+
rspec-mocks (~> 3.7.0)
|
37
|
+
rspec-core (3.7.1)
|
38
|
+
rspec-support (~> 3.7.0)
|
39
|
+
rspec-expectations (3.7.0)
|
40
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
41
|
+
rspec-support (~> 3.7.0)
|
42
|
+
rspec-mocks (3.7.0)
|
43
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
44
|
+
rspec-support (~> 3.7.0)
|
45
|
+
rspec-support (3.7.1)
|
46
|
+
sqlite3 (1.3.13)
|
47
|
+
thread_safe (0.3.6)
|
48
|
+
tzinfo (1.2.5)
|
49
|
+
thread_safe (~> 0.1)
|
50
|
+
|
51
|
+
PLATFORMS
|
52
|
+
ruby
|
53
|
+
|
54
|
+
DEPENDENCIES
|
55
|
+
activerecord (~> 5.2.0)
|
56
|
+
database_cleaner
|
57
|
+
gemika!
|
58
|
+
pry
|
59
|
+
rake
|
60
|
+
rspec (~> 3.5)
|
61
|
+
sqlite3
|
62
|
+
|
63
|
+
RUBY VERSION
|
64
|
+
ruby 2.2.4p230
|
65
|
+
|
66
|
+
BUNDLED WITH
|
67
|
+
1.17.3
|
data/Gemfile.6.0.pg
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
source 'https://rubygems.org'
|
2
|
+
|
3
|
+
# Ruby
|
4
|
+
ruby '>= 2.2'
|
5
|
+
|
6
|
+
# Runtime dependencies
|
7
|
+
gem 'activerecord', '~>6.0.0'
|
8
|
+
gem 'rspec', '~>3.5'
|
9
|
+
gem 'pg', '~>0.18.4'
|
10
|
+
|
11
|
+
# Development dependencies
|
12
|
+
gem 'rake'
|
13
|
+
gem 'database_cleaner'
|
14
|
+
gem 'pry'
|
15
|
+
|
16
|
+
# Gem under test
|
17
|
+
gem 'gemika', :path => '.'
|
data/Gemfile.6.0.pg.lock
ADDED
@@ -0,0 +1,67 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
gemika (0.5.0)
|
5
|
+
|
6
|
+
GEM
|
7
|
+
remote: https://rubygems.org/
|
8
|
+
specs:
|
9
|
+
activemodel (6.0.0)
|
10
|
+
activesupport (= 6.0.0)
|
11
|
+
activerecord (6.0.0)
|
12
|
+
activemodel (= 6.0.0)
|
13
|
+
activesupport (= 6.0.0)
|
14
|
+
activesupport (6.0.0)
|
15
|
+
concurrent-ruby (~> 1.0, >= 1.0.2)
|
16
|
+
i18n (>= 0.7, < 2)
|
17
|
+
minitest (~> 5.1)
|
18
|
+
tzinfo (~> 1.1)
|
19
|
+
zeitwerk (~> 2.1, >= 2.1.8)
|
20
|
+
coderay (1.1.2)
|
21
|
+
concurrent-ruby (1.1.5)
|
22
|
+
database_cleaner (1.7.0)
|
23
|
+
diff-lcs (1.3)
|
24
|
+
i18n (1.6.0)
|
25
|
+
concurrent-ruby (~> 1.0)
|
26
|
+
method_source (0.9.2)
|
27
|
+
minitest (5.11.3)
|
28
|
+
pg (0.18.4)
|
29
|
+
pry (0.12.2)
|
30
|
+
coderay (~> 1.1.0)
|
31
|
+
method_source (~> 0.9.0)
|
32
|
+
rake (12.3.3)
|
33
|
+
rspec (3.8.0)
|
34
|
+
rspec-core (~> 3.8.0)
|
35
|
+
rspec-expectations (~> 3.8.0)
|
36
|
+
rspec-mocks (~> 3.8.0)
|
37
|
+
rspec-core (3.8.2)
|
38
|
+
rspec-support (~> 3.8.0)
|
39
|
+
rspec-expectations (3.8.4)
|
40
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
41
|
+
rspec-support (~> 3.8.0)
|
42
|
+
rspec-mocks (3.8.1)
|
43
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
44
|
+
rspec-support (~> 3.8.0)
|
45
|
+
rspec-support (3.8.2)
|
46
|
+
thread_safe (0.3.6)
|
47
|
+
tzinfo (1.2.5)
|
48
|
+
thread_safe (~> 0.1)
|
49
|
+
zeitwerk (2.1.10)
|
50
|
+
|
51
|
+
PLATFORMS
|
52
|
+
ruby
|
53
|
+
|
54
|
+
DEPENDENCIES
|
55
|
+
activerecord (~> 6.0.0)
|
56
|
+
database_cleaner
|
57
|
+
gemika!
|
58
|
+
pg (~> 0.18.4)
|
59
|
+
pry
|
60
|
+
rake
|
61
|
+
rspec (~> 3.5)
|
62
|
+
|
63
|
+
RUBY VERSION
|
64
|
+
ruby 2.2.4p230
|
65
|
+
|
66
|
+
BUNDLED WITH
|
67
|
+
1.17.2
|
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Gemika
|
1
|
+
# Gemika [![Tests](https://github.com/makandra/gemika/workflows/Tests/badge.svg)](https://github.com/makandra/gemika/actions)
|
2
2
|
|
3
3
|
## Test a Ruby gem against multiple versions of everything
|
4
4
|
|
@@ -12,12 +12,13 @@ Here's what Gemika can give your test's development setup (all features are opt-
|
|
12
12
|
|
13
13
|
- Test one codebase against multiple sets of runtime gem dependency sets (e.g. Rails 2.3, Rails 5.0).
|
14
14
|
- Test one codebase against multiple Ruby versions (e.g. Ruby 1.8.7, Ruby 2.3.10).
|
15
|
-
- Test one codebase against multiple database types (currently MySQL or
|
15
|
+
- Test one codebase against multiple database types (currently MySQL, PostgreSQL, or sqlite3).
|
16
16
|
- Compute a matrix of all possible dependency permutations (Ruby, runtime gems, database type). Manually exclude incompatible dependency permutations (e.g. Rails 5.0 does not work with Ruby 2.1).
|
17
17
|
- Let developers enter their local credentials for MySQL and PostgreSQL in a `database.yml` file.
|
18
18
|
- Define default Ruby version, gem dependencies and database for developers who don't care about every possible permutation for everyday work.
|
19
|
-
- Help configure a [Travis CI](https://travis-ci.org/) build that tests every dependency permutation after each `git push`.
|
20
|
-
- Share your Ruby / gem dependeny / database permutation between local development and Travis CI.
|
19
|
+
- Help configure a [Travis CI](https://travis-ci.org/) or Github Actions build that tests every dependency permutation after each `git push`.
|
20
|
+
- Share your Ruby / gem dependeny / database permutation between local development and Travis CI / Github Actions.
|
21
|
+
- Migrate your Travis CI config to a Github Actions config.
|
21
22
|
- Define an [ActiveRecord database migration](http://api.rubyonrails.org/classes/ActiveRecord/Migration.html) that sets up your test database.
|
22
23
|
- Automatically drop and re-create your test database before each run of your test suite.
|
23
24
|
- Work around breaking changes in RSpec, Ruby and other gems
|
@@ -30,7 +31,7 @@ Gemika currently supports the following dependency versions:
|
|
30
31
|
- Ruby: 1.8.7, 2.1, 2.2, 2.3
|
31
32
|
- RSpec: Versions 1, 2, 3
|
32
33
|
- ActiveRecord: Versions 2.3, 3.2, 4.2, 5.0
|
33
|
-
- Databases: PostgreSQL (with `pg` gem), MySQL or MariaDB (with `mysql2` gem)
|
34
|
+
- Databases: PostgreSQL (with `pg` gem), MySQL or MariaDB (with `mysql2` gem), or sqlite3 (with `sqlite3` gem)
|
34
35
|
|
35
36
|
Gemika also makes some assumption about your Gem:
|
36
37
|
|
@@ -43,14 +44,14 @@ Gemika also makes some assumption about your Gem:
|
|
43
44
|
Below you can see the directory of a gem with a completed Gemika testing setup. The next section describes how to get there:
|
44
45
|
|
45
46
|
```shell
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
Gemfile ->
|
53
|
-
Gemfile.lock ->
|
47
|
+
Gemfile.set1 # First dependency set. Should include development dependencies and gemika.
|
48
|
+
Gemfile.set1.lock # Generated by `rake matrix:install`
|
49
|
+
Gemfile.set2 # Second dependency set. Should include development dependencies and gemika.
|
50
|
+
Gemfile.set2.lock # Generated by `rake matrix:install`
|
51
|
+
Gemfile.set3 # Third dependency set. Should include development dependencies and gemika.
|
52
|
+
Gemfile.set3.lock # Generated by `rake matrix:install`
|
53
|
+
Gemfile -> Gemfile.set2 # Symlink to default Gemfile for development
|
54
|
+
Gemfile.lock -> Gemfile.set2.lock # Symlink to default Gemfile.lock for development
|
54
55
|
.ruby-version # Default Ruby version for development
|
55
56
|
.gitignore # Should ignore spec/support/database.yml
|
56
57
|
.travis.yml # Configures all tested Ruby / gemfile combinations, for both local development and Travis CI
|
@@ -65,6 +66,7 @@ spec/support/database.rb # Database schema for test database
|
|
65
66
|
spec/support/database.yml # Database credentials for local development (not checked in)
|
66
67
|
spec/support/database.sample.yml # Sample database credentials for new developers
|
67
68
|
spec/support/database.travis.yml # Database credentials for Travis CI
|
69
|
+
spec/support/database.github.yml # Alternatively: Database credentials for Github Actions
|
68
70
|
spec/my_gem/my_class_spec.rb # Tests for your gem
|
69
71
|
```
|
70
72
|
|
@@ -79,9 +81,10 @@ For a live example of this setup, check the [makandra/minidusen](https://github.
|
|
79
81
|
Gemika expects a standard gem directory that looks roughly like this:
|
80
82
|
|
81
83
|
```shell
|
82
|
-
my_gem.gemspec
|
83
|
-
Rakefile
|
84
|
-
lib/my_gem.rb
|
84
|
+
my_gem.gemspec # Specification for your gem
|
85
|
+
Rakefile # Rake tasks for your gem
|
86
|
+
lib/my_gem.rb # Main file to require for your gem
|
87
|
+
spec/my_gem_spec.rb # Tests for your gem
|
85
88
|
```
|
86
89
|
|
87
90
|
If you don't have a directory yet, you can [ask Bundler to create it for you](http://bundler.io/rubygems.html):
|
@@ -135,86 +138,66 @@ task :default => 'matrix:spec'
|
|
135
138
|
### Define multiple dependency sets
|
136
139
|
|
137
140
|
We are now creating one `Gemfile` for each set of gems and database type you'd like to test again.
|
141
|
+
Your gemfiles should be placed directly in your project's root directory.
|
138
142
|
|
139
|
-
|
140
|
-
|
141
|
-
```shell
|
142
|
-
mkdir gemfiles
|
143
|
-
```
|
144
|
-
|
145
|
-
For each dependency set, create a `Gemfile` in the `gemfiles` directory that contains:
|
143
|
+
For each dependency set, create a `Gemfile` in the project root directory that contains:
|
146
144
|
|
147
145
|
1. The runtime dependencies you'd like to test against (e.g. Rails 5)
|
148
|
-
2. The development dependencies for that set (e.g. `rspec`) in a version that is compatible with these runtime
|
146
|
+
2. The development dependencies for that set (e.g. `rspec`) in a version that is compatible with these runtime dependencies.
|
149
147
|
3. The `gemika` gem
|
150
|
-
4. Your own gem from path
|
151
|
-
|
152
|
-
For instance, if one dependency set is Rails 3.2 with a MySQL database, we would create
|
148
|
+
4. Your own gem from path `.`
|
149
|
+
|
150
|
+
For instance, if one dependency set is Rails 3.2 with a MySQL database, we would create `./Gemfile.4.2.mysql2` with these contents:
|
153
151
|
|
154
152
|
```ruby
|
153
|
+
source 'https://rubygems.org'
|
154
|
+
|
155
155
|
# Runtime dependencies
|
156
156
|
gem 'rails', '~>3.2.22'
|
157
|
-
gem 'mysql2', '= 0.
|
158
|
-
gem 'rspec', '~> 3.4'
|
157
|
+
gem 'mysql2', '= 0.4.10'
|
159
158
|
|
160
159
|
# Development dependencies
|
160
|
+
gem 'rspec', '~> 3.4'
|
161
161
|
gem 'rake'
|
162
162
|
gem 'byebug'
|
163
163
|
gem 'gemika'
|
164
164
|
|
165
165
|
# Gem under test
|
166
|
-
gem 'my_gem', :path => '
|
166
|
+
gem 'my_gem', :path => '.'
|
167
167
|
```
|
168
168
|
|
169
|
-
If a second dependency is Rails 5.0 with a PostgreSQL database, we would create
|
169
|
+
If a second dependency is Rails 5.0 with a PostgreSQL database, we would create `./Gemfile.5.0.pg` with these contents:
|
170
170
|
|
171
171
|
```ruby
|
172
|
+
source 'https://rubygems.org'
|
173
|
+
|
172
174
|
# Runtime dependencies
|
173
175
|
gem 'rails', '~>5.0.0'
|
174
176
|
gem 'pg', '~>0.18.4'
|
175
|
-
gem 'rspec', '~>3.5'
|
176
177
|
|
177
178
|
# Development dependencies
|
179
|
+
gem 'rspec', '~>3.5'
|
178
180
|
gem 'rake'
|
179
181
|
gem 'byebug'
|
180
182
|
gem 'gemika'
|
181
183
|
|
182
184
|
# Gem under test
|
183
|
-
gem 'my_gem', :path => '
|
184
|
-
```
|
185
|
-
|
186
|
-
In this example, your `gemfiles` directory should now look like this:
|
187
|
-
|
188
|
-
```
|
189
|
-
gemfiles/Gemfile.4.2.mysql2
|
190
|
-
gemfiles/Gemfile.5.0.pg
|
191
|
-
```
|
192
|
-
|
193
|
-
Create lockfiles for each bundle by running:
|
194
|
-
|
195
|
-
```shell
|
196
|
-
rake matrix:install
|
185
|
+
gem 'my_gem', :path => '.'
|
197
186
|
```
|
198
187
|
|
199
|
-
In this example, your
|
188
|
+
In this example, your project directory should now also contain:
|
200
189
|
|
201
190
|
```
|
202
|
-
|
203
|
-
|
204
|
-
gemfiles/Gemfile.5.0.pg
|
205
|
-
gemfiles/Gemfile.5.0.pg.lock
|
191
|
+
Gemfile.4.2.mysql2
|
192
|
+
Gemfile.5.0.pg
|
206
193
|
```
|
207
194
|
|
208
|
-
Gemfiles and lockfiles should be committed to your repo.
|
209
|
-
|
210
|
-
Make sure to re-run `rake matrix:install` after each change to your gemfiles, and commit the generated changes.
|
211
|
-
|
212
195
|
|
213
196
|
### Define combinations of gemfiles and Ruby versions
|
214
197
|
|
215
198
|
We will now define a test matrix that contains all permutations of gemfiles and tested Ruby versions.
|
216
199
|
|
217
|
-
We store the matrix in a `.travis.yml` file, **even if the project is not using Travis CI**. This allows us to configure the matrix once and us it for both local
|
200
|
+
We store the matrix in a `.travis.yml` file, **even if the project is not using Travis CI**. This allows us to configure the matrix once and us it for both local development and Travis CI builds.
|
218
201
|
|
219
202
|
Create a `.travis.yml` that lists all gemfiles and Ruby versions you'd like to test against:
|
220
203
|
|
@@ -225,16 +208,19 @@ rvm:
|
|
225
208
|
- 2.3.1
|
226
209
|
|
227
210
|
gemfile:
|
228
|
-
-
|
229
|
-
-
|
230
|
-
-
|
231
|
-
-
|
232
|
-
-
|
211
|
+
- Gemfile.3.2.mysql2
|
212
|
+
- Gemfile.4.2.mysql2
|
213
|
+
- Gemfile.4.2.pg
|
214
|
+
- Gemfile.5.0.mysql2
|
215
|
+
- Gemfile.5.0.pg
|
233
216
|
```
|
234
217
|
|
235
218
|
Don't mind the `rvm` key if you're using a different version manager locally (like rbenv). Things will still work.
|
236
219
|
|
237
220
|
|
221
|
+
Alternatively, create a Github Actions file like [this](/.github/workflows/test.yml).
|
222
|
+
|
223
|
+
|
238
224
|
#### Excluding incompatible matrix rows
|
239
225
|
|
240
226
|
There might be incompatible combinations of gemfiles and Rubies, e.g. Rails 5.0 does not work with Ruby 2.1 or lower. In this case, add an `matrix`/`exclude` key to your `.travis.yml`:
|
@@ -242,12 +228,59 @@ There might be incompatible combinations of gemfiles and Rubies, e.g. Rails 5.0
|
|
242
228
|
```yaml
|
243
229
|
matrix:
|
244
230
|
exclude:
|
245
|
-
- gemfile:
|
231
|
+
- gemfile: Gemfile.5.0.mysql2
|
246
232
|
rvm: 2.1.8
|
247
|
-
- gemfile:
|
233
|
+
- gemfile: Gemfile.5.0.pg
|
248
234
|
rvm: 2.1.8
|
249
235
|
```
|
250
236
|
|
237
|
+
For `.github/workflows/test.yml`, it looks similar:
|
238
|
+
|
239
|
+
```yaml
|
240
|
+
jobs:
|
241
|
+
my_job:
|
242
|
+
strategy:
|
243
|
+
matrix:
|
244
|
+
exclude:
|
245
|
+
- gemfile: Gemfile.5.0.mysql2
|
246
|
+
ruby: 2.1.8
|
247
|
+
- gemfile: Gemfile.5.0.pg
|
248
|
+
ruby: 2.1.8
|
249
|
+
```
|
250
|
+
|
251
|
+
|
252
|
+
Alternatively, you can instead explicitly list all Ruby / Gemfile combinations with
|
253
|
+
|
254
|
+
```
|
255
|
+
matrix:
|
256
|
+
include:
|
257
|
+
- gemfile: Gemfile.5.0.mysql2
|
258
|
+
rvm: 2.3.8
|
259
|
+
- gemfile: Gemfile.5.2.mysql2
|
260
|
+
rvm: 2.3.8
|
261
|
+
```
|
262
|
+
|
263
|
+
### Generate lockfiles
|
264
|
+
|
265
|
+
Generate lockfiles for each bundle by running:
|
266
|
+
|
267
|
+
```shell
|
268
|
+
rake matrix:install
|
269
|
+
```
|
270
|
+
|
271
|
+
In this example, your project directory should now contain a lockfile for each gemfile:
|
272
|
+
|
273
|
+
```
|
274
|
+
Gemfile.4.2.mysql2
|
275
|
+
Gemfile.4.2.mysql2.lock
|
276
|
+
Gemfile.5.0.pg
|
277
|
+
Gemfile.5.0.pg.lock
|
278
|
+
```
|
279
|
+
|
280
|
+
Gemfiles and lockfiles should be committed to your repo.
|
281
|
+
|
282
|
+
Make sure to re-run `rake matrix:install` after each change to your gemfiles, and commit the generated changes.
|
283
|
+
|
251
284
|
|
252
285
|
### Default Ruby and default gemfile
|
253
286
|
|
@@ -262,8 +295,8 @@ Create a `.ruby-version` file with the default Ruby version:
|
|
262
295
|
Choose a default dependency set and symlink both gemfile and lockfile to your project root:
|
263
296
|
|
264
297
|
```
|
265
|
-
ln -s
|
266
|
-
ln -s
|
298
|
+
ln -s Gemfile.4.2.mysql2 Gemfile
|
299
|
+
ln -s Gemfile.4.2.mysql2.lock Gemfile.lock
|
267
300
|
```
|
268
301
|
|
269
302
|
Commit both `.ruby-version` and symlinks to your repo.
|
@@ -288,6 +321,9 @@ postgresql:
|
|
288
321
|
database: minidusen_test
|
289
322
|
user:
|
290
323
|
password:
|
324
|
+
|
325
|
+
sqlite:
|
326
|
+
database: ":memory:"
|
291
327
|
```
|
292
328
|
|
293
329
|
We don't want to commit our local credentials, so add a line to your `.gitignore`:
|
@@ -327,6 +363,25 @@ Dir["#{File.dirname(__FILE__)}/support/*.rb"].sort.each {|f| require f}
|
|
327
363
|
Now you have a great place for code snippets that need to run before specs (factories, VCR configuration, etc.).
|
328
364
|
|
329
365
|
|
366
|
+
To have your database work with Github Actions, add a database file `spec/support/database.github.yml`.
|
367
|
+
|
368
|
+
```
|
369
|
+
mysql:
|
370
|
+
database: test
|
371
|
+
username: root
|
372
|
+
password: password
|
373
|
+
host: 127.0.0.1
|
374
|
+
port: 3306
|
375
|
+
|
376
|
+
postgresql:
|
377
|
+
database: test
|
378
|
+
host: localhost
|
379
|
+
username: postgres
|
380
|
+
password: postgres
|
381
|
+
port: 5432
|
382
|
+
```
|
383
|
+
|
384
|
+
|
330
385
|
#### Test database schema
|
331
386
|
|
332
387
|
If your gem is talking to the database, you probably need to create some example tables.
|
@@ -383,6 +438,25 @@ Gemika::RSpec.configure_clean_database_before_example
|
|
383
438
|
Note that you also need `require 'gemika'` in your `spec_helper.rb`.
|
384
439
|
|
385
440
|
|
441
|
+
#### Migrate from Travis CI to Github Actions
|
442
|
+
|
443
|
+
To help in your migrations, you can ask Gemika to generate a Github Actions config from an existing `.travis-ci.yml`.
|
444
|
+
|
445
|
+
To do this, call
|
446
|
+
|
447
|
+
```
|
448
|
+
bundle exec rake gemika:generate_github_actions_workflow
|
449
|
+
```
|
450
|
+
|
451
|
+
Copy the resulting file to `.github/workflows/test.yml`.
|
452
|
+
|
453
|
+
Make sure you have a `spec/support/database.github.yml` if you use databases. See above how this is supposed to look like.
|
454
|
+
|
455
|
+
You may have to fix a few things manually though. For example, Github Actions will only allow certain Ruby versions (but show you a list of supported versions when it fails).
|
456
|
+
|
457
|
+
Also, when you run on a Ubuntu 20.04 container, you might have issues with the mysql2 gem. See [this guide](https://makandracards.com/makandra/486428-installing-old-versions-of-mysql2-on-ubuntu-20-04+) for a potential solution.
|
458
|
+
|
459
|
+
|
386
460
|
### Try it out
|
387
461
|
|
388
462
|
Check if you can install development dependencies for each row in the test matrix:
|
@@ -424,8 +498,8 @@ rake matrix:spec
|
|
424
498
|
Note that if your current Ruby version is *very* far away from your [default Ruby](#default-ruby-and-default-gemfile) in `.ruby-version`, you might need to run `rake` with a gemfile that has compatible dependencies:
|
425
499
|
|
426
500
|
```shell
|
427
|
-
BUNDLE_GEMFILE=
|
428
|
-
BUNDLE_GEMFILE=
|
501
|
+
BUNDLE_GEMFILE=Gemfile.2.3 bundle exec rake matrix:install
|
502
|
+
BUNDLE_GEMFILE=Gemfile.2.3 bundle exec rake matrix:spec
|
429
503
|
```
|
430
504
|
|
431
505
|
We recommend to setup Travis CI to check the entire test matrix after each push, including all Rubies. This way developers can stay on the [default Ruby and gemfile](#default-ruby-and-default-gemfile) most of the time while Travis CI checks make sure that nothing broken gets merged.
|
@@ -471,10 +545,9 @@ notifications:
|
|
471
545
|
- notifications@test.com
|
472
546
|
|
473
547
|
install:
|
474
|
-
#
|
475
|
-
|
476
|
-
|
477
|
-
- bundle install --jobs=3 --retry=3 --deployment --path=${BUNDLE_PATH:-vendor/bundle}
|
548
|
+
# Replace default Travis CI bundler script with a version that doesn't
|
549
|
+
# explode when lockfile doesn't match recently bumped version
|
550
|
+
- bundle install --no-deployment --jobs=3 --retry=3 --path=${BUNDLE_PATH:-vendor/bundle}
|
478
551
|
|
479
552
|
script: bundle exec rake current_rspec
|
480
553
|
```
|