Compare commits

...
8 Commits
Author SHA1 Message Date
Benoit Daloze a699edbce6 Add test for ruby-3.0.0-preview1 2020-11-19 00:33:41 +01:00
Benoit Daloze e38f9abc9e Fix usages of string.split(sep, limit)
* Since the limit just removes further matches in JavaScript.
2020-11-19 00:33:40 +01:00
Benoit Daloze 7c2bf7263d Ensure an engine-only ruby-version picks the latest stable version and not a preview or RC 2020-11-18 21:52:51 +01:00
Benoit Daloze 34fbbc1d36 Update README.md 2020-11-16 12:13:08 +01:00
Benoit Daloze 9bc07a3af0 No builds of truffleruby{,-head} on macos-11.0 yet 2020-11-13 10:48:04 +01:00
Benoit Daloze 63dde36864 Remove the Caching bundle install manually section
* It is too error prone and the automatic approach is a lot safer and easier.
2020-11-13 10:38:56 +01:00
Benoit Daloze fde3324171 Remove redundant bundle install in the usage examples 2020-11-13 10:38:56 +01:00
Benoit Daloze 59aafb8612 Add support for macos-11.0 2020-11-13 10:33:21 +01:00
6 changed files with 48 additions and 48 deletions
+6 -2
View File
@@ -15,20 +15,24 @@ 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 }
- { os: macos-11.0, ruby: truffleruby-head }
name: ${{ matrix.os }} ${{ matrix.ruby }} name: ${{ matrix.os }} ${{ matrix.ruby }}
runs-on: ${{ matrix.os }} runs-on: ${{ matrix.os }}
+2 -32
View File
@@ -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
``` ```
@@ -93,7 +92,6 @@ jobs:
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
``` ```
@@ -142,35 +140,6 @@ If there is a `Gemfile.lock` (or `$BUNDLE_GEMFILE.lock` or `gems.locked`), `bund
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 +170,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,
+15 -3
View File
@@ -11,6 +11,14 @@ export const windows = (os.platform() === 'win32')
// Extract to SSD on Windows, see https://github.com/ruby/setup-ruby/pull/14 // 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')
@@ -52,9 +64,9 @@ export function getVirtualEnvironmentName() {
return `ubuntu-${match[1]}.04` return `ubuntu-${match[1]}.04`
} }
match = imageOS.match(/^macos(\d{2})(\d+)/) // e.g. macos1015 match = imageOS.match(/^macos(\d{2})(\d+)?/) // e.g. macos1015, macos11
if (match) { if (match) {
return `macos-${match[1]}.${match[2]}` return `macos-${match[1]}.${match[2] || '0'}`
} }
match = imageOS.match(/^win(\d+)/) // e.g. win19 match = imageOS.match(/^win(\d+)/) // e.g. win19
@@ -91,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, '\\ ')
} }
Generated Vendored
+21 -7
View File
@@ -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,8 +32094,10 @@ 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__, "shouldExtractInToolCache", function() { return shouldExtractInToolCache; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "shouldExtractInToolCache", function() { return shouldExtractInToolCache; });
@@ -32115,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()
@@ -32132,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')
@@ -32156,9 +32170,9 @@ function getVirtualEnvironmentName() {
return `ubuntu-${match[1]}.04` return `ubuntu-${match[1]}.04`
} }
match = imageOS.match(/^macos(\d{2})(\d+)/) // e.g. macos1015 match = imageOS.match(/^macos(\d{2})(\d+)?/) // e.g. macos1015, macos11
if (match) { if (match) {
return `macos-${match[1]}.${match[2]}` return `macos-${match[1]}.${match[2] || '0'}`
} }
match = imageOS.match(/^win(\d+)/) // e.g. win19 match = imageOS.match(/^win(\d+)/) // e.g. win19
@@ -32195,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, '\\ ')
} }
@@ -51264,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`)
} }
@@ -51276,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]
@@ -51290,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 {
+3 -3
View File
@@ -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 {
+1 -1
View File
@@ -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)
}) })