mirror of
https://github.com/ruby/setup-ruby.git
synced 2026-09-13 22:44:20 +02:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
bacba738b2 | ||
|
|
21351ecc0a | ||
|
|
4d7e038419 | ||
|
|
e27aee156d | ||
|
|
43bb24d212 | ||
|
|
0c4183e8b8 | ||
|
|
50ae8432ea | ||
|
|
a699edbce6 | ||
|
|
e38f9abc9e | ||
|
|
7c2bf7263d | ||
|
|
34fbbc1d36 | ||
|
|
9bc07a3af0 | ||
|
|
63dde36864 | ||
|
|
fde3324171 | ||
|
|
59aafb8612 | ||
|
|
ad1ebae995 |
@@ -15,20 +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, ruby-3.0.0-preview1, ruby-head, debug, jruby-9.1, 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: 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: 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 }}
|
||||||
@@ -100,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
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ This action currently supports these versions of MRI, JRuby and TruffleRuby:
|
|||||||
| ----------- | -------- |
|
| ----------- | -------- |
|
||||||
| 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.2.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.
|
||||||
@@ -39,7 +39,7 @@ The action works for all [GitHub-hosted runners](https://help.github.com/en/acti
|
|||||||
| 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` |
|
||||||
|
|
||||||
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)
|
||||||
@@ -67,7 +67,6 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
ruby-version: 2.6 # Not needed with a .ruby-version file
|
ruby-version: 2.6 # Not needed with a .ruby-version file
|
||||||
bundler-cache: true # runs 'bundle install' and caches installed gems automatically
|
bundler-cache: true # runs 'bundle install' and caches installed gems automatically
|
||||||
- run: bundle install
|
|
||||||
- run: bundle exec rake
|
- run: bundle exec rake
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -86,14 +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 }}
|
||||||
bundler-cache: true # runs 'bundle install' and caches installed gems automatically
|
bundler-cache: true # runs 'bundle install' and caches installed gems automatically
|
||||||
- run: bundle install
|
|
||||||
- run: bundle exec rake
|
- run: bundle exec rake
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -139,38 +136,26 @@ 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`).
|
||||||
|
|
||||||
### 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
|
||||||
|
|
||||||
Note that running CI on Windows can be quite challenging if you are not very familiar with Windows.
|
Note that running CI on Windows can be quite challenging if you are not very familiar with Windows.
|
||||||
@@ -201,6 +186,7 @@ This action might work with [self-hosted runners](https://docs.github.com/en/act
|
|||||||
if the [virtual environment](https://github.com/actions/virtual-environments) is very similar to the ones used by GitHub runners. Notably:
|
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.
|
* 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 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 default tool cache directory (`/opt/hostedtoolcache` on Linux, `/Users/runner/hostedtoolcache` on macOS,
|
* The default tool cache directory (`/opt/hostedtoolcache` on Linux, `/Users/runner/hostedtoolcache` on macOS,
|
||||||
|
|||||||
@@ -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,30 +48,7 @@ export async function hashFile(file) {
|
|||||||
return hash.digest('hex')
|
return hash.digest('hex')
|
||||||
}
|
}
|
||||||
|
|
||||||
export function getVirtualEnvironmentName() {
|
function getImageOS() {
|
||||||
const platform = os.platform()
|
|
||||||
if (platform === 'linux') {
|
|
||||||
return `ubuntu-${findUbuntuVersion()}`
|
|
||||||
} else if (platform === 'darwin') {
|
|
||||||
return 'macos-latest'
|
|
||||||
} else if (platform === 'win32') {
|
|
||||||
return 'windows-latest'
|
|
||||||
} else {
|
|
||||||
throw new Error(`Unknown platform ${platform}`)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function findUbuntuVersion() {
|
|
||||||
const lsb_release = fs.readFileSync('/etc/lsb-release', 'utf8')
|
|
||||||
const match = lsb_release.match(/^DISTRIB_RELEASE=(\d+\.\d+)$/m)
|
|
||||||
if (match) {
|
|
||||||
return match[1]
|
|
||||||
} else {
|
|
||||||
throw new Error('Could not find Ubuntu version')
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export function getImageOS() {
|
|
||||||
const imageOS = process.env['ImageOS']
|
const imageOS = process.env['ImageOS']
|
||||||
if (!imageOS) {
|
if (!imageOS) {
|
||||||
throw new Error('The environment variable ImageOS must be set')
|
throw new Error('The environment variable ImageOS must be set')
|
||||||
@@ -67,6 +56,27 @@ export function getImageOS() {
|
|||||||
return imageOS
|
return imageOS
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function getVirtualEnvironmentName() {
|
||||||
|
const imageOS = getImageOS()
|
||||||
|
|
||||||
|
let match = imageOS.match(/^ubuntu(\d+)/) // e.g. ubuntu18
|
||||||
|
if (match) {
|
||||||
|
return `ubuntu-${match[1]}.04`
|
||||||
|
}
|
||||||
|
|
||||||
|
match = imageOS.match(/^macos(\d{2})(\d+)?/) // e.g. macos1015, macos11
|
||||||
|
if (match) {
|
||||||
|
return `macos-${match[1]}.${match[2] || '0'}`
|
||||||
|
}
|
||||||
|
|
||||||
|
match = imageOS.match(/^win(\d+)/) // e.g. win19
|
||||||
|
if (match) {
|
||||||
|
return `windows-20${match[1]}`
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new Error(`Unknown ImageOS ${imageOS}`)
|
||||||
|
}
|
||||||
|
|
||||||
export function shouldExtractInToolCache(engine, version) {
|
export function shouldExtractInToolCache(engine, version) {
|
||||||
return engine === 'ruby' && !isHeadVersion(version)
|
return engine === 'ruby' && !isHeadVersion(version)
|
||||||
}
|
}
|
||||||
@@ -93,7 +103,7 @@ export function getToolCacheRubyPrefix(platform, version) {
|
|||||||
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, '\\ ')
|
||||||
}
|
}
|
||||||
|
|||||||
+56
-34
@@ -27796,7 +27796,7 @@ 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)
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -32094,11 +32094,12 @@ exports.default = _default;
|
|||||||
__webpack_require__.r(__webpack_exports__);
|
__webpack_require__.r(__webpack_exports__);
|
||||||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "windows", function() { return windows; });
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "windows", function() { return windows; });
|
||||||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "drive", function() { return drive; });
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "drive", function() { return drive; });
|
||||||
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "partition", function() { return partition; });
|
||||||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "measure", function() { return measure; });
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "measure", function() { return measure; });
|
||||||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isHeadVersion", function() { return isHeadVersion; });
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isHeadVersion", function() { return isHeadVersion; });
|
||||||
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isStableVersion", function() { return isStableVersion; });
|
||||||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "hashFile", function() { return hashFile; });
|
/* 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__, "getVirtualEnvironmentName", function() { return getVirtualEnvironmentName; });
|
||||||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getImageOS", function() { return getImageOS; });
|
|
||||||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "shouldExtractInToolCache", function() { return shouldExtractInToolCache; });
|
/* 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__, "getToolCacheRubyPrefix", function() { return getToolCacheRubyPrefix; });
|
||||||
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "win2nix", function() { return win2nix; });
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "win2nix", function() { return win2nix; });
|
||||||
@@ -32116,6 +32117,14 @@ 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
|
||||||
const drive = (windows ? (process.env['GITHUB_WORKSPACE'] || 'C')[0] : undefined)
|
const drive = (windows ? (process.env['GITHUB_WORKSPACE'] || 'C')[0] : undefined)
|
||||||
|
|
||||||
|
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)]
|
||||||
|
}
|
||||||
|
|
||||||
async function measure(name, block) {
|
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()
|
||||||
@@ -32133,6 +32142,10 @@ function isHeadVersion(rubyVersion) {
|
|||||||
return rubyVersion === 'head' || rubyVersion === 'debug' || rubyVersion === 'mingw' || rubyVersion === 'mswin'
|
return rubyVersion === 'head' || rubyVersion === 'debug' || rubyVersion === 'mingw' || rubyVersion === 'mswin'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function isStableVersion(rubyVersion) {
|
||||||
|
return /^\d+(\.\d+)*$/.test(rubyVersion)
|
||||||
|
}
|
||||||
|
|
||||||
async function hashFile(file) {
|
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')
|
||||||
@@ -32141,29 +32154,6 @@ async function hashFile(file) {
|
|||||||
return hash.digest('hex')
|
return hash.digest('hex')
|
||||||
}
|
}
|
||||||
|
|
||||||
function getVirtualEnvironmentName() {
|
|
||||||
const platform = os.platform()
|
|
||||||
if (platform === 'linux') {
|
|
||||||
return `ubuntu-${findUbuntuVersion()}`
|
|
||||||
} else if (platform === 'darwin') {
|
|
||||||
return 'macos-latest'
|
|
||||||
} else if (platform === 'win32') {
|
|
||||||
return 'windows-latest'
|
|
||||||
} else {
|
|
||||||
throw new Error(`Unknown platform ${platform}`)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function findUbuntuVersion() {
|
|
||||||
const lsb_release = fs.readFileSync('/etc/lsb-release', 'utf8')
|
|
||||||
const match = lsb_release.match(/^DISTRIB_RELEASE=(\d+\.\d+)$/m)
|
|
||||||
if (match) {
|
|
||||||
return match[1]
|
|
||||||
} else {
|
|
||||||
throw new Error('Could not find Ubuntu version')
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function getImageOS() {
|
function getImageOS() {
|
||||||
const imageOS = process.env['ImageOS']
|
const imageOS = process.env['ImageOS']
|
||||||
if (!imageOS) {
|
if (!imageOS) {
|
||||||
@@ -32172,6 +32162,27 @@ function getImageOS() {
|
|||||||
return imageOS
|
return imageOS
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function getVirtualEnvironmentName() {
|
||||||
|
const imageOS = getImageOS()
|
||||||
|
|
||||||
|
let match = imageOS.match(/^ubuntu(\d+)/) // e.g. ubuntu18
|
||||||
|
if (match) {
|
||||||
|
return `ubuntu-${match[1]}.04`
|
||||||
|
}
|
||||||
|
|
||||||
|
match = imageOS.match(/^macos(\d{2})(\d+)?/) // e.g. macos1015, macos11
|
||||||
|
if (match) {
|
||||||
|
return `macos-${match[1]}.${match[2] || '0'}`
|
||||||
|
}
|
||||||
|
|
||||||
|
match = imageOS.match(/^win(\d+)/) // e.g. win19
|
||||||
|
if (match) {
|
||||||
|
return `windows-20${match[1]}`
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new Error(`Unknown ImageOS ${imageOS}`)
|
||||||
|
}
|
||||||
|
|
||||||
function shouldExtractInToolCache(engine, version) {
|
function shouldExtractInToolCache(engine, version) {
|
||||||
return engine === 'ruby' && !isHeadVersion(version)
|
return engine === 'ruby' && !isHeadVersion(version)
|
||||||
}
|
}
|
||||||
@@ -32198,7 +32209,7 @@ function getToolCacheRubyPrefix(platform, version) {
|
|||||||
function win2nix(path) {
|
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, '\\ ')
|
||||||
}
|
}
|
||||||
@@ -44539,7 +44550,7 @@ 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"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
@@ -51267,7 +51278,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`)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -51279,7 +51290,7 @@ function parseRubyEngineAndVersion(rubyVersion) {
|
|||||||
engine = rubyVersion
|
engine = rubyVersion
|
||||||
version = '' // Let the logic in validateRubyEngineAndVersion() 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]
|
||||||
@@ -51293,7 +51304,7 @@ 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))
|
const found = latestToFirstVersion.find(v => common.isStableVersion(v) && v.startsWith(parsedVersion))
|
||||||
if (found) {
|
if (found) {
|
||||||
version = found
|
version = found
|
||||||
} else {
|
} else {
|
||||||
@@ -51410,7 +51421,7 @@ async function bundleInstall(gemfile, lockFile, platform, engine, version) {
|
|||||||
const paths = [path]
|
const paths = [path]
|
||||||
const baseKey = await computeBaseKey(platform, engine, version, lockFile)
|
const baseKey = await computeBaseKey(platform, engine, version, 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}`)
|
||||||
|
|
||||||
@@ -51435,6 +51446,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 {
|
||||||
@@ -51454,7 +51469,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-${common.getImageOS()}-${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 = '';
|
||||||
@@ -52944,10 +52959,17 @@ async function downloadAndExtract(platform, engine, version) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
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`
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -106,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`)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -118,7 +118,7 @@ function parseRubyEngineAndVersion(rubyVersion) {
|
|||||||
engine = rubyVersion
|
engine = rubyVersion
|
||||||
version = '' // Let the logic in validateRubyEngineAndVersion() 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]
|
||||||
@@ -132,7 +132,7 @@ 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))
|
const found = latestToFirstVersion.find(v => common.isStableVersion(v) && v.startsWith(parsedVersion))
|
||||||
if (found) {
|
if (found) {
|
||||||
version = found
|
version = found
|
||||||
} else {
|
} else {
|
||||||
@@ -249,7 +249,7 @@ async function bundleInstall(gemfile, lockFile, platform, engine, version) {
|
|||||||
const paths = [path]
|
const paths = [path]
|
||||||
const baseKey = await computeBaseKey(platform, engine, version, lockFile)
|
const baseKey = await computeBaseKey(platform, engine, version, 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 +274,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 +297,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-${common.getImageOS()}-${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 = '';
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ 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"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
+9
-2
@@ -57,10 +57,17 @@ async function downloadAndExtract(platform, engine, version) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
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`
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -120,7 +120,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)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user