mirror of
https://github.com/ruby/setup-ruby.git
synced 2026-09-13 22:44:20 +02:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
dc58db7220 | ||
|
|
0e7d36a67f | ||
|
|
e5b6990d51 | ||
|
|
c3f248a282 | ||
|
|
a9926985f9 | ||
|
|
07b100f2a1 | ||
|
|
515629a013 | ||
|
|
0981b5ec00 | ||
|
|
c101335f33 | ||
|
|
1482e9180a | ||
|
|
3e7640a17e | ||
|
|
f6f61ea575 | ||
|
|
084885eaca | ||
|
|
efd6675fc9 | ||
|
|
e5a267414f | ||
|
|
cadade3366 | ||
|
|
d3562e70d9 | ||
|
|
23b2b5e5f1 | ||
|
|
42fc2d3bce | ||
|
|
30f5e2d4cd | ||
|
|
fd1d77b75c | ||
|
|
2a0be7a409 | ||
|
|
bacba738b2 | ||
|
|
21351ecc0a | ||
|
|
4d7e038419 |
@@ -15,19 +15,19 @@ jobs:
|
|||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
os: [ ubuntu-16.04, ubuntu-18.04, ubuntu-20.04, macos-10.15, macos-11.0, 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
|
# Use various version syntax here for testing
|
||||||
ruby: [ 2.1, 2.2, 2.3, 2.4, 2.5, 2.6.6, 2.7, ruby-3.0.0-preview1, 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:
|
include:
|
||||||
- { 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: ruby-3.0.0-preview1 }
|
- { 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: ruby-3.0.0-preview1 }
|
- { 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 }
|
||||||
@@ -102,6 +102,34 @@ jobs:
|
|||||||
if: startsWith(matrix.os, 'windows') && startsWith(matrix.ruby, 'jruby')
|
if: startsWith(matrix.os, 'windows') && startsWith(matrix.ruby, 'jruby')
|
||||||
run: gem install sassc -N
|
run: gem install sassc -N
|
||||||
|
|
||||||
|
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 2.1.4
|
||||||
|
|
||||||
|
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:
|
lint:
|
||||||
runs-on: ubuntu-20.04
|
runs-on: ubuntu-20.04
|
||||||
steps:
|
steps:
|
||||||
|
|||||||
@@ -14,9 +14,9 @@ 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.2, 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.3.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`).
|
`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.
|
||||||
@@ -82,9 +82,9 @@ jobs:
|
|||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
os: [ubuntu, macos]
|
os: [ubuntu-latest, macos-latest]
|
||||||
ruby: [2.5, 2.6, 2.7, head, debug, jruby, jruby-head, truffleruby, truffleruby-head]
|
ruby: [2.5, 2.6, 2.7, head, jruby, jruby-head, truffleruby, truffleruby-head]
|
||||||
runs-on: ${{ matrix.os }}-latest
|
runs-on: ${{ matrix.os }}
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v2
|
||||||
- uses: ruby/setup-ruby@v1
|
- uses: ruby/setup-ruby@v1
|
||||||
@@ -116,10 +116,10 @@ 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` or `gems.locked`) 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.
|
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).
|
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
|
### Caching `bundle install` automatically
|
||||||
|
|
||||||
@@ -136,6 +136,23 @@ This caching speeds up installing gems significantly and avoids too many request
|
|||||||
It needs a `Gemfile` (or `$BUNDLE_GEMFILE` or `gems.rb`) under the [`working-directory`](#working-directory).
|
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.
|
If there is a `Gemfile.lock` (or `$BUNDLE_GEMFILE.lock` or `gems.locked`), `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 (no `bundle config path`).
|
Therefore, the Bundler `path` should not be changed in your workflow for the cache to work (no `bundle config path`).
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -11,7 +11,7 @@ inputs:
|
|||||||
default: 'default'
|
default: 'default'
|
||||||
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', '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.
|
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.
|
Defaults to 'Gemfile.lock' if the file exists and 'latest' otherwise.
|
||||||
required: false
|
required: false
|
||||||
|
|||||||
@@ -40,6 +40,25 @@ export function isStableVersion(rubyVersion) {
|
|||||||
return /^\d+(\.\d+)*$/.test(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) {
|
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')
|
||||||
@@ -77,7 +96,7 @@ export function getVirtualEnvironmentName() {
|
|||||||
throw new Error(`Unknown ImageOS ${imageOS}`)
|
throw new Error(`Unknown ImageOS ${imageOS}`)
|
||||||
}
|
}
|
||||||
|
|
||||||
export function shouldExtractInToolCache(engine, version) {
|
export function shouldUseToolCache(engine, version) {
|
||||||
return engine === 'ruby' && !isHeadVersion(version)
|
return engine === 'ruby' && !isHeadVersion(version)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -99,6 +118,11 @@ export function getToolCacheRubyPrefix(platform, version) {
|
|||||||
return path.join(toolCache, 'Ruby', version, 'x64')
|
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
|
// 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)) {
|
||||||
|
|||||||
+1098
-383
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,3 @@
|
|||||||
|
source "https://rubygems.org"
|
||||||
|
|
||||||
|
gem "rails", "~> 5.2.0"
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
source "https://rubygems.org"
|
||||||
|
|
||||||
|
gem "rails", "~> 6.0.0"
|
||||||
@@ -63,12 +63,12 @@ export async function setupRuby(options = {}) {
|
|||||||
if (inputs['bundler'] !== 'none') {
|
if (inputs['bundler'] !== 'none') {
|
||||||
const [gemfile, lockFile] = detectGemfiles()
|
const [gemfile, lockFile] = detectGemfiles()
|
||||||
|
|
||||||
await common.measure('Installing Bundler', async () =>
|
const bundlerVersion = await common.measure('Installing Bundler', async () =>
|
||||||
installBundler(inputs['bundler'], lockFile, 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(gemfile, lockFile, platform, engine, version))
|
bundleInstall(gemfile, lockFile, platform, engine, version, bundlerVersion))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -132,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.isStableVersion(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 {
|
||||||
@@ -175,9 +181,8 @@ function readBundledWithFromGemfileLock(lockFile) {
|
|||||||
const nextLine = lines[bundledWithLine+1]
|
const nextLine = lines[bundledWithLine+1]
|
||||||
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]
|
console.log(`Using Bundler ${bundlerVersion} from ${lockFile} BUNDLED WITH ${bundlerVersion}`)
|
||||||
console.log(`Using Bundler ${majorVersion} from ${lockFile} BUNDLED WITH ${bundlerVersion}`)
|
return bundlerVersion
|
||||||
return majorVersion
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -205,7 +210,7 @@ async function installBundler(bundlerVersionInput, lockFile, platform, rubyPrefi
|
|||||||
throw new Error(`Cannot parse bundler input: ${bundlerVersion}`)
|
throw new Error(`Cannot parse bundler input: ${bundlerVersion}`)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (engine === 'ruby' && 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')
|
console.log('Bundler 2 requires Ruby 2.3+, using Bundler 1 on Ruby <= 2.2')
|
||||||
bundlerVersion = '1'
|
bundlerVersion = '1'
|
||||||
} else if (engine === 'ruby' && rubyVersion.startsWith('2.3')) {
|
} else if (engine === 'ruby' && rubyVersion.startsWith('2.3')) {
|
||||||
@@ -216,40 +221,52 @@ async function installBundler(bundlerVersionInput, lockFile, platform, rubyPrefi
|
|||||||
bundlerVersion = '1'
|
bundlerVersion = '1'
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((engine === 'ruby' || engine === 'truffleruby') && 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}`)
|
console.log(`Using Bundler 2 shipped with ${engine}-${rubyVersion}`)
|
||||||
} else if (engine === 'truffleruby' && !common.isHeadVersion(rubyVersion) && bundlerVersion === '1') {
|
} else if (engine === 'truffleruby' && !common.isHeadVersion(rubyVersion) && bundlerVersion.startsWith('1')) {
|
||||||
console.log(`Using Bundler 1 shipped with ${engine}`)
|
console.log(`Using Bundler 1 shipped with ${engine}`)
|
||||||
} 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'])
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return bundlerVersion
|
||||||
}
|
}
|
||||||
|
|
||||||
async function bundleInstall(gemfile, lockFile, platform, engine, version) {
|
async function bundleInstall(gemfile, lockFile, platform, engine, rubyVersion, bundlerVersion) {
|
||||||
if (gemfile === null) {
|
if (gemfile === null) {
|
||||||
console.log('Could not determine gemfile path, skipping "bundle install" and caching')
|
console.log('Could not determine gemfile path, skipping "bundle install" and caching')
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
// config
|
let envOptions = {}
|
||||||
const path = 'vendor/bundle'
|
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 } }
|
||||||
|
}
|
||||||
|
|
||||||
await exec.exec('bundle', ['config', '--local', 'path', path])
|
// config
|
||||||
|
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)) {
|
if (fs.existsSync(lockFile)) {
|
||||||
await exec.exec('bundle', ['config', '--local', 'deployment', 'true'])
|
await exec.exec('bundle', ['config', '--local', 'deployment', 'true'], envOptions)
|
||||||
} else {
|
} else {
|
||||||
// Generate the lockfile so we can use it to compute the cache key.
|
// 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.
|
// This will also automatically pick up the latest gem versions compatible with the Gemfile.
|
||||||
await exec.exec('bundle', ['lock'])
|
await exec.exec('bundle', ['lock'], envOptions)
|
||||||
}
|
}
|
||||||
|
|
||||||
// cache key
|
// cache key
|
||||||
const paths = [path]
|
const paths = [cachePath]
|
||||||
const baseKey = await computeBaseKey(platform, engine, version, lockFile)
|
const baseKey = await computeBaseKey(platform, engine, rubyVersion, lockFile)
|
||||||
const key = `${baseKey}-${await common.hashFile(lockFile)}`
|
const key = `${baseKey}-${await common.hashFile(lockFile)}`
|
||||||
// If only Gemfile.lock changes we can reuse part 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, and clean old gem versions below
|
||||||
const restoreKeys = [`${baseKey}-`]
|
const restoreKeys = [`${baseKey}-`]
|
||||||
console.log(`Cache key: ${key}`)
|
console.log(`Cache key: ${key}`)
|
||||||
|
|
||||||
@@ -274,6 +291,10 @@ async function bundleInstall(gemfile, lockFile, platform, engine, version) {
|
|||||||
|
|
||||||
// @actions/cache only allows to save for non-existing keys
|
// @actions/cache only allows to save for non-existing keys
|
||||||
if (cachedKey !== key) {
|
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')
|
||||||
try {
|
try {
|
||||||
@@ -293,7 +314,7 @@ async function bundleInstall(gemfile, lockFile, platform, engine, version) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async function computeBaseKey(platform, engine, version, lockFile) {
|
async function computeBaseKey(platform, engine, version, lockFile) {
|
||||||
let key = `setup-ruby-bundler-cache-v2-${platform}-${engine}-${version}`
|
let key = `setup-ruby-bundler-cache-v3-${platform}-${engine}-${version}`
|
||||||
|
|
||||||
if (engine !== 'jruby' && common.isHeadVersion(version)) {
|
if (engine !== 'jruby' && common.isHeadVersion(version)) {
|
||||||
let revision = '';
|
let revision = '';
|
||||||
|
|||||||
+1
-1
@@ -22,7 +22,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.5",
|
||||||
"@actions/core": "^1.2.6",
|
"@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",
|
||||||
|
|||||||
@@ -8,12 +8,12 @@ export function getVersions(platform) {
|
|||||||
"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.2",
|
"2.7.0", "2.7.1", "2.7.2",
|
||||||
"3.0.0-preview1",
|
"3.0.0-preview1", "3.0.0-preview2", "3.0.0-rc1",
|
||||||
"head", "debug",
|
"head", "debug",
|
||||||
],
|
],
|
||||||
"jruby": [
|
"jruby": [
|
||||||
"9.1.17.0",
|
"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"
|
"head"
|
||||||
],
|
],
|
||||||
"truffleruby": [
|
"truffleruby": [
|
||||||
|
|||||||
+23
-13
@@ -1,6 +1,5 @@
|
|||||||
const os = require('os')
|
const os = require('os')
|
||||||
const path = require('path')
|
const path = require('path')
|
||||||
const core = require('@actions/core')
|
|
||||||
const exec = require('@actions/exec')
|
const exec = require('@actions/exec')
|
||||||
const io = require('@actions/io')
|
const io = require('@actions/io')
|
||||||
const tc = require('@actions/tool-cache')
|
const tc = require('@actions/tool-cache')
|
||||||
@@ -17,24 +16,33 @@ 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) {
|
||||||
let rubyPrefix
|
rubyPrefix = inToolCache
|
||||||
if (common.shouldExtractInToolCache(engine, version)) {
|
} else {
|
||||||
rubyPrefix = common.getToolCacheRubyPrefix(platform, version)
|
rubyPrefix = common.getToolCacheRubyPrefix(platform, version)
|
||||||
|
}
|
||||||
} else if (windows) {
|
} else if (windows) {
|
||||||
rubyPrefix = path.join(`${common.drive}:`, `${engine}-${version}`)
|
rubyPrefix = path.join(`${common.drive}:`, `${engine}-${version}`)
|
||||||
} else {
|
} else {
|
||||||
rubyPrefix = path.join(os.homedir(), '.rubies', `${engine}-${version}`)
|
rubyPrefix = path.join(os.homedir(), '.rubies', `${engine}-${version}`)
|
||||||
}
|
}
|
||||||
|
|
||||||
const parentDir = path.dirname(rubyPrefix)
|
|
||||||
|
|
||||||
// Set the PATH now, so the MSYS2 'tar' is in Path on Windows
|
// Set the PATH now, so the MSYS2 'tar' is in Path on Windows
|
||||||
common.setupPath([path.join(rubyPrefix, 'bin')])
|
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.rmRF(rubyPrefix)
|
||||||
await io.mkdirP(parentDir)
|
await io.mkdirP(parentDir)
|
||||||
|
|
||||||
@@ -47,13 +55,15 @@ 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(parentDir), '-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', parentDir, '-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) {
|
||||||
|
|||||||
+21
-5
@@ -36,18 +36,32 @@ 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)
|
||||||
|
|
||||||
let rubyPrefix
|
let rubyPrefix, inToolCache
|
||||||
if (common.shouldExtractInToolCache(engine, version)) {
|
if (common.shouldUseToolCache(engine, version)) {
|
||||||
rubyPrefix = common.getToolCacheRubyPrefix(platform, version)
|
inToolCache = tc.find('Ruby', version)
|
||||||
|
if (inToolCache) {
|
||||||
|
rubyPrefix = inToolCache
|
||||||
|
} else {
|
||||||
|
rubyPrefix = common.getToolCacheRubyPrefix(platform, version)
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
rubyPrefix = `${drive}:\\${base}`
|
rubyPrefix = `${drive}:\\${base}`
|
||||||
}
|
}
|
||||||
const parentDir = path.dirname(rubyPrefix)
|
|
||||||
|
|
||||||
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)
|
||||||
@@ -60,7 +74,9 @@ export async function install(platform, engine, version) {
|
|||||||
await io.mv(path.join(parentDir, base), rubyPrefix)
|
await io.mv(path.join(parentDir, base), rubyPrefix)
|
||||||
}
|
}
|
||||||
|
|
||||||
return rubyPrefix
|
if (common.shouldUseToolCache(engine, version)) {
|
||||||
|
common.createToolCacheCompleteFile(rubyPrefix)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async function setupMingw(version) {
|
async function setupMingw(version) {
|
||||||
|
|||||||
@@ -2,22 +2,22 @@
|
|||||||
# yarn lockfile v1
|
# yarn lockfile v1
|
||||||
|
|
||||||
|
|
||||||
"@actions/cache@^1.0.2":
|
"@actions/cache@^1.0.5":
|
||||||
version "1.0.2"
|
version "1.0.5"
|
||||||
resolved "https://registry.yarnpkg.com/@actions/cache/-/cache-1.0.2.tgz#a223dcc752c7f988016d28ee7232f930f85cec61"
|
resolved "https://registry.yarnpkg.com/@actions/cache/-/cache-1.0.5.tgz#ba98725d38611b5426fc57a2f00bd8b0d9202f36"
|
||||||
integrity sha512-CzAseaJ4cKmOI58EIWUb/LfeYdM7Y25s39OEMtWAhEPrPPzrbSEjGHCLaYjJ0V8C4iojo8vBYh5B3OIJ37EiJw==
|
integrity sha512-TcvJOduwsPP27KLmIa5cqXsQYFK2GzILcEpnhvYmhGwi1aYx9XwhKmp6Im8X6DJMBxbvupKPsOntG6f6sSkIPA==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@actions/core" "^1.2.4"
|
"@actions/core" "^1.2.6"
|
||||||
"@actions/exec" "^1.0.1"
|
"@actions/exec" "^1.0.1"
|
||||||
"@actions/glob" "^0.1.0"
|
"@actions/glob" "^0.1.0"
|
||||||
"@actions/http-client" "^1.0.8"
|
"@actions/http-client" "^1.0.9"
|
||||||
"@actions/io" "^1.0.1"
|
"@actions/io" "^1.0.1"
|
||||||
"@azure/ms-rest-js" "^2.0.7"
|
"@azure/ms-rest-js" "^2.0.7"
|
||||||
"@azure/storage-blob" "^12.1.2"
|
"@azure/storage-blob" "^12.1.2"
|
||||||
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.3", "@actions/core@^1.2.4", "@actions/core@^1.2.6":
|
"@actions/core@^1.2.0", "@actions/core@^1.2.3", "@actions/core@^1.2.6":
|
||||||
version "1.2.6"
|
version "1.2.6"
|
||||||
resolved "https://registry.yarnpkg.com/@actions/core/-/core-1.2.6.tgz#a78d49f41a4def18e88ce47c2cac615d5694bf09"
|
resolved "https://registry.yarnpkg.com/@actions/core/-/core-1.2.6.tgz#a78d49f41a4def18e88ce47c2cac615d5694bf09"
|
||||||
integrity sha512-ZQYitnqiyBc3D+k7LsgSBmMDVkOVidaagDG7j3fOym77jNunWRuYx7VSHa9GNfFZh+zh61xsCjRj4JxMZlDqTA==
|
integrity sha512-ZQYitnqiyBc3D+k7LsgSBmMDVkOVidaagDG7j3fOym77jNunWRuYx7VSHa9GNfFZh+zh61xsCjRj4JxMZlDqTA==
|
||||||
@@ -44,6 +44,13 @@
|
|||||||
dependencies:
|
dependencies:
|
||||||
tunnel "0.0.6"
|
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":
|
"@actions/io@^1.0.1", "@actions/io@^1.0.2":
|
||||||
version "1.0.2"
|
version "1.0.2"
|
||||||
resolved "https://registry.yarnpkg.com/@actions/io/-/io-1.0.2.tgz#2f614b6e69ce14d191180451eb38e6576a6e6b27"
|
resolved "https://registry.yarnpkg.com/@actions/io/-/io-1.0.2.tgz#2f614b6e69ce14d191180451eb38e6576a6e6b27"
|
||||||
|
|||||||
Reference in New Issue
Block a user