Compare commits

..
75 Commits
Author SHA1 Message Date
Benoit Daloze 473e4d8fe5 Add Ruby 3.0.0 2020-12-25 13:14:24 +01:00
Benoit Daloze 3cb8cff23d Consistency 2020-12-22 11:49:37 +01:00
Benoit Daloze f36eef7a2f Add an example with a matrix of Gemfiles 2020-12-22 11:46:12 +01:00
Benoit Daloze ec4649be90 Add test for a Gemfile depending on Bundler 1 2020-12-22 11:46:12 +01:00
Benoit Daloze 1771151f64 Error if $BUNDLE_GEMFILE is set but does not exist 2020-12-22 11:46:12 +01:00
Benoit Daloze f5db46ebcb Fix version check 2020-12-22 11:18:45 +01:00
Benoit Daloze dc58db7220 Use an absolute path for bundle config --local path
* See https://github.com/ruby/setup-ruby/issues/131
2020-12-21 21:13:02 +01:00
Benoit Daloze 0e7d36a67f Add test using BUNDLE_GEMFILE 2020-12-21 21:12:42 +01:00
Benoit Tigeot e5b6990d51 Add 3.0.0-rc1 2020-12-21 12:30:17 +01:00
Benoit Daloze c3f248a282 Update docs about Bundler 2020-12-14 12:55:47 +01:00
Benoit Daloze a9926985f9 Small tweaks to the README example 2020-12-12 19:38:17 +01:00
Benoit Daloze 07b100f2a1 Reduce the number of CI jobs since it is becoming impractical
* It was > 100 jobs and the GitHub limits to 100 jobs.
2020-12-12 15:17:54 +01:00
Benoit Daloze 515629a013 Update to latest actions/cache to fix cache saving on Windows with MSYS2 tar
* See https://github.com/actions/toolkit/issues/632
* Fixes https://github.com/ruby/setup-ruby/issues/102
2020-12-12 14:51:32 +01:00
Benoit Daloze 0981b5ec00 Add jruby-9.2.14.0 2020-12-12 14:04:27 +01:00
Benoit Daloze c101335f33 Add test checking using an exact Bundler version works 2020-12-11 14:46:33 +01:00
Benoit Daloze 1482e9180a Install the exact same Bundler version as in the lockfile if there is a lockfile 2020-12-11 14:46:33 +01:00
Jonathan del Strother 3e7640a17e Document the bundler: "x.y.z" feature 2020-12-11 14:46:33 +01:00
Benoit Daloze f6f61ea575 Fix checks for Bundler version to consider an exact version like 2.1.4 2020-12-11 14:46:33 +01:00
Benoit Daloze 084885eaca Only set $BUNDLER_VERSION when needed (Bundler 1, Ruby >= 2.7) 2020-12-09 16:51:47 +01:00
Benoit Daloze efd6675fc9 Add 3.0.0-preview2 2020-12-08 18:42:10 +01:00
Benoit Daloze e5a267414f Fix value for options 2020-12-07 21:12:36 +01:00
ojab cadade3366 Pass selected Bundler version to bundle config & bundle lock 2020-12-07 21:06:26 +01:00
Benoit Daloze d3562e70d9 Use lowercase names for interpreters
* So the mapping to `engine-version` versions is clearer.
2020-12-05 17:23:19 +01:00
Benoit Daloze 23b2b5e5f1 Create the .complete file so tc.find() can find it for future runs for self-hosted runners 2020-12-05 16:36:46 +01:00
Benoit Daloze 42fc2d3bce Reuse builds in the toolcache when they exist 2020-12-05 16:18:50 +01:00
ojab 30f5e2d4cd Fixup bundler version for rubies with bundler as a default gem
Fixes #117
2020-12-05 15:40:47 +01:00
Benoit Daloze fd1d77b75c GitHub Actions parses 3.0 as '3', so use quotes
* And adapt excludes.
2020-12-05 13:14:51 +01:00
Benoit Daloze 2a0be7a409 Try stable versions first, and then try non-head versions
* Fixes https://github.com/ruby/setup-ruby/issues/115
2020-12-05 12:52:21 +01:00
Benoit Daloze bacba738b2 Run bundle clean when reusing a cache and the lockfile changed
* Fixes https://github.com/ruby/setup-ruby/issues/113
2020-12-02 17:36:27 +01:00
Benoit Daloze 21351ecc0a More details about BUNDLE_GEMFILE 2020-11-27 11:16:50 +01:00
Benoit Daloze 4d7e038419 Show how to set BUNDLE_GEMFILE in the README 2020-11-27 11:03:17 +01:00
Benoit Daloze e27aee156d Add TruffleRuby 20.3.0 2020-11-20 13:00:18 +01:00
Benoit Daloze 43bb24d212 Run lint explicitly on Ubuntu 20.04 to avoid warning 2020-11-20 13:00:18 +01:00
Benoit Daloze 0c4183e8b8 truffleruby-head works fine on macOS Big Sur now 2020-11-20 12:39:46 +01:00
Benoit Daloze 50ae8432ea Remove part about continue-on-error in example
* It does not seem to work well.
* See https://github.com/actions/toolkit/issues/399
2020-11-20 12:37:14 +01:00
Benoit Daloze a699edbce6 Add test for ruby-3.0.0-preview1 2020-11-19 00:33:41 +01:00
Benoit Daloze e38f9abc9e Fix usages of string.split(sep, limit)
* Since the limit just removes further matches in JavaScript.
2020-11-19 00:33:40 +01:00
Benoit Daloze 7c2bf7263d Ensure an engine-only ruby-version picks the latest stable version and not a preview or RC 2020-11-18 21:52:51 +01:00
Benoit Daloze 34fbbc1d36 Update README.md 2020-11-16 12:13:08 +01:00
Benoit Daloze 9bc07a3af0 No builds of truffleruby{,-head} on macos-11.0 yet 2020-11-13 10:48:04 +01:00
Benoit Daloze 63dde36864 Remove the Caching bundle install manually section
* It is too error prone and the automatic approach is a lot safer and easier.
2020-11-13 10:38:56 +01:00
Benoit Daloze fde3324171 Remove redundant bundle install in the usage examples 2020-11-13 10:38:56 +01:00
Benoit Daloze 59aafb8612 Add support for macos-11.0 2020-11-13 10:33:21 +01:00
Benoit Daloze ad1ebae995 Also include the version in the platform for macos and windows
* Guess the platform based on $ImageOS.
2020-11-12 20:23:53 +01:00
Benoit Daloze f4a8aa6c33 Use ImageOS for the cache key, so it also includes the OS version 2020-11-12 19:59:05 +01:00
Benoit Daloze bc0f274d1c Fix Bundler cache when there is no Gemfile.lock
* Always show the list of installed gems in the log.
2020-11-12 19:34:43 +01:00
Benoit Daloze 1c896c8ea1 Always use Bundler 1 for JRuby 9.1.x 2020-11-12 19:08:42 +01:00
Benoit Daloze ba761ba8ff Use a hardcoded toolcache path since we need to extract there to let Ruby work 2020-11-10 19:58:59 +01:00
Benoit Daloze bb3a0c6e0b Bundler 2 is shipped with truffleruby-head now 2020-11-10 15:33:41 +01:00
Benoit Daloze 8e77d9e0fa Mention RUNNER_TOOL_CACHE requirements for self-hosted runners 2020-11-10 11:44:22 +01:00
Benoit Daloze 339f055c86 Clarify Windows check 2020-11-10 11:35:50 +01:00
Benoit Daloze 0592d01dc3 Ruby 2.4 is EOL
https://www.ruby-lang.org/en/news/2020/04/05/support-of-ruby-2-4-has-ended/
2020-11-09 19:42:02 +01:00
Benoit Daloze d7b76f909a Add Ruby 3.0.0-preview1
* Fixes https://github.com/ruby/setup-ruby/issues/100
2020-11-09 13:07:33 +01:00
Benoit Daloze ebed7f7b66 Invalidate cache key since Rubies are installed in the toolcache now
* Some gems might capture the absolute path of the Ruby prefix.
2020-11-09 13:01:13 +01:00
Benoit Daloze 933dca770c Extract CRuby releases under $RUNNER_TOOL_CACHE 2020-11-09 13:00:42 +01:00
Benoit Daloze 693cf1794d Include the Gemfile path in the cache key
* See https://github.com/ruby/setup-ruby/issues/103#issuecomment-723960352
2020-11-09 13:00:04 +01:00
Benoit Daloze efda314f4a Remove Rubinius support
* Fixes https://github.com/ruby/setup-ruby/issues/101
2020-11-09 12:50:25 +01:00
Benoit Daloze c49deecea1 Rubinius builds will no longer be provided 2020-11-08 19:13:11 +01:00
Benoit Daloze 5da31b45d7 Revert "Test installing rake to check RubyGems recognizes the executable as safe to override"
* This reverts commit 35f0af38a7.
* It fails for some cases like Ruby <= 2.2 and on some RubyInstaller builds,
  see https://github.com/ruby/setup-ruby/issues/98#issuecomment-723468255
