mirror of
https://github.com/ruby/setup-ruby.git
synced 2026-09-13 14:34:21 +02:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1c896c8ea1 | ||
|
|
ba761ba8ff | ||
|
|
bb3a0c6e0b | ||
|
|
8e77d9e0fa | ||
|
|
339f055c86 | ||
|
|
0592d01dc3 | ||
|
|
d7b76f909a | ||
|
|
ebed7f7b66 | ||
|
|
933dca770c | ||
|
|
693cf1794d | ||
|
|
efda314f4a | ||
|
|
c49deecea1 | ||
|
|
5da31b45d7 | ||
|
|
4bb29a57df | ||
|
|
9be533b7d4 | ||
|
|
35f0af38a7 | ||
|
|
b9ca796ede | ||
|
|
11082225e4 | ||
|
|
4de6eb91a8 | ||
|
|
60f215c278 | ||
|
|
a195098f6b | ||
|
|
f117ca04d8 |
@@ -19,7 +19,6 @@ jobs:
|
||||
# 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 ]
|
||||
include:
|
||||
- { os: ubuntu-18.04, ruby: rubinius }
|
||||
- { os: windows-2016, ruby: mingw }
|
||||
- { os: windows-2019, ruby: mingw }
|
||||
- { os: windows-2019, ruby: mswin }
|
||||
@@ -60,6 +59,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 +74,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
|
||||
|
||||
|
||||
@@ -14,20 +14,23 @@ 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 |
|
||||
| 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 |
|
||||
| TruffleRuby | 19.3.0 - 20.2.0, head |
|
||||
| Rubinius | 4.14 |
|
||||
|
||||
`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
|
||||
|
||||
@@ -39,8 +42,6 @@ The action works for all [GitHub-hosted runners](https://help.github.com/en/acti
|
||||
| macOS | `macos-latest` (= `macos-10.15`) | |
|
||||
| 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,6 +66,7 @@ jobs:
|
||||
- uses: ruby/setup-ruby@v1
|
||||
with:
|
||||
ruby-version: 2.6 # Not needed with a .ruby-version file
|
||||
bundler-cache: true # runs 'bundle install' and caches installed gems automatically
|
||||
- run: bundle install
|
||||
- run: bundle exec rake
|
||||
```
|
||||
@@ -90,6 +92,7 @@ jobs:
|
||||
- uses: ruby/setup-ruby@v1
|
||||
with:
|
||||
ruby-version: ${{ matrix.ruby }}
|
||||
bundler-cache: true # runs 'bundle install' and caches installed gems automatically
|
||||
- run: bundle install
|
||||
- run: bundle exec rake
|
||||
```
|
||||
@@ -130,12 +133,14 @@ 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` 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.
|
||||
Therefore, the Bundler `path` should not be changed in your workflow for the cache to work (no `bundle config path`).
|
||||
|
||||
### Caching `bundle install` manually
|
||||
|
||||
@@ -198,7 +203,10 @@ if the [virtual environment](https://github.com/actions/virtual-environments) is
|
||||
* Make sure to use the same 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.
|
||||
|
||||
|
||||
@@ -59,6 +59,28 @@ function findUbuntuVersion() {
|
||||
}
|
||||
}
|
||||
|
||||
export function shouldExtractInToolCache(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')
|
||||
}
|
||||
}
|
||||
|
||||
export function getToolCacheRubyPrefix(platform, version) {
|
||||
const toolCache = getPlatformToolCache(platform)
|
||||
return path.join(toolCache, 'Ruby', version, 'x64')
|
||||
}
|
||||
|
||||
// convert windows path like C:\Users\runneradmin to /c/Users/runneradmin
|
||||
export function win2nix(path) {
|
||||
if (/^[A-Z]:/i.test(path)) {
|
||||
|
||||
+71
-34
@@ -27682,6 +27682,7 @@ const path = __webpack_require__(622)
|
||||
const cp = __webpack_require__(129)
|
||||
const core = __webpack_require__(186)
|
||||
const exec = __webpack_require__(514)
|
||||
const io = __webpack_require__(436)
|
||||
const tc = __webpack_require__(188)
|
||||
const common = __webpack_require__(390)
|
||||
const rubyInstallerVersions = __webpack_require__(223).versions
|
||||
@@ -27711,7 +27712,13 @@ async function install(platform, engine, version) {
|
||||
}
|
||||
const base = url.slice(url.lastIndexOf('/') + 1, url.length - '.7z'.length)
|
||||
|
||||
const rubyPrefix = `${drive}:\\${base}`
|
||||
let rubyPrefix
|
||||
if (common.shouldExtractInToolCache(engine, version)) {
|
||||
rubyPrefix = common.getToolCacheRubyPrefix(platform, version)
|
||||
} else {
|
||||
rubyPrefix = `${drive}:\\${base}`
|
||||
}
|
||||
const parentDir = path.dirname(rubyPrefix)
|
||||
|
||||
let toolchainPaths = (version === 'mswin') ? await setupMSWin() : await setupMingw(version)
|
||||
|
||||
@@ -27723,7 +27730,11 @@ async function install(platform, engine, version) {
|
||||
})
|
||||
|
||||
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 }))
|
||||
|
||||
if (base !== path.basename(rubyPrefix)) {
|
||||
await io.mv(path.join(parentDir, base), rubyPrefix)
|
||||
}
|
||||
|
||||
return rubyPrefix
|
||||
}
|
||||
@@ -28141,6 +28152,7 @@ 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"
|
||||
@@ -32086,6 +32098,8 @@ __webpack_require__.r(__webpack_exports__);
|
||||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isHeadVersion", function() { return isHeadVersion; });
|
||||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "hashFile", function() { return hashFile; });
|
||||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getVirtualEnvironmentName", function() { return getVirtualEnvironmentName; });
|
||||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "shouldExtractInToolCache", function() { return shouldExtractInToolCache; });
|
||||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getToolCacheRubyPrefix", function() { return getToolCacheRubyPrefix; });
|
||||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "win2nix", function() { return win2nix; });
|
||||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setupPath", function() { return setupPath; });
|
||||
const os = __webpack_require__(87)
|
||||
@@ -32149,6 +32163,28 @@ function findUbuntuVersion() {
|
||||
}
|
||||
}
|
||||
|
||||
function shouldExtractInToolCache(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')
|
||||
}
|
||||
}
|
||||
|
||||
function getToolCacheRubyPrefix(platform, version) {
|
||||
const toolCache = getPlatformToolCache(platform)
|
||||
return path.join(toolCache, 'Ruby', version, 'x64')
|
||||
}
|
||||
|
||||
// convert windows path like C:\Users\runneradmin to /c/Users/runneradmin
|
||||
function win2nix(path) {
|
||||
if (/^[A-Z]:/i.test(path)) {
|
||||
@@ -44483,7 +44519,8 @@ 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",
|
||||
"head", "debug",
|
||||
],
|
||||
"jruby": [
|
||||
@@ -44498,12 +44535,6 @@ function getVersions(platform) {
|
||||
]
|
||||
}
|
||||
|
||||
if (platform === 'ubuntu-18.04') {
|
||||
versions['rubinius'] = [
|
||||
"4.14"
|
||||
]
|
||||
}
|
||||
|
||||
return versions
|
||||
}
|
||||
|
||||
@@ -51160,7 +51191,7 @@ 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 = __webpack_require__(216)
|
||||
} else {
|
||||
installer = __webpack_require__(974)
|
||||
@@ -51247,7 +51278,7 @@ 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)
|
||||
}
|
||||
@@ -51316,7 +51347,7 @@ function readBundledWithFromGemfileLock(lockFile) {
|
||||
}
|
||||
|
||||
async function installBundler(bundlerVersionInput, lockFile, platform, rubyPrefix, engine, rubyVersion) {
|
||||
var bundlerVersion = bundlerVersionInput
|
||||
let bundlerVersion = bundlerVersionInput
|
||||
|
||||
if (bundlerVersion === 'default' || bundlerVersion === 'Gemfile.lock') {
|
||||
bundlerVersion = readBundledWithFromGemfileLock(lockFile)
|
||||
@@ -51336,20 +51367,21 @@ async function installBundler(bundlerVersionInput, lockFile, platform, rubyPrefi
|
||||
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')
|
||||
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 ((engine === 'ruby' || engine === 'truffleruby') && common.isHeadVersion(rubyVersion) && bundlerVersion === '2') {
|
||||
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}`)
|
||||
} 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'])
|
||||
@@ -51372,12 +51404,12 @@ async function bundleInstall(gemfile, lockFile, platform, engine, version) {
|
||||
|
||||
// cache key
|
||||
const paths = [path]
|
||||
const baseKey = await computeBaseKey(platform, engine, version)
|
||||
const baseKey = await computeBaseKey(platform, engine, version, gemfile)
|
||||
let key = baseKey
|
||||
let restoreKeys
|
||||
if (lockFile !== null) {
|
||||
key += `-${lockFile}-${await common.hashFile(lockFile)}`
|
||||
// If only Gemfile.lock we can reuse some of the cache (but it will keep old gem versions in the cache)
|
||||
// If only Gemfile.lock changes we can reuse part of the cache (but it will keep old gem versions in the cache)
|
||||
restoreKeys = [`${baseKey}-${lockFile}-`]
|
||||
} else {
|
||||
// Only exact key, to never mix native gems of different platforms or Ruby versions
|
||||
@@ -51428,8 +51460,8 @@ async function bundleInstall(gemfile, lockFile, 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, gemfile) {
|
||||
let baseKey = `setup-ruby-toolcache-bundle-install-${platform}-${engine}-${version}-${gemfile}`
|
||||
if (engine !== 'jruby' && common.isHeadVersion(version)) {
|
||||
let revision = '';
|
||||
await exec.exec('ruby', ['-e', 'print RUBY_REVISION'], {
|
||||
@@ -52859,13 +52891,14 @@ __webpack_require__.r(__webpack_exports__);
|
||||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "install", function() { return install; });
|
||||
const os = __webpack_require__(87)
|
||||
const path = __webpack_require__(622)
|
||||
const core = __webpack_require__(186)
|
||||
const exec = __webpack_require__(514)
|
||||
const io = __webpack_require__(436)
|
||||
const tc = __webpack_require__(188)
|
||||
const common = __webpack_require__(390)
|
||||
const rubyBuilderVersions = __webpack_require__(694)
|
||||
|
||||
const builderReleaseTag = 'enable-shared'
|
||||
const builderReleaseTag = 'toolcache'
|
||||
const releasesURL = 'https://github.com/ruby/ruby-builder/releases'
|
||||
|
||||
const windows = common.windows
|
||||
@@ -52879,18 +52912,22 @@ async function install(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
|
||||
if (common.shouldExtractInToolCache(engine, version)) {
|
||||
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)
|
||||
const parentDir = path.dirname(rubyPrefix)
|
||||
|
||||
// Set the PATH now, so the MSYS2 'tar' is in Path on Windows
|
||||
common.setupPath([path.join(rubyPrefix, 'bin')])
|
||||
|
||||
await io.rmRF(rubyPrefix)
|
||||
await io.mkdirP(parentDir)
|
||||
|
||||
const downloadPath = await common.measure('Downloading Ruby', async () => {
|
||||
const url = getDownloadURL(platform, engine, version)
|
||||
@@ -52901,9 +52938,9 @@ 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 ])
|
||||
}
|
||||
})
|
||||
|
||||
|
||||
@@ -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')
|
||||
@@ -126,7 +126,7 @@ 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)
|
||||
}
|
||||
@@ -195,7 +195,7 @@ function readBundledWithFromGemfileLock(lockFile) {
|
||||
}
|
||||
|
||||
async function installBundler(bundlerVersionInput, lockFile, platform, rubyPrefix, engine, rubyVersion) {
|
||||
var bundlerVersion = bundlerVersionInput
|
||||
let bundlerVersion = bundlerVersionInput
|
||||
|
||||
if (bundlerVersion === 'default' || bundlerVersion === 'Gemfile.lock') {
|
||||
bundlerVersion = readBundledWithFromGemfileLock(lockFile)
|
||||
@@ -215,20 +215,21 @@ async function installBundler(bundlerVersionInput, lockFile, platform, rubyPrefi
|
||||
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')
|
||||
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 ((engine === 'ruby' || engine === 'truffleruby') && common.isHeadVersion(rubyVersion) && bundlerVersion === '2') {
|
||||
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}`)
|
||||
} 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'])
|
||||
@@ -251,12 +252,12 @@ async function bundleInstall(gemfile, lockFile, platform, engine, version) {
|
||||
|
||||
// cache key
|
||||
const paths = [path]
|
||||
const baseKey = await computeBaseKey(platform, engine, version)
|
||||
const baseKey = await computeBaseKey(platform, engine, version, gemfile)
|
||||
let key = baseKey
|
||||
let restoreKeys
|
||||
if (lockFile !== null) {
|
||||
key += `-${lockFile}-${await common.hashFile(lockFile)}`
|
||||
// If only Gemfile.lock we can reuse some of the cache (but it will keep old gem versions in the cache)
|
||||
// If only Gemfile.lock changes we can reuse part of the cache (but it will keep old gem versions in the cache)
|
||||
restoreKeys = [`${baseKey}-${lockFile}-`]
|
||||
} else {
|
||||
// Only exact key, to never mix native gems of different platforms or Ruby versions
|
||||
@@ -307,8 +308,8 @@ async function bundleInstall(gemfile, lockFile, 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, gemfile) {
|
||||
let baseKey = `setup-ruby-toolcache-bundle-install-${platform}-${engine}-${version}-${gemfile}`
|
||||
if (engine !== 'jruby' && common.isHeadVersion(version)) {
|
||||
let revision = '';
|
||||
await exec.exec('ruby', ['-e', 'print RUBY_REVISION'], {
|
||||
|
||||
@@ -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.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",
|
||||
"head", "debug",
|
||||
],
|
||||
"jruby": [
|
||||
@@ -22,11 +23,5 @@ export function getVersions(platform) {
|
||||
]
|
||||
}
|
||||
|
||||
if (platform === 'ubuntu-18.04') {
|
||||
versions['rubinius'] = [
|
||||
"4.14"
|
||||
]
|
||||
}
|
||||
|
||||
return versions
|
||||
}
|
||||
|
||||
+17
-12
@@ -1,12 +1,13 @@
|
||||
const os = require('os')
|
||||
const path = require('path')
|
||||
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 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
|
||||
@@ -20,18 +21,22 @@ export async function install(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
|
||||
if (common.shouldExtractInToolCache(engine, version)) {
|
||||
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)
|
||||
const parentDir = path.dirname(rubyPrefix)
|
||||
|
||||
// Set the PATH now, so the MSYS2 'tar' is in Path on Windows
|
||||
common.setupPath([path.join(rubyPrefix, 'bin')])
|
||||
|
||||
await io.rmRF(rubyPrefix)
|
||||
await io.mkdirP(parentDir)
|
||||
|
||||
const downloadPath = await common.measure('Downloading Ruby', async () => {
|
||||
const url = getDownloadURL(platform, engine, version)
|
||||
@@ -42,9 +47,9 @@ 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 ])
|
||||
}
|
||||
})
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
+13
-2
@@ -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,7 +36,13 @@ export async function install(platform, engine, version) {
|
||||
}
|
||||
const base = url.slice(url.lastIndexOf('/') + 1, url.length - '.7z'.length)
|
||||
|
||||
const rubyPrefix = `${drive}:\\${base}`
|
||||
let rubyPrefix
|
||||
if (common.shouldExtractInToolCache(engine, version)) {
|
||||
rubyPrefix = common.getToolCacheRubyPrefix(platform, version)
|
||||
} else {
|
||||
rubyPrefix = `${drive}:\\${base}`
|
||||
}
|
||||
const parentDir = path.dirname(rubyPrefix)
|
||||
|
||||
let toolchainPaths = (version === 'mswin') ? await setupMSWin() : await setupMingw(version)
|
||||
|
||||
@@ -47,7 +54,11 @@ export async function install(platform, engine, version) {
|
||||
})
|
||||
|
||||
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 }))
|
||||
|
||||
if (base !== path.basename(rubyPrefix)) {
|
||||
await io.mv(path.join(parentDir, base), rubyPrefix)
|
||||
}
|
||||
|
||||
return rubyPrefix
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user