Compare commits

..
10 Commits
13 changed files with 166 additions and 181 deletions
+3 -1
View File
@@ -22,4 +22,6 @@ $ cp pre-commit .git/hooks/pre-commit
## Adding a new Ruby version ## Adding a new Ruby version
Add the new version in `ruby-builder-versions.js`, then follow the steps above in [Regenerating dist/index.js](#regenerating-distindexjs) to update `dist/index.js`. Finally, update the "Supported Versions" section of the README if needed. Add the new version in `ruby-builder-versions.json`,
then follow the steps above in [Regenerating dist/index.js](#regenerating-distindexjs) to update `dist/index.js`.
Finally, update the "Supported Versions" section of the README if needed.
+5 -5
View File
@@ -15,9 +15,9 @@ This action currently supports these versions of MRI, JRuby and TruffleRuby:
| Interpreter | Versions | | Interpreter | Versions |
| ----------- | -------- | | ----------- | -------- |
| `ruby` | 1.9.3, 2.0.0, 2.1.9, 2.2, all versions from 2.3.0 until 3.1.0, head, debug, mingw, mswin | | `ruby` | 1.9.3, 2.0.0, 2.1.9, 2.2, all versions from 2.3.0 until 3.1.0, head, debug, mingw, mswin |
| `jruby` | 9.1.17.0 - 9.3.2.0, head | | `jruby` | 9.1.17.0 - 9.3.3.0, head |
| `truffleruby` | 19.3.0 - 21.3.0, head | | `truffleruby` | 19.3.0 - 22.0.0, head |
| `truffleruby+graalvm` | 21.2.0 - 21.3.0, head | | `truffleruby+graalvm` | 21.2.0 - 22.0.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.
@@ -50,8 +50,8 @@ and on Windows by [RubyInstaller2](https://github.com/oneclick/rubyinstaller2).
`jruby-head` is generated by [jruby-dev-builder](https://github.com/ruby/jruby-dev-builder), `jruby-head` is generated by [jruby-dev-builder](https://github.com/ruby/jruby-dev-builder),
`truffleruby-head` is generated by [truffleruby-dev-builder](https://github.com/ruby/truffleruby-dev-builder) `truffleruby-head` is generated by [truffleruby-dev-builder](https://github.com/ruby/truffleruby-dev-builder)
and `truffleruby+graalvm` is generated by [graalvm-ce-dev-builds](https://github.com/graalvm/graalvm-ce-dev-builds). and `truffleruby+graalvm` is generated by [graalvm-ce-dev-builds](https://github.com/graalvm/graalvm-ce-dev-builds).
The full list of available Ruby versions can be seen in [ruby-builder-versions.js](ruby-builder-versions.js) The full list of available Ruby versions can be seen in [ruby-builder-versions.json](ruby-builder-versions.json)
for Ubuntu and macOS and in [windows-versions.js](windows-versions.js) for Windows. for Ubuntu and macOS and in [windows-versions.json](windows-versions.json) for Windows.
## Usage ## Usage
+8 -3
View File
@@ -71,7 +71,9 @@ export async function installBundler(bundlerVersionInput, lockFile, platform, ru
throw new Error(`Cannot parse bundler input: ${bundlerVersion}`) throw new Error(`Cannot parse bundler input: ${bundlerVersion}`)
} }
if (engine === 'ruby' && common.floatVersion(rubyVersion) <= 2.2) { const floatVersion = common.floatVersion(rubyVersion)
if (engine === 'ruby' && floatVersion <= 2.2) {
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' && /^2\.3\.[01]/.test(rubyVersion)) { } else if (engine === 'ruby' && /^2\.3\.[01]/.test(rubyVersion)) {
@@ -82,7 +84,10 @@ export async function installBundler(bundlerVersionInput, lockFile, platform, ru
bundlerVersion = '1' bundlerVersion = '1'
} }
if (common.isHeadVersion(rubyVersion) && common.isBundler2Default(engine, rubyVersion) && bundlerVersion.startsWith('2')) { // Workaround for truffleruby 22.0 + latest Bundler, use shipped Bundler instead: https://github.com/oracle/truffleruby/issues/2586
const useShippedBundler2 = common.isHeadVersion(rubyVersion) || (engine.startsWith('truffleruby') && rubyVersion.startsWith('22.0'))
if (useShippedBundler2 && common.isBundler2Default(engine, rubyVersion) && bundlerVersion.startsWith('2')) {
// Avoid installing a newer Bundler version for head versions as it might not work. // Avoid installing a newer Bundler version for head versions as it might not work.
// For releases, even if they ship with Bundler 2 we install the latest Bundler. // For releases, even if they ship with Bundler 2 we install the latest Bundler.
console.log(`Using Bundler 2 shipped with ${engine}-${rubyVersion}`) console.log(`Using Bundler 2 shipped with ${engine}-${rubyVersion}`)
@@ -92,7 +97,7 @@ export async function installBundler(bundlerVersionInput, lockFile, platform, ru
const gem = path.join(rubyPrefix, 'bin', 'gem') const gem = path.join(rubyPrefix, 'bin', 'gem')
const bundlerVersionConstraint = /^\d+\.\d+\.\d+/.test(bundlerVersion) ? bundlerVersion : `~> ${bundlerVersion}` const bundlerVersionConstraint = /^\d+\.\d+\.\d+/.test(bundlerVersion) ? bundlerVersion : `~> ${bundlerVersion}`
// Workaround for https://github.com/rubygems/rubygems/issues/5245 // Workaround for https://github.com/rubygems/rubygems/issues/5245
const force = (platform.startsWith('windows-') && engine === 'ruby' && common.floatVersion(rubyVersion) >= 3.1) ? ['--force'] : [] const force = (platform.startsWith('windows-') && engine === 'ruby' && floatVersion >= 3.1) ? ['--force'] : []
await exec.exec(gem, ['install', 'bundler', ...force, '-v', bundlerVersionConstraint]) await exec.exec(gem, ['install', 'bundler', ...force, '-v', bundlerVersionConstraint])
} }
Generated Vendored
+39 -122
View File
File diff suppressed because one or more lines are too long
+2 -2
View File
@@ -30,5 +30,5 @@ versions['mingw'] = 'https://github.com/MSP-Greg/ruby-loco/releases/download/rub
versions['mswin'] = 'https://github.com/MSP-Greg/ruby-loco/releases/download/ruby-master/ruby-mswin.7z' versions['mswin'] = 'https://github.com/MSP-Greg/ruby-loco/releases/download/ruby-master/ruby-mswin.7z'
versions['ucrt'] = 'https://github.com/MSP-Greg/ruby-loco/releases/download/ruby-master/ruby-ucrt.7z' versions['ucrt'] = 'https://github.com/MSP-Greg/ruby-loco/releases/download/ruby-master/ruby-ucrt.7z'
js = "export const versions = #{JSON.pretty_generate(versions)}\n" File.binwrite 'windows-versions.json', "#{JSON.pretty_generate(versions)}\n"
File.binwrite 'windows-versions.js', js
+12 -7
View File
@@ -2,6 +2,7 @@ const os = require('os')
const fs = require('fs') const fs = require('fs')
const path = require('path') const path = require('path')
const core = require('@actions/core') const core = require('@actions/core')
const exec = require('@actions/exec')
const common = require('./common') const common = require('./common')
const rubygems = require('./rubygems') const rubygems = require('./rubygems')
const bundler = require('./bundler') const bundler = require('./bundler')
@@ -62,6 +63,9 @@ export async function setupRuby(options = {}) {
const rubyPrefix = await installer.install(platform, engine, version) const rubyPrefix = await installer.install(platform, engine, version)
await common.measure('Print Ruby version', async () =>
await exec.exec('ruby', ['--version']))
if (inputs['rubygems'] !== 'default') { if (inputs['rubygems'] !== 'default') {
await common.measure('Updating RubyGems', async () => await common.measure('Updating RubyGems', async () =>
rubygems.rubygemsUpdate(inputs['rubygems'], rubyPrefix)) rubygems.rubygemsUpdate(inputs['rubygems'], rubyPrefix))
@@ -74,16 +78,17 @@ export async function setupRuby(options = {}) {
await inputs['afterSetupPathHook']({ platform, rubyPrefix, engine, version }) await inputs['afterSetupPathHook']({ platform, rubyPrefix, engine, version })
} }
const [gemfile, lockFile] = bundler.detectGemfiles()
let bundlerVersion = "unknown"
if (inputs['bundler'] !== 'none') { if (inputs['bundler'] !== 'none') {
const [gemfile, lockFile] = bundler.detectGemfiles() bundlerVersion = await common.measure('Installing Bundler', async () =>
const bundlerVersion = await common.measure('Installing Bundler', async () =>
bundler.installBundler(inputs['bundler'], lockFile, platform, rubyPrefix, engine, version)) bundler.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 () =>
bundler.bundleInstall(gemfile, lockFile, platform, engine, version, bundlerVersion, inputs['cache-version'])) bundler.bundleInstall(gemfile, lockFile, platform, engine, version, bundlerVersion, inputs['cache-version']))
}
} }
core.setOutput('ruby-prefix', rubyPrefix) core.setOutput('ruby-prefix', rubyPrefix)
+57
View File
@@ -0,0 +1,57 @@
engine_input, version = ARGV.fetch(0).split('-', 2)
MATCH = case engine_input
when 'ruby', 'jruby'
/^\d+\.\d+\./
when 'truffleruby'
/^\d+\./
end
raise unless version[MATCH]
engines = [engine_input]
engines << 'truffleruby+graalvm' if engine_input == 'truffleruby'
engines.each do |engine|
puts engine
# Update ruby-builder-versions.json
file = "#{__dir__}/ruby-builder-versions.json"
lines = File.readlines(file, chomp: true)
from = lines.index { |line| line.include?(%{"#{engine}": [}) }
raise "Could not find start of #{engine}" unless from
to = from
to += 1 until lines[to].include?(']')
from += 1 # [
to -= 2 # head, ]
puts lines[from..to]
release_line = lines[from..to].find { |line|
v = line[/"([^"]+)"/, 1] and v[MATCH] == version[MATCH]
}
if release_line
append = " #{version.inspect},"
release_line << append unless release_line.end_with?(append)
else
lines.insert to+1, " #{version.inspect},"
end
File.write(file, lines.join("\n") + "\n")
# Update README.md
file = "#{__dir__}/README.md"
lines = File.readlines(file)
engine_line = lines.find { |line| line.start_with?("| `#{engine}`") }
engine_line.sub!(/(.+ (?:-|until)) (\d+(?:\.\d+)+)/) do
if Gem::Version.new(version) > Gem::Version.new($2)
"#{$1} #{version}"
else
$&
end
end
File.write(file, lines.join)
end
-36
View File
@@ -1,36 +0,0 @@
export function getVersions(platform) {
const versions = {
"ruby": [
"1.9.3-p551",
"2.0.0-p648",
"2.1.9",
"2.2.10",
"2.3.0", "2.3.1", "2.3.2", "2.3.3", "2.3.4", "2.3.5", "2.3.6", "2.3.7", "2.3.8",
"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.5.9",
"2.6.0", "2.6.1", "2.6.2", "2.6.3", "2.6.4", "2.6.5", "2.6.6", "2.6.7", "2.6.8", "2.6.9",
"2.7.0", "2.7.1", "2.7.2", "2.7.3", "2.7.4", "2.7.5",
"3.0.0-preview1", "3.0.0-preview2", "3.0.0-rc1", "3.0.0", "3.0.1", "3.0.2", "3.0.3",
"3.1.0-preview1", "3.1.0",
"head", "debug"
],
"jruby": [
"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.14.0", "9.2.15.0", "9.2.16.0", "9.2.17.0", "9.2.18.0", "9.2.19.0", "9.2.20.0", "9.2.20.1",
"9.3.0.0", "9.3.1.0", "9.3.2.0",
"head"
],
"truffleruby": [
"19.3.0", "19.3.1",
"20.0.0", "20.1.0", "20.2.0", "20.3.0",
"21.0.0", "21.1.0", "21.2.0", "21.2.0.1", "21.3.0",
"head"
],
"truffleruby+graalvm": [
"21.2.0", "21.3.0",
"head"
]
}
return versions
}
+34
View File
@@ -0,0 +1,34 @@
{
"ruby": [
"1.9.3-p551",
"2.0.0-p648",
"2.1.9",
"2.2.10",
"2.3.0", "2.3.1", "2.3.2", "2.3.3", "2.3.4", "2.3.5", "2.3.6", "2.3.7", "2.3.8",
"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.5.9",
"2.6.0", "2.6.1", "2.6.2", "2.6.3", "2.6.4", "2.6.5", "2.6.6", "2.6.7", "2.6.8", "2.6.9",
"2.7.0", "2.7.1", "2.7.2", "2.7.3", "2.7.4", "2.7.5",
"3.0.0-preview1", "3.0.0-preview2", "3.0.0-rc1", "3.0.0", "3.0.1", "3.0.2", "3.0.3",
"3.1.0-preview1", "3.1.0",
"head", "debug"
],
"jruby": [
"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.14.0", "9.2.15.0", "9.2.16.0", "9.2.17.0", "9.2.18.0", "9.2.19.0", "9.2.20.0", "9.2.20.1",
"9.3.0.0", "9.3.1.0", "9.3.2.0", "9.3.3.0",
"head"
],
"truffleruby": [
"19.3.0", "19.3.1",
"20.0.0", "20.1.0", "20.2.0", "20.3.0",
"21.0.0", "21.1.0", "21.2.0", "21.2.0.1", "21.3.0",
"22.0.0.2",
"head"
],
"truffleruby+graalvm": [
"21.2.0", "21.3.0",
"22.0.0.2",
"head"
]
}
+1 -1
View File
@@ -13,7 +13,7 @@ const releasesURL = 'https://github.com/ruby/ruby-builder/releases'
const windows = common.windows const windows = common.windows
export function getAvailableVersions(platform, engine) { export function getAvailableVersions(platform, engine) {
return rubyBuilderVersions.getVersions(platform)[engine] return rubyBuilderVersions[engine]
} }
export async function install(platform, engine, version) { export async function install(platform, engine, version) {
+3 -2
View File
@@ -1,5 +1,6 @@
hash = File.read('ruby-builder-versions.js')[/\bversions = {[^}]+}/] require 'json'
versions = eval hash hash = File.read('ruby-builder-versions.json')
versions = JSON.load(hash).transform_keys(&:to_sym)
by_minor = versions[:ruby].group_by { |v| v[/^\d\.\d/] } by_minor = versions[:ruby].group_by { |v| v[/^\d\.\d/] }
@@ -1,4 +1,4 @@
export const versions = { {
"2.0.0": "https://github.com/oneclick/rubyinstaller/releases/download/ruby-2.0.0-p648/ruby-2.0.0-p648-x64-mingw32.7z", "2.0.0": "https://github.com/oneclick/rubyinstaller/releases/download/ruby-2.0.0-p648/ruby-2.0.0-p648-x64-mingw32.7z",
"2.1.9": "https://github.com/oneclick/rubyinstaller/releases/download/ruby-2.1.9/ruby-2.1.9-x64-mingw32.7z", "2.1.9": "https://github.com/oneclick/rubyinstaller/releases/download/ruby-2.1.9/ruby-2.1.9-x64-mingw32.7z",
"2.2.6": "https://github.com/oneclick/rubyinstaller/releases/download/ruby-2.2.6/ruby-2.2.6-x64-mingw32.7z", "2.2.6": "https://github.com/oneclick/rubyinstaller/releases/download/ruby-2.2.6/ruby-2.2.6-x64-mingw32.7z",
+1 -1
View File
@@ -9,7 +9,7 @@ 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')
const common = require('./common') const common = require('./common')
const rubyInstallerVersions = require('./windows-versions').versions const rubyInstallerVersions = require('./windows-versions.json')
const drive = common.drive const drive = common.drive