Compare commits

...
11 Commits
Author SHA1 Message Date
Benoit Daloze 93287a1fa8 Revert "Export BUNDLER_VERSION after installing Bundler"
* This reverts commit 3190662165.
* It causes other issues such as https://github.com/ruby/setup-ruby/issues/444
  due to creating additional global state.
* The use-case it solves is too niche to risk such issues,
  using `bundler-cache: true` avoids the problem.
* See https://github.com/ruby/setup-ruby/issues/444#issuecomment-1377723414
2023-01-10 20:17:22 +01:00
Benoit Daloze 3190662165 Export BUNDLER_VERSION after installing Bundler
* Fixes https://github.com/ruby/setup-ruby/issues/440
2023-01-06 12:50:46 +01:00
Benoit Daloze eb7f94ffae Consider Bundler pre and rc versions valid, just exclude .dev
* Fixes https://github.com/ruby/setup-ruby/issues/439
2023-01-06 12:49:10 +01:00
Benoit Daloze ad718faf7a Break long line in workflow 2022-12-30 15:59:58 +01:00
Benoit Daloze 09c10210cc Implement targetRubyVersion for TruffleRuby
* Fixes #433
2022-12-30 15:55:07 +01:00
Lars Kanis f78d71faf4 Add RubyInstaller-3.2.0-1 for Windows 2022-12-30 15:39:39 +01:00
MSP-Greg fe42d0e73b Windows - updates for using OpenSSL 3 in Ruby 3.2 & head 2022-12-30 14:40:10 +01:00
David Rodríguez 8a6667e214 Reenable fixed RubyGems test
Use the same Ruby as the previous test, since it's very related, but
use a newer RubyGems to force the upgrade case.
2022-12-26 13:56:15 +01:00
Piotr Murach 03b78bdda2 Fix automatic bundler installation on JRuby 9.2 2022-12-25 20:06:54 +01:00
David Rodríguez 5fe1a6694c Respect explicit user's choice 2022-12-25 19:28:37 +01:00
David Rodríguez bb3a0553d5 Bundler higher than ~> 2.4.0 will require Ruby 3.0 or later 2022-12-25 19:28:37 +01:00
6 changed files with 150 additions and 38 deletions
+21 -8
View File
@@ -18,7 +18,12 @@ jobs:
fail-fast: false fail-fast: false
matrix: matrix:
os: [ ubuntu-18.04, ubuntu-20.04, ubuntu-22.04, macos-10.15, macos-11, macos-12, windows-2019, windows-2022 ] os: [ ubuntu-18.04, ubuntu-20.04, ubuntu-22.04, macos-10.15, macos-11, macos-12, windows-2019, windows-2022 ]
ruby: [ '1.9', '2.0', '2.1', '2.2', '2.3', '2.4', '2.5', '2.6', '2.7', '3.0', '3.1', '3.2', ruby-head, jruby, jruby-head, truffleruby, truffleruby-head, truffleruby+graalvm, truffleruby+graalvm-head ] ruby: [
'1.9', '2.0', '2.1', '2.2', '2.3', '2.4', '2.5', '2.6', '2.7', '3.0', '3.1', '3.2', ruby-head,
jruby, jruby-head,
truffleruby, truffleruby-head,
truffleruby+graalvm, truffleruby+graalvm-head
]
include: include:
- { os: windows-2019, ruby: mingw } - { os: windows-2019, ruby: mingw }
- { os: windows-2019, ruby: mswin } - { os: windows-2019, ruby: mswin }
@@ -27,14 +32,12 @@ jobs:
- { os: windows-2022, ruby: ucrt } - { os: windows-2022, ruby: ucrt }
exclude: exclude:
- { os: windows-2019, ruby: '1.9' } - { os: windows-2019, ruby: '1.9' }
- { os: windows-2019, ruby: '3.2' }
- { 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: windows-2019, ruby: truffleruby+graalvm } - { os: windows-2019, ruby: truffleruby+graalvm }
- { os: windows-2019, ruby: truffleruby+graalvm-head } - { os: windows-2019, ruby: truffleruby+graalvm-head }
- { os: windows-2022, ruby: '1.9' } - { os: windows-2022, ruby: '1.9' }
- { os: windows-2022, ruby: '3.2' }
- { os: windows-2022, ruby: debug } - { os: windows-2022, ruby: debug }
- { os: windows-2022, ruby: truffleruby } - { os: windows-2022, ruby: truffleruby }
- { os: windows-2022, ruby: truffleruby-head } - { os: windows-2022, ruby: truffleruby-head }
@@ -186,17 +189,16 @@ jobs:
- run: gem --version | grep -F "3.3.3" - run: gem --version | grep -F "3.3.3"
testUseBundlerFromRubyGemsUpdate: testUseBundlerFromRubyGemsUpdate:
if: false # https://github.com/ruby/setup-ruby/issues/405
name: "Test rubygems: version uses the Bundler installed by the rubygems update" name: "Test rubygems: version uses the Bundler installed by the rubygems update"
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v3
- uses: ./ - uses: ./
with: with:
ruby-version: '2.2' ruby-version: '3.1.0'
rubygems: 2.7.11 rubygems: 3.4.0
- run: gem --version | grep -F "2.7.11" - run: gem --version | grep -F "3.4.0"
- run: bundle --version | grep -F "1.16.6" - run: bundle --version | grep -F "2.4.0"
testFixedBundlerVersionForOldRuby: testFixedBundlerVersionForOldRuby:
name: "Test bundler: 1.x for old Ruby" name: "Test bundler: 1.x for old Ruby"
@@ -242,6 +244,17 @@ jobs:
bundler: 2.2.3 bundler: 2.2.3
- run: bundle --version | grep -F "Bundler version 2.2.3" - run: bundle --version | grep -F "Bundler version 2.2.3"
testBundlerPre:
name: "Test with a Bundler pre/rc version"
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: ./
with:
ruby-version: '2.6'
bundler: 2.2.0.rc.2
- run: bundle --version | grep -F "Bundler version 2.2.0.rc.2"
testBundlerDev: testBundlerDev:
name: "Test BUNDLED WITH Bundler dev" name: "Test BUNDLED WITH Bundler dev"
runs-on: ubuntu-latest runs-on: ubuntu-latest
+20 -8
View File
@@ -6,7 +6,10 @@ const cache = require('@actions/cache')
const common = require('./common') const common = require('./common')
export const DEFAULT_CACHE_VERSION = '0' export const DEFAULT_CACHE_VERSION = '0'
export const BUNDLER_VERSION_REGEXP = /^\d+(?:\.\d+){0,2}$/
function isValidBundlerVersion(bundlerVersion) {
return /^\d+(?:\.\d+){0,2}/.test(bundlerVersion) && !bundlerVersion.endsWith('.dev')
}
// The returned gemfile is guaranteed to exist, the lockfile might not exist // The returned gemfile is guaranteed to exist, the lockfile might not exist
export function detectGemfiles() { export function detectGemfiles() {
@@ -33,7 +36,7 @@ function readBundledWithFromGemfileLock(lockFile) {
const nextLine = lines[bundledWithLine+1] const nextLine = lines[bundledWithLine+1]
if (nextLine) { if (nextLine) {
const bundlerVersion = nextLine.trim() const bundlerVersion = nextLine.trim()
if (BUNDLER_VERSION_REGEXP.test(bundlerVersion)) { if (isValidBundlerVersion(bundlerVersion)) {
console.log(`Using Bundler ${bundlerVersion} from ${lockFile} BUNDLED WITH ${bundlerVersion}`) console.log(`Using Bundler ${bundlerVersion} from ${lockFile} BUNDLED WITH ${bundlerVersion}`)
return bundlerVersion return bundlerVersion
} else { } else {
@@ -100,14 +103,13 @@ export async function installBundler(bundlerVersionInput, rubygemsInputSet, lock
bundlerVersion = '2' bundlerVersion = '2'
} }
if (BUNDLER_VERSION_REGEXP.test(bundlerVersion)) { if (isValidBundlerVersion(bundlerVersion)) {
// OK - input is a 1, 2, or 3 part version number // OK - input is a 1, 2, or 3 part version number
} else { } else {
throw new Error(`Cannot parse bundler input: ${bundlerVersion}`) throw new Error(`Cannot parse bundler input: ${bundlerVersion}`)
} }
// Use Bundler 1 when we know Bundler 2 does not work // Use Bundler 1 when we know Bundler 2 does not work
// Use Bundler 2.3 when we use Ruby 2.3.2-2.5
if (bundlerVersion.startsWith('2')) { if (bundlerVersion.startsWith('2')) {
if (engine === 'ruby' && floatVersion <= 2.2) { 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')
@@ -115,22 +117,32 @@ export async function installBundler(bundlerVersionInput, rubygemsInputSet, lock
} else if (engine === 'ruby' && /^2\.3\.[01]/.test(rubyVersion)) { } else if (engine === 'ruby' && /^2\.3\.[01]/.test(rubyVersion)) {
console.log('Ruby 2.3.0 and 2.3.1 have shipped with an old rubygems that only works with Bundler 1') console.log('Ruby 2.3.0 and 2.3.1 have shipped with an old rubygems that only works with Bundler 1')
bundlerVersion = '1' bundlerVersion = '1'
} else if (engine === 'ruby' && floatVersion <= 2.5) {
console.log('Ruby 2.3.2-2.5 only works with Bundler 2.3')
bundlerVersion = '2.3'
} else if (engine === 'jruby' && rubyVersion.startsWith('9.1')) { // JRuby 9.1 targets Ruby 2.3, treat it the same } else if (engine === 'jruby' && rubyVersion.startsWith('9.1')) { // JRuby 9.1 targets Ruby 2.3, treat it the same
console.log('JRuby 9.1 has a bug with Bundler 2 (https://github.com/ruby/setup-ruby/issues/108), using Bundler 1 instead on JRuby 9.1') console.log('JRuby 9.1 has a bug with Bundler 2 (https://github.com/ruby/setup-ruby/issues/108), using Bundler 1 instead on JRuby 9.1')
bundlerVersion = '1' bundlerVersion = '1'
} }
} }
const targetRubyVersion = common.targetRubyVersion(engine, rubyVersion)
// Use Bundler 2.3 when we use Ruby 2.3.2 - 2.5
// Use Bundler 2.4 when we use Ruby 2.6-2.7
if (bundlerVersion == '2') {
if (targetRubyVersion <= 2.5) { // < 2.3.2 already handled above
console.log('Ruby 2.3.2 - 2.5 only works with Bundler 2.3')
bundlerVersion = '2.3'
} else if (targetRubyVersion <= 2.7) {
console.log('Ruby 2.6-2.7 only works with Bundler 2.4')
bundlerVersion = '2.4'
}
}
const gem = path.join(rubyPrefix, 'bin', 'gem') const gem = path.join(rubyPrefix, 'bin', 'gem')
// Workaround for https://github.com/rubygems/rubygems/issues/5245 // Workaround for https://github.com/rubygems/rubygems/issues/5245
// and for https://github.com/oracle/truffleruby/issues/2780 // and for https://github.com/oracle/truffleruby/issues/2780
const force = ((platform.startsWith('windows-') && engine === 'ruby' && floatVersion >= 3.1) || (engine === 'truffleruby')) ? ['--force'] : [] const force = ((platform.startsWith('windows-') && engine === 'ruby' && floatVersion >= 3.1) || (engine === 'truffleruby')) ? ['--force'] : []
const versionParts = [...bundlerVersion.matchAll(/\d+/g)].length const versionParts = [...bundlerVersion.matchAll(/\d+/g)].length
const bundlerVersionConstraint = versionParts === 3 ? bundlerVersion : `~> ${bundlerVersion}.0` const bundlerVersionConstraint = versionParts >= 3 ? bundlerVersion : `~> ${bundlerVersion}.0`
await exec.exec(gem, ['install', 'bundler', ...force, '-v', bundlerVersionConstraint]) await exec.exec(gem, ['install', 'bundler', ...force, '-v', bundlerVersionConstraint])
+25
View File
@@ -95,6 +95,31 @@ export function isBundler2dot2Default(engine, rubyVersion) {
} }
} }
export function targetRubyVersion(engine, rubyVersion) {
const version = floatVersion(rubyVersion)
if (engine === 'ruby') {
return version
} else if (engine === 'jruby') {
if (version === 9.1) {
return 2.3
} else if (version === 9.2) {
return 2.5
} else if (version === 9.3) {
return 2.6
}
} else if (engine.startsWith('truffleruby')) {
if (version < 21.0) {
return 2.6
} else if (version < 22.0) {
return 2.7
} else if (version < 23.0) {
return 3.0
}
}
return 9.9 // unknown, assume recent
}
export function floatVersion(rubyVersion) { export function floatVersion(rubyVersion) {
const match = rubyVersion.match(/^\d+\.\d+/) const match = rubyVersion.match(/^\d+\.\d+/)
if (match) { if (match) {
Generated Vendored
+65 -16
View File
File diff suppressed because one or more lines are too long
+1
View File
@@ -51,6 +51,7 @@
"3.1.1": "https://github.com/oneclick/rubyinstaller2/releases/download/RubyInstaller-3.1.1-1/rubyinstaller-3.1.1-1-x64.7z", "3.1.1": "https://github.com/oneclick/rubyinstaller2/releases/download/RubyInstaller-3.1.1-1/rubyinstaller-3.1.1-1-x64.7z",
"3.1.2": "https://github.com/oneclick/rubyinstaller2/releases/download/RubyInstaller-3.1.2-1/rubyinstaller-3.1.2-1-x64.7z", "3.1.2": "https://github.com/oneclick/rubyinstaller2/releases/download/RubyInstaller-3.1.2-1/rubyinstaller-3.1.2-1-x64.7z",
"3.1.3": "https://github.com/oneclick/rubyinstaller2/releases/download/RubyInstaller-3.1.3-1/rubyinstaller-3.1.3-1-x64.7z", "3.1.3": "https://github.com/oneclick/rubyinstaller2/releases/download/RubyInstaller-3.1.3-1/rubyinstaller-3.1.3-1-x64.7z",
"3.2.0": "https://github.com/oneclick/rubyinstaller2/releases/download/RubyInstaller-3.2.0-1/rubyinstaller-3.2.0-1-x64.7z",
"head": "https://github.com/oneclick/rubyinstaller2/releases/download/rubyinstaller-head/rubyinstaller-head-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", "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", "mswin": "https://github.com/MSP-Greg/ruby-loco/releases/download/ruby-master/ruby-mswin.7z",
+18 -6
View File
@@ -1,6 +1,8 @@
// 7z arguments // 7z arguments
// -aoa overwrite existing, -bd disable progress indicator // -aoa overwrite existing, -bd disable progress indicator
// OpenSSL version detection is needed in installGCCTools and installJRubyTools
const fs = require('fs') const fs = require('fs')
const path = require('path') const path = require('path')
const cp = require('child_process') const cp = require('child_process')
@@ -80,7 +82,7 @@ export async function install(platform, engine, version) {
// windows 2016 and 2019 need ucrt64 installed, 2022 and future images need // windows 2016 and 2019 need ucrt64 installed, 2022 and future images need
// ucrt64 or mingw64 installed, depending on Ruby version // ucrt64 or mingw64 installed, depending on Ruby version
if (((msys2Type === 'ucrt64') || !hasMSYS2PreInstalled) && common.floatVersion(version) >= 2.4) { if (((msys2Type === 'ucrt64') || !hasMSYS2PreInstalled) && common.floatVersion(version) >= 2.4) {
await installGCCTools(msys2Type) await installGCCTools(msys2Type, version)
} }
if (version === 'mswin') { if (version === 'mswin') {
@@ -97,14 +99,23 @@ export async function install(platform, engine, version) {
// Actions windows-2022 image does not contain any mingw or ucrt build tools. Install tools for it, // Actions windows-2022 image does not contain any mingw or ucrt build tools. Install tools for it,
// and also install ucrt tools on earlier versions, which have msys2 and mingw tools preinstalled. // and also install ucrt tools on earlier versions, which have msys2 and mingw tools preinstalled.
async function installGCCTools(type) { async function installGCCTools(type, version) {
const downloadPath = await common.measure(`Downloading ${type} build tools`, async () => { // 2022-Dec ruby/msys2-gcc-pkgs now uses a suffix to delineate different archive versions.
let url = `${msys2GCCReleaseURI}/msys2-gcc-pkgs/${type}.7z` // At present, the only use is to indicate the included OpenSSL version.
// With no suffix, archives include OpenSSL 1.1.1, with a '-3.0' suffix, they include
// OpenSSL 3.0.x.
// Currently, OpenSSL 3 is used in Ruby 3.2 & 'head', both use a custom RubyInstaller2 package.
let suffix = ''
if ((version === 'head') || (!common.isHeadVersion(version) && common.floatVersion(version) >= 3.2)) {
suffix = '-3.0'
}
const downloadPath = await common.measure(`Downloading ${type}${suffix} build tools`, async () => {
let url = `${msys2GCCReleaseURI}/msys2-gcc-pkgs/${type}${suffix}.7z`
console.log(url) console.log(url)
return await tc.downloadTool(url) return await tc.downloadTool(url)
}) })
await common.measure(`Extracting ${type} build tools`, async () => await common.measure(`Extracting ${type}${suffix} build tools`, async () =>
exec.exec('7z', ['x', downloadPath, '-aoa', '-bd', `-o${msys2BasePath}`], { silent: true })) exec.exec('7z', ['x', downloadPath, '-aoa', '-bd', `-o${msys2BasePath}`], { silent: true }))
} }
@@ -129,7 +140,8 @@ async function installMSYS2Tools() {
// windows-2022 and later images // windows-2022 and later images
export async function installJRubyTools() { export async function installJRubyTools() {
await installMSYS2Tools() await installMSYS2Tools()
await installGCCTools('mingw64') // Will need to add OpenSSL version detection when JRuby uses OpenSSL 3.0 ?
await installGCCTools('mingw64', '2.7')
} }
// Install vcpkg files needed to build mswin Ruby // Install vcpkg files needed to build mswin Ruby