* Most users will use Bundler to install rake, and that already works fine.
2020-11-07 17:53:13 +01:00
Benoit Daloze 4bb29a57df Use the new format for ruby-builder version strings 2020-11-07 16:55:06 +01:00
Benoit Daloze 9be533b7d4 Print JRuby Windows versions for ruby-builder conveniently 2020-11-01 17:11:43 +01:00
Benoit Daloze 35f0af38a7 Test installing rake to check RubyGems recognizes the executable as safe to override 2020-11-01 16:54:38 +01:00
Benoit Daloze b9ca796ede Print RbConfig values in tests 2020-10-23 15:58:23 +02:00
Benoit Daloze 11082225e4 Mention bundler-cache: true in the README examples 2020-10-22 14:13:53 +02:00
Benoit Daloze 4de6eb91a8 Update test.yml 2020-10-22 14:12:09 +02:00
Benoit Daloze 60f215c278 Clarify the cleanups when using bundler-cache: true 2020-10-22 14:10:27 +02:00
Benoit Daloze a195098f6b Add Ruby 2.7.2 build from RubyInstaller 2020-10-06 16:41:11 +02:00
Benoit Daloze f117ca04d8 Add Ruby 2.7.2 2020-10-04 16:38:29 +02:00
dependabot[bot] 8bc9ca9ace Bump @actions/core from 1.2.4 to 1.2.6
Bumps [@actions/core](https://github.com/actions/toolkit/tree/HEAD/packages/core) from 1.2.4 to 1.2.6.
- [Release notes](https://github.com/actions/toolkit/releases)
- [Changelog](https://github.com/actions/toolkit/blob/main/packages/core/RELEASES.md)
- [Commits](https://github.com/actions/toolkit/commits/HEAD/packages/core)

Signed-off-by: dependabot[bot] <support@github.com>
2020-10-01 22:10:14 +02:00
Benoit Daloze 965ef501d4 Tweak wording 2020-09-19 12:14:15 +02:00
Benoit Daloze 153ca5e38f Update documentation about self-hosted runners 2020-09-19 12:06:35 +02:00
Benoit Daloze 0effb2cc50 Document that gems.rb/gems.locked is supported now 2020-09-19 11:43:36 +02:00
Benoit Daloze b62e5d53aa Take advantage that detectGemfiles() only returns existing paths
* So use !== null instead of redoing the existsSync() check.
* Rename a few variables for consistency.
2020-09-19 11:31:18 +02:00
Samuel Williams 1c172ef5dc Add support for gems.rb/gems.locked during bundle install (#84)
* Extract detection of gemfile and lockfile.
2020-09-19 11:18:52 +02:00
dependabot[bot] 4cbbce6b48 Bump node-fetch from 2.6.0 to 2.6.1
Bumps [node-fetch](https://github.com/bitinn/node-fetch) from 2.6.0 to 2.6.1.
- [Release notes](https://github.com/bitinn/node-fetch/releases)
- [Changelog](https://github.com/node-fetch/node-fetch/blob/master/docs/CHANGELOG.md)
- [Commits](https://github.com/bitinn/node-fetch/compare/v2.6.0...v2.6.1)

Signed-off-by: dependabot[bot] <support@github.com>
2020-09-13 13:21:14 +02:00
16 changed files with 1958 additions and 1173 deletions
+53 -4
View File
@@ -15,21 +15,23 @@ jobs:
strategy:
fail-fast: false
matrix:
os: [ ubuntu-16.04, ubuntu-18.04, ubuntu-20.04, macos-10.15, windows-2016, windows-2019 ]
os: [ ubuntu-18.04, ubuntu-20.04, macos-10.15, macos-11.0, windows-2016, windows-2019 ]
# Use various version syntax here for testing
ruby: [ 2.1, 2.2, 2.3, 2.4, 2.5, 2.6.6, 2.7, ruby-head, debug, jruby-9.1, jruby, jruby-head, truffleruby, truffleruby-head ]
ruby: [ 2.1, 2.2, 2.3, 2.4, 2.5, 2.6.6, 2.7, '3.0', ruby-head, jruby, jruby-head, truffleruby, truffleruby-head ]
include:
- { os: ubuntu-18.04, ruby: rubinius }
- { os: windows-2016, ruby: mingw }
- { os: windows-2019, ruby: mingw }
- { os: windows-2019, ruby: mswin }
exclude:
- { os: windows-2016, ruby: '3.0' }
- { os: windows-2016, ruby: debug }
- { os: windows-2016, ruby: truffleruby }
- { os: windows-2016, ruby: truffleruby-head }
- { os: windows-2019, ruby: '3.0' }
- { os: windows-2019, ruby: debug }
- { os: windows-2019, ruby: truffleruby }
- { os: windows-2019, ruby: truffleruby-head }
- { os: macos-11.0, ruby: truffleruby }
name: ${{ matrix.os }} ${{ matrix.ruby }}
runs-on: ${{ matrix.os }}
@@ -60,6 +62,10 @@ jobs:
echo 'ridk is unavailable'
}
}
- name: RbConfig::CONFIG
run: ruby -rrbconfig -rpp -e 'pp RbConfig::CONFIG'
- name: RbConfig::MAKEFILE_CONFIG
run: ruby -rrbconfig -rpp -e 'pp RbConfig::MAKEFILE_CONFIG'
- name: Subprocess test
run: ruby test_subprocess.rb
@@ -71,6 +77,7 @@ jobs:
- name: C extension test
run: gem install json:2.2.0 --no-document
- run: bundle --version
# This step is redundant with `bundler-cache: true` but is there to check a redundant `bundle install` still works
- run: bundle install
- run: bundle exec rake --version
@@ -95,10 +102,52 @@ jobs:
if: startsWith(matrix.os, 'windows') && startsWith(matrix.ruby, 'jruby')
run: gem install sassc -N
lint:
testExactBundlerVersion:
name: "Test with an exact Bundler version"
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: ./
with:
ruby-version: 2.6
bundler: 2.1.4
- run: bundle --version | grep -F "Bundler version 2.1.4"
testDependencyOnBundler1:
name: "Test gemfile depending on Bundler 1"
runs-on: ubuntu-latest
env:
BUNDLE_GEMFILE: gemfiles/bundler1.gemfile
steps:
- uses: actions/checkout@v2
- uses: ./
with:
ruby-version: 2.7
bundler: 1
bundler-cache: true
- run: bundle --version | grep -F "Bundler version 1."
testGemfileMatrix:
strategy:
fail-fast: false
matrix:
gemfile: [ rails5, rails6 ]
name: "Test with ${{ matrix.gemfile }} gemfile"
runs-on: ubuntu-latest
env:
BUNDLE_GEMFILE: gemfiles/${{ matrix.gemfile }}.gemfile
steps:
- uses: actions/checkout@v2
- uses: ./
with:
ruby-version: 2.6
bundler-cache: true
- run: bundle exec rails --version
lint:
runs-on: ubuntu-20.04
steps:
- uses: actions/checkout@v2
- run: yarn install
- run: yarn run package
- name: Check generated files are up to date
+66 -58
View File
@@ -14,33 +14,34 @@ This action currently supports these versions of MRI, JRuby and TruffleRuby:
| Interpreter | Versions |
| ----------- | -------- |
| Ruby | 2.1.9, 2.2, 2.3.0 - 2.3.8, 2.4.0 - 2.4.10, 2.5.0 - 2.5.8, 2.6.0 - 2.6.6, 2.7.1, head, debug, mingw, mswin |
| JRuby | 9.1.17.0, 9.2.9.0 - 9.2.13.0, head |
| TruffleRuby | 19.3.0 - 20.2.0, head |
| Rubinius | 4.14 |
| `ruby` | 2.1.9, 2.2, 2.3.0 - 2.3.8, 2.4.0 - 2.4.10, 2.5.0 - 2.5.8, 2.6.0 - 2.6.6, 2.7.2, 3.0.0,<br/> head, debug, mingw, mswin |
| `jruby` | 9.1.17.0, 9.2.9.0 - 9.2.13.0, head |
| `truffleruby` | 19.3.0 - 20.3.0, head |
`ruby-debug` is the same as `ruby-head` but with assertions enabled (`-DRUBY_DEBUG=1`).
On Windows, `mingw` and `mswin` are `ruby-head` builds using the MSYS2/MinGW and the MSVC toolchains respectively.
Ruby 2.2 resolves to 2.2.6 on Windows (last build from RubyInstaller) and 2.2.10 otherwise.
Ruby 2.3 on Windows only has builds for 2.3.0, 2.3.1 and 2.3.3 (same as RubyInstaller).
Preview and RC versions of Ruby might be available too on Ubuntu and macOS (not on Windows).
However, it is recommended to test against `ruby-head` rather than previews,
as it provides more useful feedback for the Ruby core team and for upcoming changes.
Note that Ruby ≤ 2.3 and the OpenSSL version it needs (1.0.2) are both end-of-life,
which means Ruby ≤ 2.3 is unmaintained and considered insecure.
On Windows, Ruby 2.4 uses OpenSSL 1.0.2, which is no longer maintained.
Only versions published by [RubyInstaller](https://rubyinstaller.org/downloads/archives/) are available on Windows.
Due to that, Ruby 2.2 resolves to 2.2.6 on Windows and 2.2.10 on other platforms.
And Ruby 2.3 on Windows only has builds for 2.3.0, 2.3.1 and 2.3.3.
Note that Ruby ≤ 2.4 and the OpenSSL version it needs (1.0.2) are both end-of-life,
which means Ruby ≤ 2.4 is unmaintained and considered insecure.
### Supported Platforms
The action works for all [GitHub-hosted runners](https://help.github.com/en/actions/automating-your-workflow-with-github-actions/virtual-environments-for-github-hosted-runners), and [self-hosted runners](https://docs.github.com/en/actions/hosting-your-own-runners/about-self-hosted-runners), under [certain conditions](#limitations)
The action works for all [GitHub-hosted runners](https://help.github.com/en/actions/automating-your-workflow-with-github-actions/virtual-environments-for-github-hosted-runners).
| Operating System | Recommended | Other Supported Versions |
| ----------- | -------- | -------- |
| Ubuntu | `ubuntu-latest` (= `ubuntu-18.04`) | `ubuntu-20.04`, `ubuntu-16.04` |
| macOS | `macos-latest` (= `macos-10.15`) | |
| macOS | `macos-latest` (= `macos-10.15`) | `macos-11.0` |
| Windows | `windows-latest` (= `windows-2019`) | `windows-2016` |
Rubinius is only available on `ubuntu-18.04`.
The prebuilt releases are generated by [ruby-builder](https://github.com/ruby/ruby-builder)
and on Windows by [RubyInstaller2](https://github.com/oneclick/rubyinstaller2).
`mingw` and `mswin` builds are generated by [ruby-loco](https://github.com/MSP-Greg/ruby-loco).
@@ -65,11 +66,11 @@ jobs:
- uses: ruby/setup-ruby@v1
with:
ruby-version: 2.6 # Not needed with a .ruby-version file
- run: bundle install
bundler-cache: true # runs 'bundle install' and caches installed gems automatically
- run: bundle exec rake
```
### Matrix
### Matrix of Ruby Versions
This matrix tests all stable releases and `head` versions of MRI, JRuby and TruffleRuby on Ubuntu and macOS.
@@ -81,19 +82,41 @@ jobs:
strategy:
fail-fast: false
matrix:
os: [ubuntu, macos]
ruby: [2.5, 2.6, 2.7, head, debug, jruby, jruby-head, truffleruby, truffleruby-head]
runs-on: ${{ matrix.os }}-latest
continue-on-error: ${{ endsWith(matrix.ruby, 'head') || matrix.ruby == 'debug' }}
os: [ubuntu-latest, macos-latest]
ruby: [2.5, 2.6, 2.7, '3.0', head, jruby, jruby-head, truffleruby, truffleruby-head]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v2
- uses: ruby/setup-ruby@v1
with:
ruby-version: ${{ matrix.ruby }}
- run: bundle install
bundler-cache: true # runs 'bundle install' and caches installed gems automatically
- run: bundle exec rake
```
### Matrix of Gemfiles
```yaml
name: My workflow
on: [push]
jobs:
test:
strategy:
fail-fast: false
matrix:
gemfile: [ rails5, rails6 ]
runs-on: ubuntu-latest
env: # $BUNDLE_GEMFILE must be set at the job level, so it is set for all steps
BUNDLE_GEMFILE: gemfiles/${{ matrix.gemfile }}.gemfile
steps:
- uses: actions/checkout@v2
- uses: ./
with:
ruby-version: 2.6
bundler-cache: true # runs 'bundle install' and caches installed gems automatically
- run: bundle exec rake
```
See the GitHub Actions documentation for more details about the
[workflow syntax](https://help.github.com/en/actions/reference/workflow-syntax-for-github-actions)
and the [condition and expression syntax](https://help.github.com/en/actions/reference/context-and-expression-syntax-for-github-actions).
@@ -115,11 +138,11 @@ if they are not at the root of the repository, see [action.yml](action.yml) for
### Bundler
By default, if there is a `Gemfile.lock` file (or `$BUNDLE_GEMFILE.lock` if `$BUNDLE_GEMFILE` is set) with a `BUNDLED WITH` section,
the latest version of Bundler with the same major version will be installed.
By default, if there is a `Gemfile.lock` file (or `$BUNDLE_GEMFILE.lock` or `gems.locked`) with a `BUNDLED WITH` section,
that version of Bundler will be installed and used.
Otherwise, the latest compatible Bundler version is installed (Bundler 2 on Ruby >= 2.4, Bundler 1 on Ruby < 2.4).
This behavior can be customized, see [action.yml](action.yml) for details about the `bundler` input.
This behavior can be customized, see [action.yml](action.yml) for more details about the `bundler` input.
### Caching `bundle install` automatically
@@ -130,42 +153,17 @@ This action provides a way to automatically run `bundle install` and cache the r
bundler-cache: true
```
Note that any step doing `bundle install` (for the root `Gemfile`) or `gem install bundler` can be removed with `bundler-cache: true`.
This caching speeds up installing gems significantly and avoids too many requests to RubyGems.org.
It needs a `Gemfile` (or `$BUNDLE_GEMFILE`) under the [`working-directory`](#working-directory).
The caching works whether there is a `Gemfile.lock` or not.
If there is a `Gemfile.lock`, `bundle config --local deployment true` is used.
It needs a `Gemfile` (or `$BUNDLE_GEMFILE` or `gems.rb`) under the [`working-directory`](#working-directory).
If there is a `Gemfile.lock` (or `$BUNDLE_GEMFILE.lock` or `gems.locked`), `bundle config --local deployment true` is used.
To perform caching, this action will use `bundle config --local path vendor/bundle`.
Therefore, the Bundler `path` should not be changed in your workflow for the cache to work.
To use a `Gemfile` which is not at the root or has a different name, set `BUNDLE_GEMFILE` in the `env` at the job level
as shown in the [example](#matrix-of-gemfiles).
### Caching `bundle install` manually
You can also cache gems manually,
but this is not recommended because it is verbose and very difficult to use a correct cache key.
You can cache the installed gems with these two steps:
```yaml
- uses: actions/cache@v2
with:
path: vendor/bundle
key: bundle-use-ruby-${{ matrix.os }}-${{ matrix.ruby }}-${{ hashFiles('**/Gemfile.lock') }}
restore-keys: |
bundle-use-ruby-${{ matrix.os }}-${{ matrix.ruby }}-
- name: bundle install
run: |
bundle config deployment true
bundle config path vendor/bundle
bundle install --jobs 4
```
When using a single OS, replace `${{ matrix.os }}` with the OS.
When using a single job with a Ruby version, replace `${{ matrix.ruby }}` with the Ruby version.
When using `.ruby-version`, replace `${{ matrix.ruby }}` with `${{ hashFiles('.ruby-version') }}`.
When using `.tool-versions`, replace `${{ matrix.ruby }}` with `${{ hashFiles('.tool-versions') }}`.
This uses the [cache action](https://github.com/actions/cache).
The code above is a more complete version of the [Ruby - Bundler example](https://github.com/actions/cache/blob/master/examples.md#ruby---bundler).
Make sure to include `use-ruby` in the `key` to avoid conflicting with previous caches.
To perform caching, this action will use `bundle config --local path $PWD/vendor/bundle`.
Therefore, the Bundler `path` should not be changed in your workflow for the cache to work (no `bundle config path`).
## Windows
@@ -192,10 +190,20 @@ This action follows semantic versioning with a moving `v1` branch.
This follows the [recommendations](https://github.com/actions/toolkit/blob/master/docs/action-versioning.md) of GitHub Actions.
## Using self-hosted runners
You must meet the following parameters to use this action with self-hosted runners:
This action might work with [self-hosted runners](https://docs.github.com/en/actions/hosting-your-own-runners/about-self-hosted-runners)
if the [virtual environment](https://github.com/actions/virtual-environments) is very similar to the ones used by GitHub runners. Notably:
* Make sure to use the same operating system and version.
* Set the environment variable `ImageOS` to the corresponding value on GitHub-hosted runners (e.g. `ubuntu18`/`macos1015`/`win19`). This is necessary to detect the operating system and version.
* Make sure to use the same version of libssl.
* Make sure that the operating system has `libyaml-0` installed
* The runner software is running as user `runner` with a home directory of `/home/runner`, or you have created a symlink for the home directory of whatever user that the runner is running as to `/home/runner`.
* The default tool cache directory (`/opt/hostedtoolcache` on Linux, `/Users/runner/hostedtoolcache` on macOS,
`C:/hostedtoolcache/windows` on Windows) must be writable by the `runner` user.
This is necessary since the Ruby builds embed the install path when built and cannot be moved around.
* `/home/runner` must be writable by the `runner` user.
In other cases, please use a system Ruby or [install Ruby manually](https://github.com/postmodern/chruby/wiki#installing-rubies) instead.
## History
+3 -3
View File
@@ -11,9 +11,9 @@ inputs:
default: 'default'
bundler:
description: |
The version of Bundler to install. Either 'none', 1, 2, 'latest' or 'Gemfile.lock'.
For 'Gemfile.lock', the version is determined based on the BUNDLED WITH section from the file ($BUNDLE_GEMFILE || Gemfile).lock.
Defaults to 'Gemfile.lock' if it exists and 'latest' otherwise.
The version of Bundler to install. Either 'none', 'latest', 'Gemfile.lock', or a version number (e.g., 1, 2, 2.1.4).
For 'Gemfile.lock', the version is determined based on the BUNDLED WITH section from the file Gemfile.lock, $BUNDLE_GEMFILE.lock or gems.locked.
Defaults to 'Gemfile.lock' if the file exists and 'latest' otherwise.
required: false
default: 'default'
bundler-cache:
+81 -17
View File
@@ -11,6 +11,14 @@ export const windows = (os.platform() === 'win32')
// Extract to SSD on Windows, see https://github.com/ruby/setup-ruby/pull/14
export const drive = (windows ? (process.env['GITHUB_WORKSPACE'] || 'C')[0] : undefined)
export function partition(string, separator) {
const i = string.indexOf(separator)
if (i === -1) {
throw new Error(`No separator ${separator} in string ${string}`)
}
return [string.slice(0, i), string.slice(i + separator.length, string.length)]
}
export async function measure(name, block) {
return await core.group(name, async () => {
const start = performance.now()
@@ -28,6 +36,29 @@ export function isHeadVersion(rubyVersion) {
return rubyVersion === 'head' || rubyVersion === 'debug' || rubyVersion === 'mingw' || rubyVersion === 'mswin'
}
export function isStableVersion(rubyVersion) {
return /^\d+(\.\d+)*$/.test(rubyVersion)
}
export function isBundler2Default(engine, rubyVersion) {
if (engine === 'ruby') {
return isHeadVersion(rubyVersion) || floatVersion(rubyVersion) >= 2.7
} else if (engine === 'truffleruby') {
return isHeadVersion(rubyVersion)
} else {
return false
}
}
export function floatVersion(rubyVersion) {
const match = rubyVersion.match(/^\d+\.\d+/)
if (match) {
return parseFloat(match[0])
} else {
return 0.0
}
}
export async function hashFile(file) {
// See https://github.com/actions/runner/blob/master/src/Misc/expressionFunc/hashFiles/src/hashFiles.ts
const hash = crypto.createHash('sha256')
@@ -36,34 +67,67 @@ export async function hashFile(file) {
return hash.digest('hex')
}
function getImageOS() {
const imageOS = process.env['ImageOS']
if (!imageOS) {
throw new Error('The environment variable ImageOS must be set')
}
return imageOS
}
export function getVirtualEnvironmentName() {
const platform = os.platform()
if (platform === 'linux') {
return `ubuntu-${findUbuntuVersion()}`
} else if (platform === 'darwin') {
return 'macos-latest'
} else if (platform === 'win32') {
return 'windows-latest'
const imageOS = getImageOS()
let match = imageOS.match(/^ubuntu(\d+)/) // e.g. ubuntu18
if (match) {
return `ubuntu-${match[1]}.04`
}
match = imageOS.match(/^macos(\d{2})(\d+)?/) // e.g. macos1015, macos11
if (match) {
return `macos-${match[1]}.${match[2] || '0'}`
}
match = imageOS.match(/^win(\d+)/) // e.g. win19
if (match) {
return `windows-20${match[1]}`
}
throw new Error(`Unknown ImageOS ${imageOS}`)
}
export function shouldUseToolCache(engine, version) {
return engine === 'ruby' && !isHeadVersion(version)
}
function getPlatformToolCache(platform) {
// Hardcode paths rather than using $RUNNER_TOOL_CACHE because the prebuilt Rubies cannot be moved anyway
if (platform.startsWith('ubuntu-')) {
return '/opt/hostedtoolcache'
} else if (platform.startsWith('macos-')) {
return '/Users/runner/hostedtoolcache'
} else if (platform.startsWith('windows-')) {
return 'C:/hostedtoolcache/windows'
} else {
throw new Error(`Unknown platform ${platform}`)
throw new Error('Unknown platform')
}
}
function findUbuntuVersion() {
const lsb_release = fs.readFileSync('/etc/lsb-release', 'utf8')
const match = lsb_release.match(/^DISTRIB_RELEASE=(\d+\.\d+)$/m)
if (match) {
return match[1]
} else {
throw new Error('Could not find Ubuntu version')
}
export function getToolCacheRubyPrefix(platform, version) {
const toolCache = getPlatformToolCache(platform)
return path.join(toolCache, 'Ruby', version, 'x64')
}
export function createToolCacheCompleteFile(toolCacheRubyPrefix) {
const completeFile = `${toolCacheRubyPrefix}.complete`
fs.writeFileSync(completeFile, '')
}
// convert windows path like C:\Users\runneradmin to /c/Users/runneradmin
export function win2nix(path) {
if (/^[A-Z]:/i.test(path)) {
// path starts with drive
path = `/${path[0].toLowerCase()}${path.split(':', 2)[1]}`
path = `/${path[0].toLowerCase()}${partition(path, ':')[1]}`
}
return path.replace(/\\/g, '/').replace(/ /g, '\\ ')
}
Generated Vendored
+1544 -977
View File
File diff suppressed because it is too large Load Diff
+3
View File
@@ -0,0 +1,3 @@
source 'https://rubygems.org'
gem "bundler", "~> 1.0"
+3
View File
@@ -0,0 +1,3 @@
source "https://rubygems.org"
gem "rails", "~> 5.2.0"
+3
View File
@@ -0,0 +1,3 @@
source "https://rubygems.org"
gem "rails", "~> 6.0.0"
+95 -56
View File
@@ -39,7 +39,7 @@ export async function setupRuby(options = {}) {
const [engine, parsedVersion] = parseRubyEngineAndVersion(inputs['ruby-version'])
let installer
if (platform === 'windows-latest' && engine !== 'jruby') {
if (platform.startsWith('windows-') && engine === 'ruby') {
installer = require('./windows')
} else {
installer = require('./ruby-builder')
@@ -61,18 +61,36 @@ export async function setupRuby(options = {}) {
}
if (inputs['bundler'] !== 'none') {
await common.measure('Installing Bundler', async () =>
installBundler(inputs['bundler'], platform, rubyPrefix, engine, version))
const [gemfile, lockFile] = detectGemfiles()
const bundlerVersion = await common.measure('Installing Bundler', async () =>
installBundler(inputs['bundler'], lockFile, platform, rubyPrefix, engine, version))
if (inputs['bundler-cache'] === 'true') {
await common.measure('bundle install', async () =>
bundleInstall(platform, engine, version))
bundleInstall(gemfile, lockFile, platform, engine, version, bundlerVersion))
}
}
core.setOutput('ruby-prefix', rubyPrefix)
}
// The returned gemfile is guaranteed to exist, the lockfile might not exist
function detectGemfiles() {
const gemfilePath = process.env['BUNDLE_GEMFILE'] || 'Gemfile'
if (fs.existsSync(gemfilePath)) {
return [gemfilePath, `${gemfilePath}.lock`]
} else if (process.env['BUNDLE_GEMFILE']) {
throw new Error(`$BUNDLE_GEMFILE is set to ${gemfilePath} but does not exist`)
}
if (fs.existsSync("gems.rb")) {
return ["gems.rb", "gems.locked"]
}
return [null, null]
}
function parseRubyEngineAndVersion(rubyVersion) {
if (rubyVersion === 'default') {
if (fs.existsSync('.ruby-version')) {
@@ -90,7 +108,7 @@ function parseRubyEngineAndVersion(rubyVersion) {
} else if (rubyVersion === '.tool-versions') { // Read from .tool-versions
const toolVersions = fs.readFileSync('.tool-versions', 'utf8').trim()
const rubyLine = toolVersions.split(/\r?\n/).filter(e => e.match(/^ruby\s/))[0]
rubyVersion = rubyLine.split(/\s+/, 2)[1]
rubyVersion = rubyLine.match(/^ruby\s+(.+)$/)[1]
console.log(`Using ${rubyVersion} as input from file .tool-versions`)
}
@@ -100,9 +118,9 @@ function parseRubyEngineAndVersion(rubyVersion) {
version = rubyVersion
} else if (!rubyVersion.includes('-')) { // myruby -> myruby-stableVersion
engine = rubyVersion
version = '' // Let the logic below find the version
version = '' // Let the logic in validateRubyEngineAndVersion() find the version
} else { // engine-X.Y.Z
[engine, version] = rubyVersion.split('-', 2)
[engine, version] = common.partition(rubyVersion, '-')
}
return [engine, version]
@@ -116,7 +134,13 @@ function validateRubyEngineAndVersion(platform, engineVersions, engine, parsedVe
let version = parsedVersion
if (!engineVersions.includes(parsedVersion)) {
const latestToFirstVersion = engineVersions.slice().reverse()
const found = latestToFirstVersion.find(v => !common.isHeadVersion(v) && v.startsWith(parsedVersion))
// Try to match stable versions first, so an empty version (engine-only) matches the latest stable version
let found = latestToFirstVersion.find(v => common.isStableVersion(v) && v.startsWith(parsedVersion))
if (!found) {
// Exclude head versions, they must be exact matches
found = latestToFirstVersion.find(v => !common.isHeadVersion(v) && v.startsWith(parsedVersion))
}
if (found) {
version = found
} else {
@@ -150,30 +174,29 @@ function envPreInstall() {
}
}
function readBundledWithFromGemfileLock(path) {
if (fs.existsSync(path)) {
const contents = fs.readFileSync(path, 'utf8')
function readBundledWithFromGemfileLock(lockFile) {
if (lockFile !== null && fs.existsSync(lockFile)) {
const contents = fs.readFileSync(lockFile, 'utf8')
const lines = contents.split(/\r?\n/)
const bundledWithLine = lines.findIndex(line => /^BUNDLED WITH$/.test(line.trim()))
if (bundledWithLine !== -1) {
const nextLine = lines[bundledWithLine+1]
if (nextLine && /^\d+/.test(nextLine.trim())) {
const bundlerVersion = nextLine.trim()
const majorVersion = bundlerVersion.match(/^\d+/)[0]
console.log(`Using Bundler ${majorVersion} from ${path} BUNDLED WITH ${bundlerVersion}`)
return majorVersion
console.log(`Using Bundler ${bundlerVersion} from ${lockFile} BUNDLED WITH ${bundlerVersion}`)
return bundlerVersion
}
}
}
return null
}
async function installBundler(bundlerVersionInput, platform, rubyPrefix, engine, rubyVersion) {
var bundlerVersion = bundlerVersionInput
async function installBundler(bundlerVersionInput, lockFile, platform, rubyPrefix, engine, rubyVersion) {
let bundlerVersion = bundlerVersionInput
if (bundlerVersion === 'default' || bundlerVersion === 'Gemfile.lock') {
const gemfilePath = `${process.env['BUNDLE_GEMFILE'] || 'Gemfile'}.lock`
bundlerVersion = readBundledWithFromGemfileLock(gemfilePath)
bundlerVersion = readBundledWithFromGemfileLock(lockFile)
if (!bundlerVersion) {
bundlerVersion = 'latest'
}
@@ -189,53 +212,64 @@ async function installBundler(bundlerVersionInput, platform, rubyPrefix, engine,
throw new Error(`Cannot parse bundler input: ${bundlerVersion}`)
}
if (rubyVersion.match(/^2\.[12]/)) {
if (engine === 'ruby' && rubyVersion.match(/^2\.[012]/)) {
console.log('Bundler 2 requires Ruby 2.3+, using Bundler 1 on Ruby <= 2.2')
bundlerVersion = '1'
} else if (rubyVersion.startsWith('2.3')) {
} else if (engine === 'ruby' && rubyVersion.startsWith('2.3')) {
console.log('Ruby 2.3 has a bug with Bundler 2 (https://github.com/rubygems/rubygems/issues/3570), using Bundler 1 instead on Ruby 2.3')
bundlerVersion = '1'
} else if (engine === 'jruby' && rubyVersion.startsWith('9.1')) { // JRuby 9.1 targets Ruby 2.3, treat it the same
console.log('JRuby 9.1 has a bug with Bundler 2 (https://github.com/ruby/setup-ruby/issues/108), using Bundler 1 instead on JRuby 9.1')
bundlerVersion = '1'
}
if (engine === 'ruby' && common.isHeadVersion(rubyVersion) && bundlerVersion === '2') {
if (common.isHeadVersion(rubyVersion) && common.isBundler2Default(engine, rubyVersion) && bundlerVersion.startsWith('2')) {
console.log(`Using Bundler 2 shipped with ${engine}-${rubyVersion}`)
} else if (engine === 'truffleruby' && bundlerVersion === '1') {
} else if (engine === 'truffleruby' && !common.isHeadVersion(rubyVersion) && bundlerVersion.startsWith('1')) {
console.log(`Using Bundler 1 shipped with ${engine}`)
} else if (engine === 'rubinius') {
console.log(`Rubinius only supports the version of Bundler shipped with it`)
} else {
const gem = path.join(rubyPrefix, 'bin', 'gem')
await exec.exec(gem, ['install', 'bundler', '-v', `~> ${bundlerVersion}`, '--no-document'])
}
return bundlerVersion
}
async function bundleInstall(platform, engine, version) {
if (!fs.existsSync('Gemfile')) {
console.log('No Gemfile, skipping "bundle install" and caching')
return
async function bundleInstall(gemfile, lockFile, platform, engine, rubyVersion, bundlerVersion) {
if (gemfile === null) {
console.log('Could not determine gemfile path, skipping "bundle install" and caching')
return false
}
let envOptions = {}
if (bundlerVersion.startsWith('1') && common.isBundler2Default(engine, rubyVersion)) {
// If Bundler 1 is specified on Rubies which ship with Bundler 2,
// we need to specify which Bundler version to use explicitly until the lockfile exists.
console.log(`Setting BUNDLER_VERSION=${bundlerVersion} for "bundle config|lock" commands below to ensure Bundler 1 is used`)
envOptions = { env: { ...process.env, BUNDLER_VERSION: bundlerVersion } }
}
// config
const path = 'vendor/bundle'
const hasGemfileLock = fs.existsSync('Gemfile.lock');
if (hasGemfileLock) {
await exec.exec('bundle', ['config', '--local', 'deployment', 'true'])
const cachePath = 'vendor/bundle'
// An absolute path, so it is reliably under $PWD/vendor/bundle, and not relative to the gemfile's directory
const bundleCachePath = path.join(process.cwd(), cachePath)
await exec.exec('bundle', ['config', '--local', 'path', bundleCachePath], envOptions)
if (fs.existsSync(lockFile)) {
await exec.exec('bundle', ['config', '--local', 'deployment', 'true'], envOptions)
} else {
// Generate the lockfile so we can use it to compute the cache key.
// This will also automatically pick up the latest gem versions compatible with the Gemfile.
await exec.exec('bundle', ['lock'], envOptions)
}
await exec.exec('bundle', ['config', '--local', 'path', path])
// cache key
const paths = [path]
const baseKey = await computeBaseKey(platform, engine, version)
let key = baseKey
let restoreKeys
if (hasGemfileLock) {
key += `-Gemfile.lock-${await common.hashFile('Gemfile.lock')}`
// If only Gemfile.lock we can reuse some of the cache (but it will keep old gem versions in the cache)
restoreKeys = [`${baseKey}-Gemfile.lock-`]
} else {
// Only exact key, to never mix native gems of different platforms or Ruby versions
restoreKeys = []
}
const paths = [cachePath]
const baseKey = await computeBaseKey(platform, engine, rubyVersion, lockFile)
const key = `${baseKey}-${await common.hashFile(lockFile)}`
// If only Gemfile.lock changes we can reuse part of the cache, and clean old gem versions below
const restoreKeys = [`${baseKey}-`]
console.log(`Cache key: ${key}`)
// restore cache & install
@@ -254,14 +288,14 @@ async function bundleInstall(platform, engine, version) {
console.log(`Found cache for key: ${cachedKey}`)
}
let alreadyInstalled = false
if (cachedKey === key) {
const exitCode = await exec.exec('bundle', ['check'], { ignoreReturnCode: true })
alreadyInstalled = (exitCode === 0)
}
// Always run 'bundle install' to list the gems
await exec.exec('bundle', ['install', '--jobs', '4'])
if (!alreadyInstalled) {
await exec.exec('bundle', ['install', '--jobs', '4'])
// @actions/cache only allows to save for non-existing keys
if (cachedKey !== key) {
if (cachedKey) { // existing cache but Gemfile.lock differs, clean old gems
await exec.exec('bundle', ['clean'])
}
// Error handling from https://github.com/actions/cache/blob/master/src/save.ts
console.log('Saving cache')
@@ -277,10 +311,13 @@ async function bundleInstall(platform, engine, version) {
}
}
}
return true
}
async function computeBaseKey(platform, engine, version) {
let baseKey = `setup-ruby-bundle-install-${platform}-${engine}-${version}`
async function computeBaseKey(platform, engine, version, lockFile) {
let key = `setup-ruby-bundler-cache-v3-${platform}-${engine}-${version}`
if (engine !== 'jruby' && common.isHeadVersion(version)) {
let revision = '';
await exec.exec('ruby', ['-e', 'print RUBY_REVISION'], {
@@ -291,9 +328,11 @@ async function computeBaseKey(platform, engine, version) {
}
}
});
baseKey += `-revision-${revision}`
key += `-revision-${revision}`
}
return baseKey
key += `-${lockFile}`
return key
}
if (__filename.endsWith('index.js')) { run() }
+2 -2
View File
@@ -22,8 +22,8 @@
},
"homepage": "https://github.com/ruby/setup-ruby",
"dependencies": {
"@actions/cache": "^1.0.2",
"@actions/core": "^1.2.4",
"@actions/cache": "^1.0.5",
"@actions/core": "^1.2.6",
"@actions/exec": "^1.0.3",
"@actions/io": "^1.0.2",
"@actions/tool-cache": "^1.3.4"
+4 -9
View File
@@ -7,26 +7,21 @@ export function getVersions(platform) {
"2.4.0", "2.4.1", "2.4.2", "2.4.3", "2.4.4", "2.4.5", "2.4.6", "2.4.7", "2.4.9", "2.4.10",
"2.5.0", "2.5.1", "2.5.2", "2.5.3", "2.5.4", "2.5.5", "2.5.6", "2.5.7", "2.5.8",
"2.6.0", "2.6.1", "2.6.2", "2.6.3", "2.6.4", "2.6.5", "2.6.6",
"2.7.0", "2.7.1",
"2.7.0", "2.7.1", "2.7.2",
"3.0.0-preview1", "3.0.0-preview2", "3.0.0-rc1", "3.0.0",
"head", "debug",
],
"jruby": [
"9.1.17.0",
"9.2.9.0", "9.2.10.0", "9.2.11.0", "9.2.11.1", "9.2.12.0", "9.2.13.0",
"9.2.9.0", "9.2.10.0", "9.2.11.0", "9.2.11.1", "9.2.12.0", "9.2.13.0", "9.2.14.0",
"head"
],
"truffleruby": [
"19.3.0", "19.3.1",
"20.0.0", "20.1.0", "20.2.0",
"20.0.0", "20.1.0", "20.2.0", "20.3.0",
"head"
]
}
if (platform === 'ubuntu-18.04') {
versions['rubinius'] = [
"4.14"
]
}
return versions
}
+41 -19
View File
@@ -6,7 +6,7 @@ const tc = require('@actions/tool-cache')
const common = require('./common')
const rubyBuilderVersions = require('./ruby-builder-versions')
const builderReleaseTag = 'enable-shared'
const builderReleaseTag = 'toolcache'
const releasesURL = 'https://github.com/ruby/ruby-builder/releases'
const windows = common.windows
@@ -16,22 +16,35 @@ export function getAvailableVersions(platform, engine) {
}
export async function install(platform, engine, version) {
return await downloadAndExtract(platform, engine, version)
}
async function downloadAndExtract(platform, engine, version) {
const rubiesDir = windows ? `${common.drive}:` : path.join(os.homedir(), '.rubies')
const rubyPrefix = path.join(rubiesDir, `${engine}-${version}`)
// Set the PATH now, so the MSYS2 'tar' is in Path on Windows
if (engine === 'rubinius') {
common.setupPath([path.join(rubyPrefix, 'bin'), path.join(rubyPrefix, 'gems', 'bin')])
let rubyPrefix, inToolCache
if (common.shouldUseToolCache(engine, version)) {
inToolCache = tc.find('Ruby', version)
if (inToolCache) {
rubyPrefix = inToolCache
} else {
rubyPrefix = common.getToolCacheRubyPrefix(platform, version)
}
} else if (windows) {
rubyPrefix = path.join(`${common.drive}:`, `${engine}-${version}`)
} else {
common.setupPath([path.join(rubyPrefix, 'bin')])
rubyPrefix = path.join(os.homedir(), '.rubies', `${engine}-${version}`)
}
await io.mkdirP(rubiesDir)
// Set the PATH now, so the MSYS2 'tar' is in Path on Windows
common.setupPath([path.join(rubyPrefix, 'bin')])
if (!inToolCache) {
await downloadAndExtract(platform, engine, version, rubyPrefix);
}
return rubyPrefix
}
async function downloadAndExtract(platform, engine, version, rubyPrefix) {
const parentDir = path.dirname(rubyPrefix)
await io.rmRF(rubyPrefix)
await io.mkdirP(parentDir)
const downloadPath = await common.measure('Downloading Ruby', async () => {
const url = getDownloadURL(platform, engine, version)
@@ -42,20 +55,29 @@ async function downloadAndExtract(platform, engine, version) {
await common.measure('Extracting Ruby', async () => {
if (windows) {
// Windows 2016 doesn't have system tar, use MSYS2's, it needs unix style paths
await exec.exec('tar', [ '-xz', '-C', common.win2nix(rubiesDir), '-f', common.win2nix(downloadPath) ])
await exec.exec('tar', ['-xz', '-C', common.win2nix(parentDir), '-f', common.win2nix(downloadPath)])
} else {
await exec.exec('tar', [ '-xz', '-C', rubiesDir, '-f', downloadPath ])
await exec.exec('tar', ['-xz', '-C', parentDir, '-f', downloadPath])
}
})
return rubyPrefix
if (common.shouldUseToolCache(engine, version)) {
common.createToolCacheCompleteFile(rubyPrefix)
}
}
function getDownloadURL(platform, engine, version) {
let builderPlatform = platform
if (platform.startsWith('windows-')) {
builderPlatform = 'windows-latest'
} else if (platform.startsWith('macos-')) {
builderPlatform = 'macos-latest'
}
if (common.isHeadVersion(version)) {
return getLatestHeadBuildURL(platform, engine, version)
return getLatestHeadBuildURL(builderPlatform, engine, version)
} else {
return `${releasesURL}/download/${builderReleaseTag}/${engine}-${version}-${platform}.tar.gz`
return `${releasesURL}/download/${builderReleaseTag}/${engine}-${version}-${builderPlatform}.tar.gz`
}
}
+8 -6
View File
@@ -3,14 +3,16 @@ versions = eval hash
by_minor = versions[:ruby].group_by { |v| v[/^\d\.\d/] }
p by_minor['2.1']
p by_minor['2.2']
p by_minor['2.3']
(4..7).each do |minor|
(1..7).each do |minor|
p by_minor["2.#{minor}"].map { |v| "ruby-#{v}" }
end
puts
p (versions[:truffleruby] - %w[head]).map { |v| "truffleruby-#{v}" }
puts
p (versions[:jruby] - %w[head]).map { |v| "jruby-#{v}" }
p (versions[:truffleruby] - %w[head]).map { |v| "truffleruby-#{v}" }
(versions[:jruby] - %w[head]).each do |v|
puts "- { os: windows-latest, jruby-version: #{v}, ruby: jruby-#{v} }"
end
+1
View File
@@ -29,6 +29,7 @@ export const versions = {
"2.6.6": "https://github.com/oneclick/rubyinstaller2/releases/download/RubyInstaller-2.6.6-1/rubyinstaller-2.6.6-1-x64.7z",
"2.7.0": "https://github.com/oneclick/rubyinstaller2/releases/download/RubyInstaller-2.7.0-1/rubyinstaller-2.7.0-1-x64.7z",
"2.7.1": "https://github.com/oneclick/rubyinstaller2/releases/download/RubyInstaller-2.7.1-1/rubyinstaller-2.7.1-1-x64.7z",
"2.7.2": "https://github.com/oneclick/rubyinstaller2/releases/download/RubyInstaller-2.7.2-1/rubyinstaller-2.7.2-1-x64.7z",
"head": "https://github.com/oneclick/rubyinstaller2/releases/download/rubyinstaller-head/rubyinstaller-head-x64.7z",
"mingw": "https://github.com/MSP-Greg/ruby-loco/releases/download/ruby-master/ruby-mingw.7z",
"mswin": "https://github.com/MSP-Greg/ruby-loco/releases/download/ruby-master/ruby-mswin.7z"
+31 -4
View File
@@ -6,6 +6,7 @@ const path = require('path')
const cp = require('child_process')
const core = require('@actions/core')
const exec = require('@actions/exec')
const io = require('@actions/io')
const tc = require('@actions/tool-cache')
const common = require('./common')
const rubyInstallerVersions = require('./windows-versions').versions
@@ -35,21 +36,47 @@ export async function install(platform, engine, version) {
}
const base = url.slice(url.lastIndexOf('/') + 1, url.length - '.7z'.length)
const rubyPrefix = `${drive}:\\${base}`
let rubyPrefix, inToolCache
if (common.shouldUseToolCache(engine, version)) {
inToolCache = tc.find('Ruby', version)
if (inToolCache) {
rubyPrefix = inToolCache
} else {
rubyPrefix = common.getToolCacheRubyPrefix(platform, version)
}
} else {
rubyPrefix = `${drive}:\\${base}`
}
let toolchainPaths = (version === 'mswin') ? await setupMSWin() : await setupMingw(version)
common.setupPath([`${rubyPrefix}\\bin`, ...toolchainPaths])
if (!inToolCache) {
await downloadAndExtract(engine, version, url, base, rubyPrefix);
}
return rubyPrefix
}
async function downloadAndExtract(engine, version, url, base, rubyPrefix) {
const parentDir = path.dirname(rubyPrefix)
const downloadPath = await common.measure('Downloading Ruby', async () => {
console.log(url)
return await tc.downloadTool(url)
})
await common.measure('Extracting Ruby', async () =>
exec.exec('7z', ['x', downloadPath, `-xr!${base}\\share\\doc`, `-o${drive}:\\`], { silent: true }))
exec.exec('7z', ['x', downloadPath, `-xr!${base}\\share\\doc`, `-o${parentDir}`], { silent: true }))
return rubyPrefix
if (base !== path.basename(rubyPrefix)) {
await io.mv(path.join(parentDir, base), rubyPrefix)
}
if (common.shouldUseToolCache(engine, version)) {
common.createToolCacheCompleteFile(rubyPrefix)
}
}
async function setupMingw(version) {
@@ -109,7 +136,7 @@ export function addVCVARSEnv() {
let newSet = cp.execSync(cmd).toString().trim().split(/\r?\n/)
newSet = newSet.filter(line => line.match(/\S=\S/))
newSet.forEach(s => {
let [k,v] = s.split('=', 2)
let [k,v] = common.partition(s, '=')
newEnv.set(k,v)
})
Generated
+20 -18
View File
@@ -2,30 +2,25 @@
# yarn lockfile v1
"@actions/cache@^1.0.2":
version "1.0.2"
resolved "https://registry.yarnpkg.com/@actions/cache/-/cache-1.0.2.tgz#a223dcc752c7f988016d28ee7232f930f85cec61"
integrity sha512-CzAseaJ4cKmOI58EIWUb/LfeYdM7Y25s39OEMtWAhEPrPPzrbSEjGHCLaYjJ0V8C4iojo8vBYh5B3OIJ37EiJw==
"@actions/cache@^1.0.5":
version "1.0.5"
resolved "https://registry.yarnpkg.com/@actions/cache/-/cache-1.0.5.tgz#ba98725d38611b5426fc57a2f00bd8b0d9202f36"
integrity sha512-TcvJOduwsPP27KLmIa5cqXsQYFK2GzILcEpnhvYmhGwi1aYx9XwhKmp6Im8X6DJMBxbvupKPsOntG6f6sSkIPA==
dependencies:
"@actions/core" "^1.2.4"
"@actions/core" "^1.2.6"
"@actions/exec" "^1.0.1"
"@actions/glob" "^0.1.0"
"@actions/http-client" "^1.0.8"
"@actions/http-client" "^1.0.9"
"@actions/io" "^1.0.1"
"@azure/ms-rest-js" "^2.0.7"
"@azure/storage-blob" "^12.1.2"
semver "^6.1.0"
uuid "^3.3.3"
"@actions/core@^1.2.0", "@actions/core@^1.2.4":
version "1.2.4"
resolved "https://registry.yarnpkg.com/@actions/core/-/core-1.2.4.tgz#96179dbf9f8d951dd74b40a0dbd5c22555d186ab"
integrity sha512-YJCEq8BE3CdN8+7HPZ/4DxJjk/OkZV2FFIf+DlZTC/4iBlzYCD5yjRR6eiOS5llO11zbRltIRuKAjMKaWTE6cg==
"@actions/core@^1.2.3":
version "1.2.3"
resolved "https://registry.yarnpkg.com/@actions/core/-/core-1.2.3.tgz#e844b4fa0820e206075445079130868f95bfca95"
integrity sha512-Wp4xnyokakM45Uuj4WLUxdsa8fJjKVl1fDTsPbTEcTcuu0Nb26IPQbOtjmnfaCPGcaoPOOqId8H9NapZ8gii4w==
"@actions/core@^1.2.0", "@actions/core@^1.2.3", "@actions/core@^1.2.6":
version "1.2.6"
resolved "https://registry.yarnpkg.com/@actions/core/-/core-1.2.6.tgz#a78d49f41a4def18e88ce47c2cac615d5694bf09"
integrity sha512-ZQYitnqiyBc3D+k7LsgSBmMDVkOVidaagDG7j3fOym77jNunWRuYx7VSHa9GNfFZh+zh61xsCjRj4JxMZlDqTA==
"@actions/exec@^1.0.0", "@actions/exec@^1.0.1", "@actions/exec@^1.0.3":
version "1.0.4"
@@ -49,6 +44,13 @@
dependencies:
tunnel "0.0.6"
"@actions/http-client@^1.0.9":
version "1.0.9"
resolved "https://registry.yarnpkg.com/@actions/http-client/-/http-client-1.0.9.tgz#af1947d020043dbc6a3b4c5918892095c30ffb52"
integrity sha512-0O4SsJ7q+MK0ycvXPl2e6bMXV7dxAXOGjrXS1eTF9s2S401Tp6c/P3c3Joz04QefC1J6Gt942Wl2jbm3f4mLcg==
dependencies:
tunnel "0.0.6"
"@actions/io@^1.0.1", "@actions/io@^1.0.2":
version "1.0.2"
resolved "https://registry.yarnpkg.com/@actions/io/-/io-1.0.2.tgz#2f614b6e69ce14d191180451eb38e6576a6e6b27"
@@ -331,9 +333,9 @@ minimatch@^3.0.4:
brace-expansion "^1.1.7"
node-fetch@^2.6.0:
version "2.6.0"
resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.0.tgz#e633456386d4aa55863f676a7ab0daa8fdecb0fd"
integrity sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==
version "2.6.1"
resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052"
integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==
process@^0.11.10:
version "0.11.10"