mirror of
https://github.com/ruby/setup-ruby.git
synced 2026-09-13 14:34:21 +02:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
23b2b5e5f1 | ||
|
|
42fc2d3bce | ||
|
|
30f5e2d4cd | ||
|
|
fd1d77b75c | ||
|
|
2a0be7a409 | ||
|
|
bacba738b2 | ||
|
|
21351ecc0a | ||
|
|
4d7e038419 | ||
|
|
e27aee156d | ||
|
|
43bb24d212 | ||
|
|
0c4183e8b8 | ||
|
|
50ae8432ea | ||
|
|
a699edbce6 | ||
|
|
e38f9abc9e | ||
|
|
7c2bf7263d | ||
|
|
34fbbc1d36 | ||
|
|
9bc07a3af0 | ||
|
|
63dde36864 | ||
|
|
fde3324171 | ||
|
|
59aafb8612 | ||
|
|
ad1ebae995 | ||
|
|
f4a8aa6c33 | ||
|
|
bc0f274d1c | ||
|
|
1c896c8ea1 | ||
|
|
ba761ba8ff | ||
|
|
bb3a0c6e0b | ||
|
|
8e77d9e0fa | ||
|
|
339f055c86 | ||
|
|
0592d01dc3 | ||
|
|
d7b76f909a | ||
|
|
ebed7f7b66 | ||
|
|
933dca770c | ||
|
|
693cf1794d | ||
|
|
efda314f4a | ||
|
|
c49deecea1 | ||
|
|
5da31b45d7 | ||
|
|
4bb29a57df | ||
|
|
9be533b7d4 | ||
|
|
35f0af38a7 | ||
|
|
b9ca796ede | ||
|
|
11082225e4 | ||
|
|
4de6eb91a8 | ||
|
|
60f215c278 | ||
|
|
a195098f6b | ||
|
|
f117ca04d8 | ||
|
|
8bc9ca9ace | ||
|
|
965ef501d4 | ||
|
|
153ca5e38f | ||
|
|
0effb2cc50 | ||
|
|
b62e5d53aa | ||
|
|
1c172ef5dc | ||
|
|
4cbbce6b48 |
@@ -15,21 +15,23 @@ jobs:
|
|||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
os: [ ubuntu-16.04, ubuntu-18.04, ubuntu-20.04, macos-10.15, windows-2016, windows-2019 ]
|
os: [ ubuntu-16.04, ubuntu-18.04, ubuntu-20.04, macos-10.15, macos-11.0, windows-2016, windows-2019 ]
|
||||||
# Use various version syntax here for testing
|
# 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, debug, jruby-9.1, jruby, jruby-head, truffleruby, truffleruby-head ]
|
||||||
include:
|
include:
|
||||||
- { os: ubuntu-18.04, ruby: rubinius }
|
|
||||||
- { os: windows-2016, ruby: mingw }
|
- { os: windows-2016, ruby: mingw }
|
||||||
- { os: windows-2019, ruby: mingw }
|
- { os: windows-2019, ruby: mingw }
|
||||||
- { os: windows-2019, ruby: mswin }
|
- { os: windows-2019, ruby: mswin }
|
||||||
exclude:
|
exclude:
|
||||||
|
- { os: windows-2016, ruby: '3.0' }
|
||||||
- { os: windows-2016, ruby: debug }
|
- { os: windows-2016, ruby: debug }
|
||||||
- { os: windows-2016, ruby: truffleruby }
|
- { os: windows-2016, ruby: truffleruby }
|
||||||
- { os: windows-2016, ruby: truffleruby-head }
|
- { os: windows-2016, ruby: truffleruby-head }
|
||||||
|
- { os: windows-2019, ruby: '3.0' }
|
||||||
- { os: windows-2019, ruby: debug }
|
- { os: windows-2019, ruby: debug }
|
||||||
- { os: windows-2019, ruby: truffleruby }
|
- { os: windows-2019, ruby: truffleruby }
|
||||||
- { os: windows-2019, ruby: truffleruby-head }
|
- { os: windows-2019, ruby: truffleruby-head }
|
||||||
|
- { os: macos-11.0, ruby: truffleruby }
|
||||||
|
|
||||||
name: ${{ matrix.os }} ${{ matrix.ruby }}
|
name: ${{ matrix.os }} ${{ matrix.ruby }}
|
||||||
runs-on: ${{ matrix.os }}
|
runs-on: ${{ matrix.os }}
|
||||||
@@ -60,6 +62,10 @@ jobs:
|
|||||||
echo 'ridk is unavailable'
|
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
|
- name: Subprocess test
|
||||||
run: ruby test_subprocess.rb
|
run: ruby test_subprocess.rb
|
||||||
@@ -71,6 +77,7 @@ jobs:
|
|||||||
- name: C extension test
|
- name: C extension test
|
||||||
run: gem install json:2.2.0 --no-document
|
run: gem install json:2.2.0 --no-document
|
||||||
- run: bundle --version
|
- 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 install
|
||||||
- run: bundle exec rake --version
|
- run: bundle exec rake --version
|
||||||
|
|
||||||
@@ -96,7 +103,7 @@ jobs:
|
|||||||
run: gem install sassc -N
|
run: gem install sassc -N
|
||||||
|
|
||||||
lint:
|
lint:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-20.04
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v2
|
||||||
- run: yarn install
|
- run: yarn install
|
||||||
|
|||||||
@@ -14,33 +14,34 @@ This action currently supports these versions of MRI, JRuby and TruffleRuby:
|
|||||||
|
|
||||||
| Interpreter | Versions |
|
| 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 |
|
| 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, head, debug, mingw, mswin |
|
||||||
| JRuby | 9.1.17.0, 9.2.9.0 - 9.2.13.0, head |
|
| JRuby | 9.1.17.0, 9.2.9.0 - 9.2.13.0, head |
|
||||||
| TruffleRuby | 19.3.0 - 20.2.0, head |
|
| TruffleRuby | 19.3.0 - 20.3.0, head |
|
||||||
| Rubinius | 4.14 |
|
|
||||||
|
|
||||||
`ruby-debug` is the same as `ruby-head` but with assertions enabled (`-DRUBY_DEBUG=1`).
|
`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.
|
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.
|
Preview and RC versions of Ruby might be available too on Ubuntu and macOS (not on Windows).
|
||||||
Ruby 2.3 on Windows only has builds for 2.3.0, 2.3.1 and 2.3.3 (same as RubyInstaller).
|
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,
|
Only versions published by [RubyInstaller](https://rubyinstaller.org/downloads/archives/) are available on Windows.
|
||||||
which means Ruby ≤ 2.3 is unmaintained and considered insecure.
|
Due to that, Ruby 2.2 resolves to 2.2.6 on Windows and 2.2.10 on other platforms.
|
||||||
On Windows, Ruby 2.4 uses OpenSSL 1.0.2, which is no longer maintained.
|
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
|
### 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 |
|
| Operating System | Recommended | Other Supported Versions |
|
||||||
| ----------- | -------- | -------- |
|
| ----------- | -------- | -------- |
|
||||||
| Ubuntu | `ubuntu-latest` (= `ubuntu-18.04`) | `ubuntu-20.04`, `ubuntu-16.04` |
|
| 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` |
|
| 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)
|
The prebuilt releases are generated by [ruby-builder](https://github.com/ruby/ruby-builder)
|
||||||
and on Windows by [RubyInstaller2](https://github.com/oneclick/rubyinstaller2).
|
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).
|
`mingw` and `mswin` builds are generated by [ruby-loco](https://github.com/MSP-Greg/ruby-loco).
|
||||||
@@ -65,7 +66,7 @@ jobs:
|
|||||||
- uses: ruby/setup-ruby@v1
|
- uses: ruby/setup-ruby@v1
|
||||||
with:
|
with:
|
||||||
ruby-version: 2.6 # Not needed with a .ruby-version file
|
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
|
- run: bundle exec rake
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -84,13 +85,12 @@ jobs:
|
|||||||
os: [ubuntu, macos]
|
os: [ubuntu, macos]
|
||||||
ruby: [2.5, 2.6, 2.7, head, debug, jruby, jruby-head, truffleruby, truffleruby-head]
|
ruby: [2.5, 2.6, 2.7, head, debug, jruby, jruby-head, truffleruby, truffleruby-head]
|
||||||
runs-on: ${{ matrix.os }}-latest
|
runs-on: ${{ matrix.os }}-latest
|
||||||
continue-on-error: ${{ endsWith(matrix.ruby, 'head') || matrix.ruby == 'debug' }}
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v2
|
||||||
- uses: ruby/setup-ruby@v1
|
- uses: ruby/setup-ruby@v1
|
||||||
with:
|
with:
|
||||||
ruby-version: ${{ matrix.ruby }}
|
ruby-version: ${{ matrix.ruby }}
|
||||||
- run: bundle install
|
bundler-cache: true # runs 'bundle install' and caches installed gems automatically
|
||||||
- run: bundle exec rake
|
- run: bundle exec rake
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -115,7 +115,7 @@ if they are not at the root of the repository, see [action.yml](action.yml) for
|
|||||||
|
|
||||||
### Bundler
|
### Bundler
|
||||||
|
|
||||||
By default, if there is a `Gemfile.lock` file (or `$BUNDLE_GEMFILE.lock` if `$BUNDLE_GEMFILE` is set) with a `BUNDLED WITH` section,
|
By default, if there is a `Gemfile.lock` file (or `$BUNDLE_GEMFILE.lock` or `gems.locked`) with a `BUNDLED WITH` section,
|
||||||
the latest version of Bundler with the same major version will be installed.
|
the latest version of Bundler with the same major version will be installed.
|
||||||
Otherwise, the latest compatible Bundler version is installed (Bundler 2 on Ruby >= 2.4, Bundler 1 on Ruby < 2.4).
|
Otherwise, the latest compatible Bundler version is installed (Bundler 2 on Ruby >= 2.4, Bundler 1 on Ruby < 2.4).
|
||||||
|
|
||||||
@@ -130,42 +130,31 @@ This action provides a way to automatically run `bundle install` and cache the r
|
|||||||
bundler-cache: true
|
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.
|
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).
|
It needs a `Gemfile` (or `$BUNDLE_GEMFILE` or `gems.rb`) under the [`working-directory`](#working-directory).
|
||||||
The caching works whether there is a `Gemfile.lock` or not.
|
If there is a `Gemfile.lock` (or `$BUNDLE_GEMFILE.lock` or `gems.locked`), `bundle config --local deployment true` is used.
|
||||||
If there is a `Gemfile.lock`, `bundle config --local deployment true` is used.
|
|
||||||
|
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, so it is set for all steps:
|
||||||
|
```yaml
|
||||||
|
jobs:
|
||||||
|
test:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
env:
|
||||||
|
BUNDLE_GEMFILE: subdir/mygemfile
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
- uses: ruby/setup-ruby@v1
|
||||||
|
with:
|
||||||
|
ruby-version: 2.6
|
||||||
|
bundler-cache: true
|
||||||
|
- run: bundle exec rake
|
||||||
|
```
|
||||||
|
Of course you can also use a matrix of gemfiles if you need to test multiple gemfiles.
|
||||||
|
|
||||||
To perform caching, this action will use `bundle config --local path vendor/bundle`.
|
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.
|
Therefore, the Bundler `path` should not be changed in your workflow for the cache to work (no `bundle config path`).
|
||||||
|
|
||||||
### 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.
|
|
||||||
|
|
||||||
## Windows
|
## Windows
|
||||||
|
|
||||||
@@ -192,10 +181,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.
|
This follows the [recommendations](https://github.com/actions/toolkit/blob/master/docs/action-versioning.md) of GitHub Actions.
|
||||||
|
|
||||||
## Using self-hosted runners
|
## 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
|
* 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
|
## History
|
||||||
|
|
||||||
|
|||||||
+2
-2
@@ -12,8 +12,8 @@ inputs:
|
|||||||
bundler:
|
bundler:
|
||||||
description: |
|
description: |
|
||||||
The version of Bundler to install. Either 'none', 1, 2, 'latest' or 'Gemfile.lock'.
|
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.
|
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 it exists and 'latest' otherwise.
|
Defaults to 'Gemfile.lock' if the file exists and 'latest' otherwise.
|
||||||
required: false
|
required: false
|
||||||
default: 'default'
|
default: 'default'
|
||||||
bundler-cache:
|
bundler-cache:
|
||||||
|
|||||||
@@ -11,6 +11,14 @@ export const windows = (os.platform() === 'win32')
|
|||||||
// Extract to SSD on Windows, see https://github.com/ruby/setup-ruby/pull/14
|
// 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 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) {
|
export async function measure(name, block) {
|
||||||
return await core.group(name, async () => {
|
return await core.group(name, async () => {
|
||||||
const start = performance.now()
|
const start = performance.now()
|
||||||
@@ -28,6 +36,10 @@ export function isHeadVersion(rubyVersion) {
|
|||||||
return rubyVersion === 'head' || rubyVersion === 'debug' || rubyVersion === 'mingw' || rubyVersion === 'mswin'
|
return rubyVersion === 'head' || rubyVersion === 'debug' || rubyVersion === 'mingw' || rubyVersion === 'mswin'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function isStableVersion(rubyVersion) {
|
||||||
|
return /^\d+(\.\d+)*$/.test(rubyVersion)
|
||||||
|
}
|
||||||
|
|
||||||
export async function hashFile(file) {
|
export async function hashFile(file) {
|
||||||
// See https://github.com/actions/runner/blob/master/src/Misc/expressionFunc/hashFiles/src/hashFiles.ts
|
// See https://github.com/actions/runner/blob/master/src/Misc/expressionFunc/hashFiles/src/hashFiles.ts
|
||||||
const hash = crypto.createHash('sha256')
|
const hash = crypto.createHash('sha256')
|
||||||
@@ -36,34 +48,67 @@ export async function hashFile(file) {
|
|||||||
return hash.digest('hex')
|
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() {
|
export function getVirtualEnvironmentName() {
|
||||||
const platform = os.platform()
|
const imageOS = getImageOS()
|
||||||
if (platform === 'linux') {
|
|
||||||
return `ubuntu-${findUbuntuVersion()}`
|
let match = imageOS.match(/^ubuntu(\d+)/) // e.g. ubuntu18
|
||||||
} else if (platform === 'darwin') {
|
if (match) {
|
||||||
return 'macos-latest'
|
return `ubuntu-${match[1]}.04`
|
||||||
} else if (platform === 'win32') {
|
}
|
||||||
return 'windows-latest'
|
|
||||||
|
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 {
|
} else {
|
||||||
throw new Error(`Unknown platform ${platform}`)
|
throw new Error('Unknown platform')
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function findUbuntuVersion() {
|
export function getToolCacheRubyPrefix(platform, version) {
|
||||||
const lsb_release = fs.readFileSync('/etc/lsb-release', 'utf8')
|
const toolCache = getPlatformToolCache(platform)
|
||||||
const match = lsb_release.match(/^DISTRIB_RELEASE=(\d+\.\d+)$/m)
|
return path.join(toolCache, 'Ruby', version, 'x64')
|
||||||
if (match) {
|
}
|
||||||
return match[1]
|
|
||||||
} else {
|
export function createToolCacheCompleteFile(toolCacheRubyPrefix) {
|
||||||
throw new Error('Could not find Ubuntu version')
|
const completeFile = `${toolCacheRubyPrefix}.complete`
|
||||||
}
|
fs.writeFileSync(completeFile, '')
|
||||||
}
|
}
|
||||||
|
|
||||||
// convert windows path like C:\Users\runneradmin to /c/Users/runneradmin
|
// convert windows path like C:\Users\runneradmin to /c/Users/runneradmin
|
||||||
export function win2nix(path) {
|
export function win2nix(path) {
|
||||||
if (/^[A-Z]:/i.test(path)) {
|
if (/^[A-Z]:/i.test(path)) {
|
||||||
// path starts with drive
|
// 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, '\\ ')
|
return path.replace(/\\/g, '/').replace(/ /g, '\\ ')
|
||||||
}
|
}
|
||||||
|
|||||||
+518
-624
File diff suppressed because it is too large
Load Diff
@@ -39,7 +39,7 @@ export async function setupRuby(options = {}) {
|
|||||||
const [engine, parsedVersion] = parseRubyEngineAndVersion(inputs['ruby-version'])
|
const [engine, parsedVersion] = parseRubyEngineAndVersion(inputs['ruby-version'])
|
||||||
|
|
||||||
let installer
|
let installer
|
||||||
if (platform === 'windows-latest' && engine !== 'jruby') {
|
if (platform.startsWith('windows-') && engine === 'ruby') {
|
||||||
installer = require('./windows')
|
installer = require('./windows')
|
||||||
} else {
|
} else {
|
||||||
installer = require('./ruby-builder')
|
installer = require('./ruby-builder')
|
||||||
@@ -61,18 +61,34 @@ export async function setupRuby(options = {}) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (inputs['bundler'] !== 'none') {
|
if (inputs['bundler'] !== 'none') {
|
||||||
|
const [gemfile, lockFile] = detectGemfiles()
|
||||||
|
|
||||||
await common.measure('Installing Bundler', async () =>
|
await common.measure('Installing Bundler', async () =>
|
||||||
installBundler(inputs['bundler'], platform, rubyPrefix, engine, version))
|
installBundler(inputs['bundler'], lockFile, platform, rubyPrefix, engine, version))
|
||||||
|
|
||||||
if (inputs['bundler-cache'] === 'true') {
|
if (inputs['bundler-cache'] === 'true') {
|
||||||
await common.measure('bundle install', async () =>
|
await common.measure('bundle install', async () =>
|
||||||
bundleInstall(platform, engine, version))
|
bundleInstall(gemfile, lockFile, platform, engine, version))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
core.setOutput('ruby-prefix', rubyPrefix)
|
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`]
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fs.existsSync("gems.rb")) {
|
||||||
|
return ["gems.rb", "gems.locked"]
|
||||||
|
}
|
||||||
|
|
||||||
|
return [null, null]
|
||||||
|
}
|
||||||
|
|
||||||
function parseRubyEngineAndVersion(rubyVersion) {
|
function parseRubyEngineAndVersion(rubyVersion) {
|
||||||
if (rubyVersion === 'default') {
|
if (rubyVersion === 'default') {
|
||||||
if (fs.existsSync('.ruby-version')) {
|
if (fs.existsSync('.ruby-version')) {
|
||||||
@@ -90,7 +106,7 @@ function parseRubyEngineAndVersion(rubyVersion) {
|
|||||||
} else if (rubyVersion === '.tool-versions') { // Read from .tool-versions
|
} else if (rubyVersion === '.tool-versions') { // Read from .tool-versions
|
||||||
const toolVersions = fs.readFileSync('.tool-versions', 'utf8').trim()
|
const toolVersions = fs.readFileSync('.tool-versions', 'utf8').trim()
|
||||||
const rubyLine = toolVersions.split(/\r?\n/).filter(e => e.match(/^ruby\s/))[0]
|
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`)
|
console.log(`Using ${rubyVersion} as input from file .tool-versions`)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -100,9 +116,9 @@ function parseRubyEngineAndVersion(rubyVersion) {
|
|||||||
version = rubyVersion
|
version = rubyVersion
|
||||||
} else if (!rubyVersion.includes('-')) { // myruby -> myruby-stableVersion
|
} else if (!rubyVersion.includes('-')) { // myruby -> myruby-stableVersion
|
||||||
engine = rubyVersion
|
engine = rubyVersion
|
||||||
version = '' // Let the logic below find the version
|
version = '' // Let the logic in validateRubyEngineAndVersion() find the version
|
||||||
} else { // engine-X.Y.Z
|
} else { // engine-X.Y.Z
|
||||||
[engine, version] = rubyVersion.split('-', 2)
|
[engine, version] = common.partition(rubyVersion, '-')
|
||||||
}
|
}
|
||||||
|
|
||||||
return [engine, version]
|
return [engine, version]
|
||||||
@@ -116,7 +132,13 @@ function validateRubyEngineAndVersion(platform, engineVersions, engine, parsedVe
|
|||||||
let version = parsedVersion
|
let version = parsedVersion
|
||||||
if (!engineVersions.includes(parsedVersion)) {
|
if (!engineVersions.includes(parsedVersion)) {
|
||||||
const latestToFirstVersion = engineVersions.slice().reverse()
|
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) {
|
if (found) {
|
||||||
version = found
|
version = found
|
||||||
} else {
|
} else {
|
||||||
@@ -150,9 +172,9 @@ function envPreInstall() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function readBundledWithFromGemfileLock(path) {
|
function readBundledWithFromGemfileLock(lockFile) {
|
||||||
if (fs.existsSync(path)) {
|
if (lockFile !== null && fs.existsSync(lockFile)) {
|
||||||
const contents = fs.readFileSync(path, 'utf8')
|
const contents = fs.readFileSync(lockFile, 'utf8')
|
||||||
const lines = contents.split(/\r?\n/)
|
const lines = contents.split(/\r?\n/)
|
||||||
const bundledWithLine = lines.findIndex(line => /^BUNDLED WITH$/.test(line.trim()))
|
const bundledWithLine = lines.findIndex(line => /^BUNDLED WITH$/.test(line.trim()))
|
||||||
if (bundledWithLine !== -1) {
|
if (bundledWithLine !== -1) {
|
||||||
@@ -160,7 +182,7 @@ function readBundledWithFromGemfileLock(path) {
|
|||||||
if (nextLine && /^\d+/.test(nextLine.trim())) {
|
if (nextLine && /^\d+/.test(nextLine.trim())) {
|
||||||
const bundlerVersion = nextLine.trim()
|
const bundlerVersion = nextLine.trim()
|
||||||
const majorVersion = bundlerVersion.match(/^\d+/)[0]
|
const majorVersion = bundlerVersion.match(/^\d+/)[0]
|
||||||
console.log(`Using Bundler ${majorVersion} from ${path} BUNDLED WITH ${bundlerVersion}`)
|
console.log(`Using Bundler ${majorVersion} from ${lockFile} BUNDLED WITH ${bundlerVersion}`)
|
||||||
return majorVersion
|
return majorVersion
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -168,12 +190,12 @@ function readBundledWithFromGemfileLock(path) {
|
|||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
|
|
||||||
async function installBundler(bundlerVersionInput, platform, rubyPrefix, engine, rubyVersion) {
|
async function installBundler(bundlerVersionInput, lockFile, platform, rubyPrefix, engine, rubyVersion) {
|
||||||
var bundlerVersion = bundlerVersionInput
|
let bundlerVersion = bundlerVersionInput
|
||||||
|
|
||||||
if (bundlerVersion === 'default' || bundlerVersion === 'Gemfile.lock') {
|
if (bundlerVersion === 'default' || bundlerVersion === 'Gemfile.lock') {
|
||||||
const gemfilePath = `${process.env['BUNDLE_GEMFILE'] || 'Gemfile'}.lock`
|
bundlerVersion = readBundledWithFromGemfileLock(lockFile)
|
||||||
bundlerVersion = readBundledWithFromGemfileLock(gemfilePath)
|
|
||||||
if (!bundlerVersion) {
|
if (!bundlerVersion) {
|
||||||
bundlerVersion = 'latest'
|
bundlerVersion = 'latest'
|
||||||
}
|
}
|
||||||
@@ -189,53 +211,54 @@ async function installBundler(bundlerVersionInput, platform, rubyPrefix, engine,
|
|||||||
throw new Error(`Cannot parse bundler input: ${bundlerVersion}`)
|
throw new Error(`Cannot parse bundler input: ${bundlerVersion}`)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (rubyVersion.match(/^2\.[12]/)) {
|
if (engine === 'ruby' && rubyVersion.match(/^2\.[12]/)) {
|
||||||
console.log('Bundler 2 requires Ruby 2.3+, using Bundler 1 on Ruby <= 2.2')
|
console.log('Bundler 2 requires Ruby 2.3+, using Bundler 1 on Ruby <= 2.2')
|
||||||
bundlerVersion = '1'
|
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')
|
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'
|
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 ((engine === 'ruby' || engine === 'truffleruby') && common.isHeadVersion(rubyVersion) && bundlerVersion === '2') {
|
||||||
console.log(`Using Bundler 2 shipped with ${engine}-${rubyVersion}`)
|
console.log(`Using Bundler 2 shipped with ${engine}-${rubyVersion}`)
|
||||||
} else if (engine === 'truffleruby' && bundlerVersion === '1') {
|
} else if (engine === 'truffleruby' && !common.isHeadVersion(rubyVersion) && bundlerVersion === '1') {
|
||||||
console.log(`Using Bundler 1 shipped with ${engine}`)
|
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 {
|
} else {
|
||||||
const gem = path.join(rubyPrefix, 'bin', 'gem')
|
const gem = path.join(rubyPrefix, 'bin', 'gem')
|
||||||
await exec.exec(gem, ['install', 'bundler', '-v', `~> ${bundlerVersion}`, '--no-document'])
|
await exec.exec(gem, ['install', 'bundler', '-v', `~> ${bundlerVersion}`, '--no-document'])
|
||||||
}
|
}
|
||||||
|
|
||||||
|
core.exportVariable('BUNDLER_VERSION', bundlerVersion)
|
||||||
}
|
}
|
||||||
|
|
||||||
async function bundleInstall(platform, engine, version) {
|
async function bundleInstall(gemfile, lockFile, platform, engine, version) {
|
||||||
if (!fs.existsSync('Gemfile')) {
|
if (gemfile === null) {
|
||||||
console.log('No Gemfile, skipping "bundle install" and caching')
|
console.log('Could not determine gemfile path, skipping "bundle install" and caching')
|
||||||
return
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
// config
|
// config
|
||||||
const path = 'vendor/bundle'
|
const path = 'vendor/bundle'
|
||||||
const hasGemfileLock = fs.existsSync('Gemfile.lock');
|
|
||||||
if (hasGemfileLock) {
|
|
||||||
await exec.exec('bundle', ['config', '--local', 'deployment', 'true'])
|
|
||||||
}
|
|
||||||
await exec.exec('bundle', ['config', '--local', 'path', path])
|
await exec.exec('bundle', ['config', '--local', 'path', path])
|
||||||
|
|
||||||
|
if (fs.existsSync(lockFile)) {
|
||||||
|
await exec.exec('bundle', ['config', '--local', 'deployment', 'true'])
|
||||||
|
} 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'])
|
||||||
|
}
|
||||||
|
|
||||||
// cache key
|
// cache key
|
||||||
const paths = [path]
|
const paths = [path]
|
||||||
const baseKey = await computeBaseKey(platform, engine, version)
|
const baseKey = await computeBaseKey(platform, engine, version, lockFile)
|
||||||
let key = baseKey
|
const key = `${baseKey}-${await common.hashFile(lockFile)}`
|
||||||
let restoreKeys
|
// If only Gemfile.lock changes we can reuse part of the cache, and clean old gem versions below
|
||||||
if (hasGemfileLock) {
|
const restoreKeys = [`${baseKey}-`]
|
||||||
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 = []
|
|
||||||
}
|
|
||||||
console.log(`Cache key: ${key}`)
|
console.log(`Cache key: ${key}`)
|
||||||
|
|
||||||
// restore cache & install
|
// restore cache & install
|
||||||
@@ -254,14 +277,14 @@ async function bundleInstall(platform, engine, version) {
|
|||||||
console.log(`Found cache for key: ${cachedKey}`)
|
console.log(`Found cache for key: ${cachedKey}`)
|
||||||
}
|
}
|
||||||
|
|
||||||
let alreadyInstalled = false
|
// Always run 'bundle install' to list the gems
|
||||||
if (cachedKey === key) {
|
await exec.exec('bundle', ['install', '--jobs', '4'])
|
||||||
const exitCode = await exec.exec('bundle', ['check'], { ignoreReturnCode: true })
|
|
||||||
alreadyInstalled = (exitCode === 0)
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!alreadyInstalled) {
|
// @actions/cache only allows to save for non-existing keys
|
||||||
await exec.exec('bundle', ['install', '--jobs', '4'])
|
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
|
// Error handling from https://github.com/actions/cache/blob/master/src/save.ts
|
||||||
console.log('Saving cache')
|
console.log('Saving cache')
|
||||||
@@ -277,10 +300,13 @@ async function bundleInstall(platform, engine, version) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
async function computeBaseKey(platform, engine, version) {
|
async function computeBaseKey(platform, engine, version, lockFile) {
|
||||||
let baseKey = `setup-ruby-bundle-install-${platform}-${engine}-${version}`
|
let key = `setup-ruby-bundler-cache-v2-${platform}-${engine}-${version}`
|
||||||
|
|
||||||
if (engine !== 'jruby' && common.isHeadVersion(version)) {
|
if (engine !== 'jruby' && common.isHeadVersion(version)) {
|
||||||
let revision = '';
|
let revision = '';
|
||||||
await exec.exec('ruby', ['-e', 'print RUBY_REVISION'], {
|
await exec.exec('ruby', ['-e', 'print RUBY_REVISION'], {
|
||||||
@@ -291,9 +317,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() }
|
if (__filename.endsWith('index.js')) { run() }
|
||||||
|
|||||||
+1
-1
@@ -23,7 +23,7 @@
|
|||||||
"homepage": "https://github.com/ruby/setup-ruby",
|
"homepage": "https://github.com/ruby/setup-ruby",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@actions/cache": "^1.0.2",
|
"@actions/cache": "^1.0.2",
|
||||||
"@actions/core": "^1.2.4",
|
"@actions/core": "^1.2.6",
|
||||||
"@actions/exec": "^1.0.3",
|
"@actions/exec": "^1.0.3",
|
||||||
"@actions/io": "^1.0.2",
|
"@actions/io": "^1.0.2",
|
||||||
"@actions/tool-cache": "^1.3.4"
|
"@actions/tool-cache": "^1.3.4"
|
||||||
|
|||||||
@@ -7,7 +7,8 @@ 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.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.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.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",
|
||||||
"head", "debug",
|
"head", "debug",
|
||||||
],
|
],
|
||||||
"jruby": [
|
"jruby": [
|
||||||
@@ -17,16 +18,10 @@ export function getVersions(platform) {
|
|||||||
],
|
],
|
||||||
"truffleruby": [
|
"truffleruby": [
|
||||||
"19.3.0", "19.3.1",
|
"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"
|
"head"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
if (platform === 'ubuntu-18.04') {
|
|
||||||
versions['rubinius'] = [
|
|
||||||
"4.14"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
return versions
|
return versions
|
||||||
}
|
}
|
||||||
|
|||||||
+41
-19
@@ -6,7 +6,7 @@ const tc = require('@actions/tool-cache')
|
|||||||
const common = require('./common')
|
const common = require('./common')
|
||||||
const rubyBuilderVersions = require('./ruby-builder-versions')
|
const rubyBuilderVersions = require('./ruby-builder-versions')
|
||||||
|
|
||||||
const builderReleaseTag = 'enable-shared'
|
const builderReleaseTag = 'toolcache'
|
||||||
const releasesURL = 'https://github.com/ruby/ruby-builder/releases'
|
const releasesURL = 'https://github.com/ruby/ruby-builder/releases'
|
||||||
|
|
||||||
const windows = common.windows
|
const windows = common.windows
|
||||||
@@ -16,22 +16,35 @@ export function getAvailableVersions(platform, engine) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export async function install(platform, engine, version) {
|
export async function install(platform, engine, version) {
|
||||||
return await downloadAndExtract(platform, engine, version)
|
let rubyPrefix, inToolCache
|
||||||
}
|
if (common.shouldUseToolCache(engine, version)) {
|
||||||
|
inToolCache = tc.find('Ruby', version)
|
||||||
async function downloadAndExtract(platform, engine, version) {
|
if (inToolCache) {
|
||||||
const rubiesDir = windows ? `${common.drive}:` : path.join(os.homedir(), '.rubies')
|
rubyPrefix = inToolCache
|
||||||
|
} else {
|
||||||
const rubyPrefix = path.join(rubiesDir, `${engine}-${version}`)
|
rubyPrefix = common.getToolCacheRubyPrefix(platform, version)
|
||||||
|
}
|
||||||
// Set the PATH now, so the MSYS2 'tar' is in Path on Windows
|
} else if (windows) {
|
||||||
if (engine === 'rubinius') {
|
rubyPrefix = path.join(`${common.drive}:`, `${engine}-${version}`)
|
||||||
common.setupPath([path.join(rubyPrefix, 'bin'), path.join(rubyPrefix, 'gems', 'bin')])
|
|
||||||
} else {
|
} 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 downloadPath = await common.measure('Downloading Ruby', async () => {
|
||||||
const url = getDownloadURL(platform, engine, version)
|
const url = getDownloadURL(platform, engine, version)
|
||||||
@@ -42,20 +55,29 @@ async function downloadAndExtract(platform, engine, version) {
|
|||||||
await common.measure('Extracting Ruby', async () => {
|
await common.measure('Extracting Ruby', async () => {
|
||||||
if (windows) {
|
if (windows) {
|
||||||
// Windows 2016 doesn't have system tar, use MSYS2's, it needs unix style paths
|
// 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 {
|
} 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) {
|
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)) {
|
if (common.isHeadVersion(version)) {
|
||||||
return getLatestHeadBuildURL(platform, engine, version)
|
return getLatestHeadBuildURL(builderPlatform, engine, version)
|
||||||
} else {
|
} else {
|
||||||
return `${releasesURL}/download/${builderReleaseTag}/${engine}-${version}-${platform}.tar.gz`
|
return `${releasesURL}/download/${builderReleaseTag}/${engine}-${version}-${builderPlatform}.tar.gz`
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -3,14 +3,16 @@ versions = eval hash
|
|||||||
|
|
||||||
by_minor = versions[:ruby].group_by { |v| v[/^\d\.\d/] }
|
by_minor = versions[:ruby].group_by { |v| v[/^\d\.\d/] }
|
||||||
|
|
||||||
p by_minor['2.1']
|
(1..7).each do |minor|
|
||||||
p by_minor['2.2']
|
|
||||||
p by_minor['2.3']
|
|
||||||
|
|
||||||
(4..7).each do |minor|
|
|
||||||
p by_minor["2.#{minor}"].map { |v| "ruby-#{v}" }
|
p by_minor["2.#{minor}"].map { |v| "ruby-#{v}" }
|
||||||
end
|
end
|
||||||
|
|
||||||
|
puts
|
||||||
|
p (versions[:truffleruby] - %w[head]).map { |v| "truffleruby-#{v}" }
|
||||||
|
|
||||||
|
puts
|
||||||
p (versions[:jruby] - %w[head]).map { |v| "jruby-#{v}" }
|
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
|
||||||
|
|||||||
@@ -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.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.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.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",
|
"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",
|
"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"
|
"mswin": "https://github.com/MSP-Greg/ruby-loco/releases/download/ruby-master/ruby-mswin.7z"
|
||||||
|
|||||||
+31
-4
@@ -6,6 +6,7 @@ const path = require('path')
|
|||||||
const cp = require('child_process')
|
const cp = require('child_process')
|
||||||
const core = require('@actions/core')
|
const core = require('@actions/core')
|
||||||
const exec = require('@actions/exec')
|
const exec = require('@actions/exec')
|
||||||
|
const io = require('@actions/io')
|
||||||
const tc = require('@actions/tool-cache')
|
const tc = require('@actions/tool-cache')
|
||||||
const common = require('./common')
|
const common = require('./common')
|
||||||
const rubyInstallerVersions = require('./windows-versions').versions
|
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 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)
|
let toolchainPaths = (version === 'mswin') ? await setupMSWin() : await setupMingw(version)
|
||||||
|
|
||||||
common.setupPath([`${rubyPrefix}\\bin`, ...toolchainPaths])
|
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 () => {
|
const downloadPath = await common.measure('Downloading Ruby', async () => {
|
||||||
console.log(url)
|
console.log(url)
|
||||||
return await tc.downloadTool(url)
|
return await tc.downloadTool(url)
|
||||||
})
|
})
|
||||||
|
|
||||||
await common.measure('Extracting Ruby', async () =>
|
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) {
|
async function setupMingw(version) {
|
||||||
@@ -109,7 +136,7 @@ export function addVCVARSEnv() {
|
|||||||
let newSet = cp.execSync(cmd).toString().trim().split(/\r?\n/)
|
let newSet = cp.execSync(cmd).toString().trim().split(/\r?\n/)
|
||||||
newSet = newSet.filter(line => line.match(/\S=\S/))
|
newSet = newSet.filter(line => line.match(/\S=\S/))
|
||||||
newSet.forEach(s => {
|
newSet.forEach(s => {
|
||||||
let [k,v] = s.split('=', 2)
|
let [k,v] = common.partition(s, '=')
|
||||||
newEnv.set(k,v)
|
newEnv.set(k,v)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|||||||
@@ -17,15 +17,10 @@
|
|||||||
semver "^6.1.0"
|
semver "^6.1.0"
|
||||||
uuid "^3.3.3"
|
uuid "^3.3.3"
|
||||||
|
|
||||||
"@actions/core@^1.2.0", "@actions/core@^1.2.4":
|
"@actions/core@^1.2.0", "@actions/core@^1.2.3", "@actions/core@^1.2.4", "@actions/core@^1.2.6":
|
||||||
version "1.2.4"
|
version "1.2.6"
|
||||||
resolved "https://registry.yarnpkg.com/@actions/core/-/core-1.2.4.tgz#96179dbf9f8d951dd74b40a0dbd5c22555d186ab"
|
resolved "https://registry.yarnpkg.com/@actions/core/-/core-1.2.6.tgz#a78d49f41a4def18e88ce47c2cac615d5694bf09"
|
||||||
integrity sha512-YJCEq8BE3CdN8+7HPZ/4DxJjk/OkZV2FFIf+DlZTC/4iBlzYCD5yjRR6eiOS5llO11zbRltIRuKAjMKaWTE6cg==
|
integrity sha512-ZQYitnqiyBc3D+k7LsgSBmMDVkOVidaagDG7j3fOym77jNunWRuYx7VSHa9GNfFZh+zh61xsCjRj4JxMZlDqTA==
|
||||||
|
|
||||||
"@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/exec@^1.0.0", "@actions/exec@^1.0.1", "@actions/exec@^1.0.3":
|
"@actions/exec@^1.0.0", "@actions/exec@^1.0.1", "@actions/exec@^1.0.3":
|
||||||
version "1.0.4"
|
version "1.0.4"
|
||||||
@@ -331,9 +326,9 @@ minimatch@^3.0.4:
|
|||||||
brace-expansion "^1.1.7"
|
brace-expansion "^1.1.7"
|
||||||
|
|
||||||
node-fetch@^2.6.0:
|
node-fetch@^2.6.0:
|
||||||
version "2.6.0"
|
version "2.6.1"
|
||||||
resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.0.tgz#e633456386d4aa55863f676a7ab0daa8fdecb0fd"
|
resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052"
|
||||||
integrity sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==
|
integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==
|
||||||
|
|
||||||
process@^0.11.10:
|
process@^0.11.10:
|
||||||
version "0.11.10"
|
version "0.11.10"
|
||||||
|
|||||||
Reference in New Issue
Block a user