mirror of
https://github.com/ruby/setup-ruby.git
synced 2026-09-13 14:34:21 +02:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a195098f6b | ||
|
|
f117ca04d8 | ||
|
|
8bc9ca9ace | ||
|
|
965ef501d4 | ||
|
|
153ca5e38f | ||
|
|
0effb2cc50 | ||
|
|
b62e5d53aa | ||
|
|
1c172ef5dc | ||
|
|
4cbbce6b48 | ||
|
|
108b3a2c8a | ||
|
|
25ccf0aad8 | ||
|
|
9ec93a2370 | ||
|
|
a096b998ad | ||
|
|
6ead459c74 | ||
|
|
45ec312a6e | ||
|
|
568cdbf232 | ||
|
|
638e8fff19 |
@@ -41,6 +41,9 @@ jobs:
|
||||
ruby-version: ${{ matrix.ruby }}
|
||||
bundler-cache: true
|
||||
- run: ruby -v
|
||||
- name: PATH
|
||||
shell: bash
|
||||
run: echo $PATH
|
||||
|
||||
- name: build compiler
|
||||
run: |
|
||||
@@ -85,6 +88,12 @@ jobs:
|
||||
else { echo "Can't find $e" }
|
||||
echo ''
|
||||
}
|
||||
- name: bash test
|
||||
shell: bash
|
||||
run: echo ~
|
||||
- name: Windows JRuby
|
||||
if: startsWith(matrix.os, 'windows') && startsWith(matrix.ruby, 'jruby')
|
||||
run: gem install sassc -N
|
||||
|
||||
lint:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
@@ -14,7 +14,7 @@ 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 |
|
||||
@@ -22,8 +22,9 @@ This action currently supports these versions of MRI, JRuby and TruffleRuby:
|
||||
`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).
|
||||
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.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.
|
||||
@@ -31,7 +32,7 @@ On Windows, Ruby 2.4 uses OpenSSL 1.0.2, which is no longer maintained.
|
||||
|
||||
### Supported Platforms
|
||||
|
||||
The action works for all [GitHub-hosted runners](https://help.github.com/en/actions/automating-your-workflow-with-github-actions/virtual-environments-for-github-hosted-runners), and [self-hosted runners](https://docs.github.com/en/actions/hosting-your-own-runners/about-self-hosted-runners), under [certain conditions](#limitations)
|
||||
The action works for all [GitHub-hosted runners](https://help.github.com/en/actions/automating-your-workflow-with-github-actions/virtual-environments-for-github-hosted-runners).
|
||||
|
||||
| Operating System | Recommended | Other Supported Versions |
|
||||
| ----------- | -------- | -------- |
|
||||
@@ -115,7 +116,7 @@ if they are not at the root of the repository, see [action.yml](action.yml) for
|
||||
|
||||
### Bundler
|
||||
|
||||
By default, if there is a `Gemfile.lock` file (or `$BUNDLE_GEMFILE.lock` if `$BUNDLE_GEMFILE` is set) with a `BUNDLED WITH` section,
|
||||
By default, if there is a `Gemfile.lock` file (or `$BUNDLE_GEMFILE.lock` or `gems.locked`) with a `BUNDLED WITH` section,
|
||||
the latest version of Bundler with the same major version will be installed.
|
||||
Otherwise, the latest compatible Bundler version is installed (Bundler 2 on Ruby >= 2.4, Bundler 1 on Ruby < 2.4).
|
||||
|
||||
@@ -131,9 +132,8 @@ This action provides a way to automatically run `bundle install` and cache the r
|
||||
```
|
||||
|
||||
This caching speeds up installing gems significantly and avoids too many requests to RubyGems.org.
|
||||
It needs a `Gemfile` (or `$BUNDLE_GEMFILE`) under the [`working-directory`](#working-directory).
|
||||
The caching works whether there is a `Gemfile.lock` or not.
|
||||
If there is a `Gemfile.lock`, `bundle config --local deployment true` is used.
|
||||
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.
|
||||
@@ -192,11 +192,17 @@ This action follows semantic versioning with a moving `v1` branch.
|
||||
This follows the [recommendations](https://github.com/actions/toolkit/blob/master/docs/action-versioning.md) of GitHub Actions.
|
||||
|
||||
## Using self-hosted runners
|
||||
You must meet the following parameters to use this action with self-hosted runners:
|
||||
|
||||
This action might work with [self-hosted runners](https://docs.github.com/en/actions/hosting-your-own-runners/about-self-hosted-runners)
|
||||
if the [virtual environment](https://github.com/actions/virtual-environments) is very similar to the ones used by GitHub runners. Notably:
|
||||
|
||||
* Make sure to use the same operating system and version.
|
||||
* 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`.
|
||||
|
||||
In other cases, please use a system Ruby or [install Ruby manually](https://github.com/postmodern/chruby/wiki#installing-rubies) instead.
|
||||
|
||||
## History
|
||||
|
||||
This action used to be at `eregon/use-ruby-action` and was moved to the `ruby` organization.
|
||||
|
||||
+2
-2
@@ -12,8 +12,8 @@ inputs:
|
||||
bundler:
|
||||
description: |
|
||||
The version of Bundler to install. Either 'none', 1, 2, 'latest' or 'Gemfile.lock'.
|
||||
For 'Gemfile.lock', the version is determined based on the BUNDLED WITH section from the file ($BUNDLE_GEMFILE || Gemfile).lock.
|
||||
Defaults to 'Gemfile.lock' if it exists and 'latest' otherwise.
|
||||
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.
|
||||
required: false
|
||||
default: 'default'
|
||||
bundler-cache:
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
const os = require('os')
|
||||
const path = require('path')
|
||||
const fs = require('fs')
|
||||
const util = require('util')
|
||||
const stream = require('stream')
|
||||
@@ -6,6 +7,10 @@ const crypto = require('crypto')
|
||||
const core = require('@actions/core')
|
||||
const { performance } = require('perf_hooks')
|
||||
|
||||
export const windows = (os.platform() === 'win32')
|
||||
// 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 async function measure(name, block) {
|
||||
return await core.group(name, async () => {
|
||||
const start = performance.now()
|
||||
@@ -55,10 +60,40 @@ function findUbuntuVersion() {
|
||||
}
|
||||
|
||||
// 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)) {
|
||||
// path starts with drive
|
||||
path = `/${path[0].toLowerCase()}${path.split(':', 2)[1]}`
|
||||
}
|
||||
return path.replace(/\\/g, '/').replace(/ /g, '\\ ')
|
||||
}
|
||||
|
||||
export function setupPath(newPathEntries) {
|
||||
const envPath = windows ? 'Path' : 'PATH'
|
||||
const originalPath = process.env[envPath].split(path.delimiter)
|
||||
let cleanPath = originalPath.filter(entry => !/\bruby\b/i.test(entry))
|
||||
|
||||
// First remove the conflicting path entries
|
||||
if (cleanPath.length !== originalPath.length) {
|
||||
core.startGroup(`Cleaning ${envPath}`)
|
||||
console.log(`Entries removed from ${envPath} to avoid conflicts with Ruby:`)
|
||||
for (const entry of originalPath) {
|
||||
if (!cleanPath.includes(entry)) {
|
||||
console.log(` ${entry}`)
|
||||
}
|
||||
}
|
||||
core.exportVariable(envPath, cleanPath.join(path.delimiter))
|
||||
core.endGroup()
|
||||
}
|
||||
|
||||
// Then add new path entries using core.addPath()
|
||||
let newPath
|
||||
if (windows) {
|
||||
// add MSYS2 in path for all Rubies on Windows, as it provides a better bash shell and a native toolchain
|
||||
const msys2 = ['C:\\msys64\\mingw64\\bin', 'C:\\msys64\\usr\\bin']
|
||||
newPath = [...newPathEntries, ...msys2]
|
||||
} else {
|
||||
newPath = newPathEntries
|
||||
}
|
||||
core.addPath(newPath.join(path.delimiter))
|
||||
}
|
||||
|
||||
+433
-626
File diff suppressed because it is too large
Load Diff
@@ -6,6 +6,8 @@ const exec = require('@actions/exec')
|
||||
const cache = require('@actions/cache')
|
||||
const common = require('./common')
|
||||
|
||||
const windows = common.windows
|
||||
|
||||
const inputDefaults = {
|
||||
'ruby-version': 'default',
|
||||
'bundler': 'default',
|
||||
@@ -26,7 +28,7 @@ export async function run() {
|
||||
export async function setupRuby(options = {}) {
|
||||
const inputs = { ...options }
|
||||
for (const key in inputDefaults) {
|
||||
if (!inputs.hasOwnProperty(key)) {
|
||||
if (!Object.prototype.hasOwnProperty.call(inputs, key)) {
|
||||
inputs[key] = core.getInput(key) || inputDefaults[key]
|
||||
}
|
||||
}
|
||||
@@ -47,10 +49,9 @@ export async function setupRuby(options = {}) {
|
||||
const version = validateRubyEngineAndVersion(platform, engineVersions, engine, parsedVersion)
|
||||
|
||||
createGemRC()
|
||||
envPreInstall()
|
||||
|
||||
const [rubyPrefix, newPathEntries] = await installer.install(platform, engine, version)
|
||||
|
||||
setupPath(newPathEntries)
|
||||
const rubyPrefix = await installer.install(platform, engine, version)
|
||||
|
||||
// When setup-ruby is used by other actions, this allows code in them to run
|
||||
// before 'bundle install'. Installed dependencies may require additional
|
||||
@@ -60,18 +61,44 @@ export async function setupRuby(options = {}) {
|
||||
}
|
||||
|
||||
if (inputs['bundler'] !== 'none') {
|
||||
const [gemfile, lockFile] = detectGemfiles()
|
||||
|
||||
await common.measure('Installing Bundler', async () =>
|
||||
installBundler(inputs['bundler'], platform, rubyPrefix, engine, version))
|
||||
installBundler(inputs['bundler'], lockFile, platform, rubyPrefix, engine, version))
|
||||
|
||||
if (inputs['bundler-cache'] === 'true') {
|
||||
await common.measure('bundle install', async () =>
|
||||
bundleInstall(platform, engine, version))
|
||||
bundleInstall(gemfile, lockFile, platform, engine, version))
|
||||
}
|
||||
}
|
||||
|
||||
core.setOutput('ruby-prefix', rubyPrefix)
|
||||
}
|
||||
|
||||
function detectGemfiles() {
|
||||
const gemfilePath = process.env['BUNDLE_GEMFILE'] || 'Gemfile'
|
||||
if (fs.existsSync(gemfilePath)) {
|
||||
const lockPath = `${gemfilePath}.lock`
|
||||
if (fs.existsSync(lockPath)) {
|
||||
return [gemfilePath, lockPath]
|
||||
} else {
|
||||
return [gemfilePath, null]
|
||||
}
|
||||
}
|
||||
|
||||
const gemsRbPath = "gems.rb"
|
||||
if (fs.existsSync(gemsRbPath)) {
|
||||
const lockPath = "gems.locked"
|
||||
if (fs.existsSync(lockPath)) {
|
||||
return [gemsRbPath, lockPath]
|
||||
} else {
|
||||
return [gemsRbPath, null]
|
||||
}
|
||||
}
|
||||
|
||||
return [null, null]
|
||||
}
|
||||
|
||||
function parseRubyEngineAndVersion(rubyVersion) {
|
||||
if (rubyVersion === 'default') {
|
||||
if (fs.existsSync('.ruby-version')) {
|
||||
@@ -135,27 +162,23 @@ function createGemRC() {
|
||||
}
|
||||
}
|
||||
|
||||
function setupPath(newPathEntries) {
|
||||
const originalPath = process.env['PATH'].split(path.delimiter)
|
||||
let cleanPath = originalPath.filter(entry => !/\bruby\b/i.test(entry))
|
||||
|
||||
if (cleanPath.length !== originalPath.length) {
|
||||
core.startGroup('Cleaning PATH')
|
||||
console.log('Entries removed from PATH to avoid conflicts with Ruby:')
|
||||
for (const entry of originalPath) {
|
||||
if (!cleanPath.includes(entry)) {
|
||||
console.log(` ${entry}`)
|
||||
}
|
||||
}
|
||||
core.endGroup()
|
||||
// sets up ENV variables
|
||||
// currently only used on Windows runners
|
||||
function envPreInstall() {
|
||||
const ENV = process.env
|
||||
if (windows) {
|
||||
// puts normal Ruby temp folder on SSD
|
||||
core.exportVariable('TMPDIR', ENV['RUNNER_TEMP'])
|
||||
// bash - sets home to match native windows, normally C:\Users\<user name>
|
||||
core.exportVariable('HOME', ENV['HOMEDRIVE'] + ENV['HOMEPATH'])
|
||||
// bash - needed to maintain Path from Windows
|
||||
core.exportVariable('MSYS2_PATH_TYPE', 'inherit')
|
||||
}
|
||||
|
||||
core.exportVariable('PATH', [...newPathEntries, ...cleanPath].join(path.delimiter))
|
||||
}
|
||||
|
||||
function readBundledWithFromGemfileLock(path) {
|
||||
if (fs.existsSync(path)) {
|
||||
const contents = fs.readFileSync(path, 'utf8')
|
||||
function readBundledWithFromGemfileLock(lockFile) {
|
||||
if (lockFile !== null) {
|
||||
const contents = fs.readFileSync(lockFile, 'utf8')
|
||||
const lines = contents.split(/\r?\n/)
|
||||
const bundledWithLine = lines.findIndex(line => /^BUNDLED WITH$/.test(line.trim()))
|
||||
if (bundledWithLine !== -1) {
|
||||
@@ -163,7 +186,7 @@ function readBundledWithFromGemfileLock(path) {
|
||||
if (nextLine && /^\d+/.test(nextLine.trim())) {
|
||||
const bundlerVersion = nextLine.trim()
|
||||
const majorVersion = bundlerVersion.match(/^\d+/)[0]
|
||||
console.log(`Using Bundler ${majorVersion} from ${path} BUNDLED WITH ${bundlerVersion}`)
|
||||
console.log(`Using Bundler ${majorVersion} from ${lockFile} BUNDLED WITH ${bundlerVersion}`)
|
||||
return majorVersion
|
||||
}
|
||||
}
|
||||
@@ -171,12 +194,12 @@ function readBundledWithFromGemfileLock(path) {
|
||||
return null
|
||||
}
|
||||
|
||||
async function installBundler(bundlerVersionInput, platform, rubyPrefix, engine, rubyVersion) {
|
||||
async function installBundler(bundlerVersionInput, lockFile, platform, rubyPrefix, engine, rubyVersion) {
|
||||
var bundlerVersion = bundlerVersionInput
|
||||
|
||||
if (bundlerVersion === 'default' || bundlerVersion === 'Gemfile.lock') {
|
||||
const gemfilePath = `${process.env['BUNDLE_GEMFILE'] || 'Gemfile'}.lock`
|
||||
bundlerVersion = readBundledWithFromGemfileLock(gemfilePath)
|
||||
bundlerVersion = readBundledWithFromGemfileLock(lockFile)
|
||||
|
||||
if (!bundlerVersion) {
|
||||
bundlerVersion = 'latest'
|
||||
}
|
||||
@@ -212,16 +235,16 @@ async function installBundler(bundlerVersionInput, platform, rubyPrefix, engine,
|
||||
}
|
||||
}
|
||||
|
||||
async function bundleInstall(platform, engine, version) {
|
||||
if (!fs.existsSync('Gemfile')) {
|
||||
console.log('No Gemfile, skipping "bundle install" and caching')
|
||||
return
|
||||
async function bundleInstall(gemfile, lockFile, platform, engine, version) {
|
||||
if (gemfile === null) {
|
||||
console.log('Could not determine gemfile path, skipping "bundle install" and caching')
|
||||
return false
|
||||
}
|
||||
|
||||
// config
|
||||
const path = 'vendor/bundle'
|
||||
const hasGemfileLock = fs.existsSync('Gemfile.lock');
|
||||
if (hasGemfileLock) {
|
||||
|
||||
if (lockFile !== null) {
|
||||
await exec.exec('bundle', ['config', '--local', 'deployment', 'true'])
|
||||
}
|
||||
await exec.exec('bundle', ['config', '--local', 'path', path])
|
||||
@@ -231,10 +254,10 @@ async function bundleInstall(platform, engine, version) {
|
||||
const baseKey = await computeBaseKey(platform, engine, version)
|
||||
let key = baseKey
|
||||
let restoreKeys
|
||||
if (hasGemfileLock) {
|
||||
key += `-Gemfile.lock-${await common.hashFile('Gemfile.lock')}`
|
||||
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)
|
||||
restoreKeys = [`${baseKey}-Gemfile.lock-`]
|
||||
restoreKeys = [`${baseKey}-${lockFile}-`]
|
||||
} else {
|
||||
// Only exact key, to never mix native gems of different platforms or Ruby versions
|
||||
restoreKeys = []
|
||||
@@ -280,6 +303,8 @@ async function bundleInstall(platform, engine, version) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
async function computeBaseKey(platform, engine, version) {
|
||||
|
||||
+1
-1
@@ -23,7 +23,7 @@
|
||||
"homepage": "https://github.com/ruby/setup-ruby",
|
||||
"dependencies": {
|
||||
"@actions/cache": "^1.0.2",
|
||||
"@actions/core": "^1.2.4",
|
||||
"@actions/core": "^1.2.6",
|
||||
"@actions/exec": "^1.0.3",
|
||||
"@actions/io": "^1.0.2",
|
||||
"@actions/tool-cache": "^1.3.4"
|
||||
|
||||
@@ -7,7 +7,7 @@ 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",
|
||||
"head", "debug",
|
||||
],
|
||||
"jruby": [
|
||||
|
||||
+19
-15
@@ -9,23 +9,28 @@ const rubyBuilderVersions = require('./ruby-builder-versions')
|
||||
const builderReleaseTag = 'enable-shared'
|
||||
const releasesURL = 'https://github.com/ruby/ruby-builder/releases'
|
||||
|
||||
const windows = common.windows
|
||||
|
||||
export function getAvailableVersions(platform, engine) {
|
||||
return rubyBuilderVersions.getVersions(platform)[engine]
|
||||
}
|
||||
|
||||
export async function install(platform, engine, version) {
|
||||
const rubyPrefix = await downloadAndExtract(platform, engine, version)
|
||||
let newPathEntries
|
||||
if (engine === 'rubinius') {
|
||||
newPathEntries = [path.join(rubyPrefix, 'bin'), path.join(rubyPrefix, 'gems', 'bin')]
|
||||
} else {
|
||||
newPathEntries = [path.join(rubyPrefix, 'bin')]
|
||||
}
|
||||
return [rubyPrefix, newPathEntries]
|
||||
return await downloadAndExtract(platform, engine, version)
|
||||
}
|
||||
|
||||
async function downloadAndExtract(platform, engine, version) {
|
||||
const rubiesDir = path.join(os.homedir(), '.rubies')
|
||||
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')])
|
||||
} else {
|
||||
common.setupPath([path.join(rubyPrefix, 'bin')])
|
||||
}
|
||||
|
||||
await io.mkdirP(rubiesDir)
|
||||
|
||||
const downloadPath = await common.measure('Downloading Ruby', async () => {
|
||||
@@ -35,16 +40,15 @@ async function downloadAndExtract(platform, engine, version) {
|
||||
})
|
||||
|
||||
await common.measure('Extracting Ruby', async () => {
|
||||
if (process.env.ImageOS === 'win16') {
|
||||
const tar = '"C:\\Program Files\\Git\\usr\\bin\\tar.exe"'
|
||||
await exec.exec(tar, [ '-xz', '-C', common.win2nix(rubiesDir), '-f', common.win2nix(downloadPath) ])
|
||||
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) ])
|
||||
} else {
|
||||
const tar = platform.startsWith('windows') ? 'C:\\Windows\\system32\\tar.exe' : 'tar'
|
||||
await exec.exec(tar, [ '-xz', '-C', rubiesDir, '-f', downloadPath ])
|
||||
await exec.exec('tar', [ '-xz', '-C', rubiesDir, '-f', downloadPath ])
|
||||
}
|
||||
})
|
||||
|
||||
return path.join(rubiesDir, `${engine}-${version}`)
|
||||
return rubyPrefix
|
||||
}
|
||||
|
||||
function getDownloadURL(platform, engine, version) {
|
||||
|
||||
@@ -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"
|
||||
|
||||
+15
-47
@@ -10,20 +10,14 @@ const tc = require('@actions/tool-cache')
|
||||
const common = require('./common')
|
||||
const rubyInstallerVersions = require('./windows-versions').versions
|
||||
|
||||
// Extract to SSD, see https://github.com/ruby/setup-ruby/pull/14
|
||||
const drive = (process.env['GITHUB_WORKSPACE'] || 'C')[0]
|
||||
const drive = common.drive
|
||||
|
||||
// needed for 2.1, 2.2, 2.3, and mswin, cert file used by Git for Windows
|
||||
const certFile = 'C:\\Program Files\\Git\\mingw64\\ssl\\cert.pem'
|
||||
|
||||
// standard MSYS2 location, found by 'devkit.rb'
|
||||
const msys2 = 'C:\\msys64'
|
||||
const msys2PathEntries = [`${msys2}\\mingw64\\bin`, `${msys2}\\usr\\bin`]
|
||||
|
||||
// location & path for old RubyInstaller DevKit (MSYS), Ruby 2.1, 2.2 and 2.3
|
||||
const msys = `${drive}:\\DevKit64`
|
||||
const msysPathEntries = [`${msys}\\mingw\\x86_64-w64-mingw32\\bin`,
|
||||
`${msys}\\mingw\\bin`, `${msys}\\bin`]
|
||||
const msysPathEntries = [`${msys}\\mingw\\x86_64-w64-mingw32\\bin`, `${msys}\\mingw\\bin`, `${msys}\\bin`]
|
||||
|
||||
export function getAvailableVersions(platform, engine) {
|
||||
if (engine === 'ruby') {
|
||||
@@ -41,6 +35,12 @@ export async function install(platform, engine, version) {
|
||||
}
|
||||
const base = url.slice(url.lastIndexOf('/') + 1, url.length - '.7z'.length)
|
||||
|
||||
const rubyPrefix = `${drive}:\\${base}`
|
||||
|
||||
let toolchainPaths = (version === 'mswin') ? await setupMSWin() : await setupMingw(version)
|
||||
|
||||
common.setupPath([`${rubyPrefix}\\bin`, ...toolchainPaths])
|
||||
|
||||
const downloadPath = await common.measure('Downloading Ruby', async () => {
|
||||
console.log(url)
|
||||
return await tc.downloadTool(url)
|
||||
@@ -48,26 +48,8 @@ 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 }))
|
||||
const rubyPrefix = `${drive}:\\${base}`
|
||||
|
||||
let toolchainPaths = (version === 'mswin') ?
|
||||
await setupMSWin() : await setupMingw(version)
|
||||
const newPathEntries = [`${rubyPrefix}\\bin`, ...toolchainPaths]
|
||||
|
||||
return [rubyPrefix, newPathEntries]
|
||||
}
|
||||
|
||||
// Remove when Actions Windows image contains MSYS2 install
|
||||
async function symLinkToEmbeddedMSYS2() {
|
||||
const toolCacheVersions = tc.findAllVersions('Ruby')
|
||||
toolCacheVersions.sort()
|
||||
if (toolCacheVersions.length === 0) {
|
||||
throw new Error('Could not find MSYS2 in the toolcache')
|
||||
}
|
||||
const latestVersion = toolCacheVersions.slice(-1)[0]
|
||||
const hostedRuby = tc.find('Ruby', latestVersion)
|
||||
await common.measure('Linking MSYS2', async () =>
|
||||
exec.exec(`cmd /c mklink /D ${msys2} ${hostedRuby}\\msys64`))
|
||||
return rubyPrefix
|
||||
}
|
||||
|
||||
async function setupMingw(version) {
|
||||
@@ -75,17 +57,10 @@ async function setupMingw(version) {
|
||||
|
||||
if (version.match(/^2\.[123]/)) {
|
||||
core.exportVariable('SSL_CERT_FILE', certFile)
|
||||
await common.measure('Installing MSYS1', async () =>
|
||||
installMSYS(version))
|
||||
|
||||
await common.measure('Installing MSYS', async () => installMSYS(version))
|
||||
return msysPathEntries
|
||||
} else {
|
||||
// Remove when Actions Windows image contains MSYS2 install
|
||||
if (!fs.existsSync(msys2)) {
|
||||
await symLinkToEmbeddedMSYS2()
|
||||
}
|
||||
|
||||
return msys2PathEntries
|
||||
return []
|
||||
}
|
||||
}
|
||||
|
||||
@@ -118,15 +93,7 @@ async function setupMSWin() {
|
||||
fs.copyFileSync(certFile, cert)
|
||||
}
|
||||
|
||||
// Remove when Actions Windows image contains MSYS2 install
|
||||
if (!fs.existsSync(msys2)) {
|
||||
await symLinkToEmbeddedMSYS2()
|
||||
}
|
||||
|
||||
const VCPathEntries = await common.measure('Setting up MSVC environment', async () =>
|
||||
addVCVARSEnv())
|
||||
|
||||
return [...VCPathEntries, ...msys2PathEntries]
|
||||
return await common.measure('Setting up MSVC environment', async () => addVCVARSEnv())
|
||||
}
|
||||
|
||||
/* Sets MSVC environment for use in Actions
|
||||
@@ -149,8 +116,9 @@ export function addVCVARSEnv() {
|
||||
let newPathEntries = undefined
|
||||
for (let [k, v] of newEnv) {
|
||||
if (process.env[k] !== v) {
|
||||
if (k === 'Path') {
|
||||
newPathEntries = v.replace(process.env['Path'], '').split(path.delimiter)
|
||||
if (/^Path$/i.test(k)) {
|
||||
const newPathStr = v.replace(`${path.delimiter}${process.env['Path']}`, '')
|
||||
newPathEntries = newPathStr.split(path.delimiter)
|
||||
} else {
|
||||
core.exportVariable(k, v)
|
||||
}
|
||||
|
||||
@@ -17,15 +17,10 @@
|
||||
semver "^6.1.0"
|
||||
uuid "^3.3.3"
|
||||
|
||||
"@actions/core@^1.2.0", "@actions/core@^1.2.4":
|
||||
version "1.2.4"
|
||||
resolved "https://registry.yarnpkg.com/@actions/core/-/core-1.2.4.tgz#96179dbf9f8d951dd74b40a0dbd5c22555d186ab"
|
||||
integrity sha512-YJCEq8BE3CdN8+7HPZ/4DxJjk/OkZV2FFIf+DlZTC/4iBlzYCD5yjRR6eiOS5llO11zbRltIRuKAjMKaWTE6cg==
|
||||
|
||||
"@actions/core@^1.2.3":
|
||||
version "1.2.3"
|
||||
resolved "https://registry.yarnpkg.com/@actions/core/-/core-1.2.3.tgz#e844b4fa0820e206075445079130868f95bfca95"
|
||||
integrity sha512-Wp4xnyokakM45Uuj4WLUxdsa8fJjKVl1fDTsPbTEcTcuu0Nb26IPQbOtjmnfaCPGcaoPOOqId8H9NapZ8gii4w==
|
||||
"@actions/core@^1.2.0", "@actions/core@^1.2.3", "@actions/core@^1.2.4", "@actions/core@^1.2.6":
|
||||
version "1.2.6"
|
||||
resolved "https://registry.yarnpkg.com/@actions/core/-/core-1.2.6.tgz#a78d49f41a4def18e88ce47c2cac615d5694bf09"
|
||||
integrity sha512-ZQYitnqiyBc3D+k7LsgSBmMDVkOVidaagDG7j3fOym77jNunWRuYx7VSHa9GNfFZh+zh61xsCjRj4JxMZlDqTA==
|
||||
|
||||
"@actions/exec@^1.0.0", "@actions/exec@^1.0.1", "@actions/exec@^1.0.3":
|
||||
version "1.0.4"
|
||||
@@ -331,9 +326,9 @@ minimatch@^3.0.4:
|
||||
brace-expansion "^1.1.7"
|
||||
|
||||
node-fetch@^2.6.0:
|
||||
version "2.6.0"
|
||||
resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.0.tgz#e633456386d4aa55863f676a7ab0daa8fdecb0fd"
|
||||
integrity sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==
|
||||
version "2.6.1"
|
||||
resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052"
|
||||
integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==
|
||||
|
||||
process@^0.11.10:
|
||||
version "0.11.10"
|
||||
|
||||
Reference in New Issue
Block a user