Compare commits

...
25 Commits
Author SHA1 Message Date
Benoit Daloze 8f312efe12 Fix typo 2022-01-13 19:47:00 +01:00
Benoit Daloze 26470672e5 Small cleanups 2022-01-13 19:40:03 +01:00
MSP-Greg fb94cfb62e yarn run package 2022-01-13 19:25:34 +01:00
MSP-Greg f51e04d8c5 package.json & yarn.lock - @vercel/ncc: 0.28.6 -> 0.31.1 2022-01-13 19:25:34 +01:00
MSP-Greg e9c1c1bf40 windows.js - add hasMSYS2PreInstalled constant 2022-01-13 19:25:34 +01:00
MSP-Greg 24d6deea38 Windows JRuby - install MinGW tools, typo 2022-01-13 19:25:34 +01:00
MSP-Greg 3b96304b91 windows.js - suggested changes 2022-01-13 19:25:34 +01:00
MSP-Greg 18485596cf Windows - Rename 3rd party OpenSSL SYSTEM32 dll's 2022-01-13 19:25:34 +01:00
MSP-Greg 70ec766ec5 Actions - add windows-2022 jobs 2022-01-13 19:25:34 +01:00
MSP-Greg ffd46bd1d2 Only install mingw or ucrt for new Rubies 2022-01-13 19:25:34 +01:00
MSP-Greg 480fe921a2 windows.js - update addVCVARSEnv to work with all windows images 2022-01-13 19:25:34 +01:00
MSP-Greg 4fbcf63963 Install MSYS2 tools before gcc tools, clear pacman database folder 2022-01-13 19:25:34 +01:00
MSP-Greg 66308367ad log output - all 'ing', align 2022-01-13 19:25:34 +01:00
MSP-Greg b0aab3e1cf Add ruby-loco ucrt build 2022-01-13 19:25:34 +01:00
MSP-GregandLars Kanis 23b44d8ec5 Use ridk enable to set MSYS2 ENV variables
Co-authored-by: Lars Kanis <lars@greiz-reinsdorf.de>
2022-01-13 19:25:34 +01:00
MSP-Greg 6cc535991c Actions - Add Windows-2022 with ruby-head & ruby-mingw 2022-01-13 19:25:34 +01:00
MSP-Greg 226c4cceaa Add Windows MSYS2 ucrt and Windows-2022 support 2022-01-13 19:25:34 +01:00
Benoit Daloze 4726835508 Try 'gem install --force bundler' on 3.1 Windows 2022-01-10 17:52:23 +01:00
Koichi ITO bee16c98fd Support Ruby 3.1.0 for Windows
Follow up to https://github.com/oneclick/rubyinstaller2/issues/255#issuecomment-1003266597.

This PR adds Ruby 3.1.0 to windows-version.js.
2022-01-10 17:52:23 +01:00
Benoit Daloze 168d6a54b4 Remove 2.5 from example as it is EOL 2021-12-26 19:21:10 +01:00
shmokmt f0971f0dd4 Add Ruby 3.1.0 2021-12-26 19:21:10 +01:00
Benoit Daloze 471466b54c Add JRuby 9.2.20.1 and 9.3.2.0 2021-12-07 11:22:34 +01:00
Benoit Daloze be0cc84c1b Add 2.6.9, 2.7.5 and 3.0.3 on Windows 2021-11-30 19:19:02 +01:00
aparna-ravindra e7eea4e63a using actions/cache version 1.0.8 2021-11-30 15:18:35 +01:00
Ryan Laughlin bb8200704b Update CONTRIBUTING.md 2021-11-26 17:35:31 +01:00
14 changed files with 399 additions and 98 deletions
+9 -3
View File
@@ -15,27 +15,33 @@ jobs:
strategy:
fail-fast: false
matrix:
os: [ ubuntu-18.04, ubuntu-20.04, macos-10.15, macos-11.0, windows-2016, windows-2019 ]
os: [ ubuntu-18.04, ubuntu-20.04, macos-10.15, macos-11.0, windows-2016, 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, ruby-head, jruby, jruby-head, truffleruby, truffleruby-head, truffleruby+graalvm, truffleruby+graalvm-head ]
include:
- { os: windows-2016, ruby: mingw }
- { os: windows-2019, ruby: mingw }
- { os: windows-2019, ruby: mswin }
- { os: windows-2022, ruby: mingw }
- { os: windows-2022, ruby: ucrt }
exclude:
- { os: windows-2016, ruby: 1.9 }
- { os: windows-2016, ruby: 3.1 }
- { os: windows-2016, ruby: debug }
- { os: windows-2016, ruby: truffleruby }
- { os: windows-2016, ruby: truffleruby-head }
- { os: windows-2016, ruby: truffleruby+graalvm }
- { os: windows-2016, ruby: truffleruby+graalvm-head }
- { os: windows-2019, ruby: 1.9 }
- { os: windows-2019, ruby: 3.1 }
- { os: windows-2019, ruby: debug }
- { os: windows-2019, ruby: truffleruby }
- { os: windows-2019, ruby: truffleruby-head }
- { os: windows-2019, ruby: truffleruby+graalvm }
- { os: windows-2019, ruby: truffleruby+graalvm-head }
- { os: windows-2022, ruby: 1.9 }
- { os: windows-2022, ruby: debug }
- { os: windows-2022, ruby: truffleruby }
- { os: windows-2022, ruby: truffleruby-head }
- { os: windows-2022, ruby: truffleruby+graalvm }
- { os: windows-2022, ruby: truffleruby+graalvm-head }
name: ${{ matrix.os }} ${{ matrix.ruby }}
runs-on: ${{ matrix.os }}
+1 -1
View File
@@ -22,4 +22,4 @@ $ cp pre-commit .git/hooks/pre-commit
## Adding a new Ruby version
Add the new version in `ruby-builder-versions.js` and update the README.
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.
+3 -3
View File
@@ -14,8 +14,8 @@ This action currently supports these versions of MRI, JRuby and TruffleRuby:
| Interpreter | Versions |
| ----------- | -------- |
| `ruby` | 1.9.3, 2.0.0, 2.1.9, 2.2, all versions from 2.3.0 until 3.1.0-preview1, head, debug, mingw, mswin |
| `jruby` | 9.1.17.0 - 9.3.1.0, head |
| `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 |
| `truffleruby` | 19.3.0 - 21.3.0, head |
| `truffleruby+graalvm` | 21.2.0 - 21.3.0, head |
@@ -86,7 +86,7 @@ jobs:
matrix:
os: [ubuntu-latest, macos-latest]
# Due to https://github.com/actions/runner/issues/849, we have to use quotes for '3.0'
ruby: [2.5, 2.6, 2.7, '3.0', head, jruby, jruby-head, truffleruby, truffleruby-head]
ruby: [2.6, 2.7, '3.0', 3.1, head, jruby, jruby-head, truffleruby, truffleruby-head]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v2
+3 -1
View File
@@ -91,7 +91,9 @@ export async function installBundler(bundlerVersionInput, lockFile, platform, ru
} else {
const gem = path.join(rubyPrefix, 'bin', 'gem')
const bundlerVersionConstraint = /^\d+\.\d+\.\d+/.test(bundlerVersion) ? bundlerVersion : `~> ${bundlerVersion}`
await exec.exec(gem, ['install', 'bundler', '-v', bundlerVersionConstraint])
// Workaround for https://github.com/rubygems/rubygems/issues/5245
const force = (platform.startsWith('windows-') && engine === 'ruby' && common.floatVersion(rubyVersion) >= 3.1) ? ['--force'] : []
await exec.exec(gem, ['install', 'bundler', ...force, '-v', bundlerVersionConstraint])
}
return bundlerVersion
+14 -2
View File
@@ -48,7 +48,7 @@ export async function measure(name, block) {
}
export function isHeadVersion(rubyVersion) {
return rubyVersion === 'head' || rubyVersion === 'debug' || rubyVersion === 'mingw' || rubyVersion === 'mswin'
return ['head', 'debug', 'mingw', 'mswin', 'ucrt'].includes(rubyVersion)
}
export function isStableVersion(rubyVersion) {
@@ -155,7 +155,15 @@ export function win2nix(path) {
return path.replace(/\\/g, '/').replace(/ /g, '\\ ')
}
// JRuby is installed after setupPath is called, so folder doesn't exist
function rubyIsUCRT(path) {
return !!(fs.existsSync(path) &&
fs.readdirSync(path, { withFileTypes: true }).find(dirent =>
dirent.isFile() && dirent.name.match(/^x64-ucrt-ruby\d{3}\.dll$/)))
}
export function setupPath(newPathEntries) {
let msys2Type = null
const envPath = windows ? 'Path' : 'PATH'
const originalPath = process.env[envPath].split(path.delimiter)
let cleanPath = originalPath.filter(entry => !/\bruby\b/i.test(entry))
@@ -176,8 +184,11 @@ export function setupPath(newPathEntries) {
// Then add new path entries using core.addPath()
let newPath
if (windows) {
// main Ruby dll determines whether mingw or ucrt build
msys2Type = rubyIsUCRT(newPathEntries[0]) ? 'ucrt64' : 'mingw64'
// 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']
const msys2 = [`C:\\msys64\\${msys2Type}\\bin`, 'C:\\msys64\\usr\\bin']
newPath = [...newPathEntries, ...msys2]
} else {
newPath = newPathEntries
@@ -189,4 +200,5 @@ export function setupPath(newPathEntries) {
core.endGroup()
core.addPath(newPath.join(path.delimiter))
return msys2Type
}
Generated Vendored
+213 -59
View File
@@ -105,7 +105,9 @@ async function installBundler(bundlerVersionInput, lockFile, platform, rubyPrefi
} else {
const gem = path.join(rubyPrefix, 'bin', 'gem')
const bundlerVersionConstraint = /^\d+\.\d+\.\d+/.test(bundlerVersion) ? bundlerVersion : `~> ${bundlerVersion}`
await exec.exec(gem, ['install', 'bundler', '-v', bundlerVersionConstraint])
// Workaround for https://github.com/rubygems/rubygems/issues/5245
const force = (platform.startsWith('windows-') && engine === 'ruby' && common.floatVersion(rubyVersion) >= 3.1) ? ['--force'] : []
await exec.exec(gem, ['install', 'bundler', ...force, '-v', bundlerVersionConstraint])
}
return bundlerVersion
@@ -294,7 +296,7 @@ async function measure(name, block) {
}
function isHeadVersion(rubyVersion) {
return rubyVersion === 'head' || rubyVersion === 'debug' || rubyVersion === 'mingw' || rubyVersion === 'mswin'
return ['head', 'debug', 'mingw', 'mswin', 'ucrt'].includes(rubyVersion)
}
function isStableVersion(rubyVersion) {
@@ -401,7 +403,15 @@ function win2nix(path) {
return path.replace(/\\/g, '/').replace(/ /g, '\\ ')
}
// JRuby is installed after setupPath is called, so folder doesn't exist
function rubyIsUCRT(path) {
return !!(fs.existsSync(path) &&
fs.readdirSync(path, { withFileTypes: true }).find(dirent =>
dirent.isFile() && dirent.name.match(/^x64-ucrt-ruby\d{3}\.dll$/)))
}
function setupPath(newPathEntries) {
let msys2Type = null
const envPath = windows ? 'Path' : 'PATH'
const originalPath = process.env[envPath].split(path.delimiter)
let cleanPath = originalPath.filter(entry => !/\bruby\b/i.test(entry))
@@ -422,8 +432,11 @@ function setupPath(newPathEntries) {
// Then add new path entries using core.addPath()
let newPath
if (windows) {
// main Ruby dll determines whether mingw or ucrt build
msys2Type = rubyIsUCRT(newPathEntries[0]) ? 'ucrt64' : 'mingw64'
// 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']
const msys2 = [`C:\\msys64\\${msys2Type}\\bin`, 'C:\\msys64\\usr\\bin']
newPath = [...newPathEntries, ...msys2]
} else {
newPath = newPathEntries
@@ -435,6 +448,7 @@ function setupPath(newPathEntries) {
core.endGroup()
core.addPath(newPath.join(path.delimiter))
return msys2Type
}
@@ -536,7 +550,7 @@ function restoreCache(paths, primaryKey, restoreKeys, options) {
if (core.isDebug()) {
yield tar_1.listTar(archivePath, compressionMethod);
}
const archiveFileSize = utils.getArchiveFileSizeIsBytes(archivePath);
const archiveFileSize = utils.getArchiveFileSizeInBytes(archivePath);
core.info(`Cache Size: ~${Math.round(archiveFileSize / (1024 * 1024))} MB (${archiveFileSize} B)`);
yield tar_1.extractTar(archivePath, compressionMethod);
core.info('Cache restored successfully');
@@ -581,18 +595,29 @@ function saveCache(paths, key, options) {
const archiveFolder = yield utils.createTempDirectory();
const archivePath = path.join(archiveFolder, utils.getCacheFileName(compressionMethod));
core.debug(`Archive Path: ${archivePath}`);
yield tar_1.createTar(archiveFolder, cachePaths, compressionMethod);
if (core.isDebug()) {
yield tar_1.listTar(archivePath, compressionMethod);
try {
yield tar_1.createTar(archiveFolder, cachePaths, compressionMethod);
if (core.isDebug()) {
yield tar_1.listTar(archivePath, compressionMethod);
}
const fileSizeLimit = 10 * 1024 * 1024 * 1024; // 10GB per repo limit
const archiveFileSize = utils.getArchiveFileSizeInBytes(archivePath);
core.debug(`File Size: ${archiveFileSize}`);
if (archiveFileSize > fileSizeLimit) {
throw new Error(`Cache size of ~${Math.round(archiveFileSize / (1024 * 1024))} MB (${archiveFileSize} B) is over the 10GB limit, not saving cache.`);
}
core.debug(`Saving Cache (ID: ${cacheId})`);
yield cacheHttpClient.saveCache(cacheId, archivePath, options);
}
const fileSizeLimit = 5 * 1024 * 1024 * 1024; // 5GB per repo limit
const archiveFileSize = utils.getArchiveFileSizeIsBytes(archivePath);
core.debug(`File Size: ${archiveFileSize}`);
if (archiveFileSize > fileSizeLimit) {
throw new Error(`Cache size of ~${Math.round(archiveFileSize / (1024 * 1024))} MB (${archiveFileSize} B) is over the 5GB limit, not saving cache.`);
finally {
// Try to delete the archive to save space
try {
yield utils.unlinkFile(archivePath);
}
catch (error) {
core.debug(`Failed to delete archive: ${error}`);
}
}
core.debug(`Saving Cache (ID: ${cacheId})`);
yield cacheHttpClient.saveCache(cacheId, archivePath, options);
return cacheId;
});
}
@@ -760,7 +785,7 @@ function uploadChunk(httpClient, resourceUrl, openStream, start, end) {
function uploadFile(httpClient, cacheId, archivePath, options) {
return __awaiter(this, void 0, void 0, function* () {
// Upload Chunks
const fileSize = fs.statSync(archivePath).size;
const fileSize = utils.getArchiveFileSizeInBytes(archivePath);
const resourceUrl = getCacheApiUrl(`caches/${cacheId.toString()}`);
const fd = fs.openSync(archivePath, 'r');
const uploadOptions = options_1.getUploadOptions(options);
@@ -810,7 +835,7 @@ function saveCache(cacheId, archivePath, options) {
yield uploadFile(httpClient, cacheId, archivePath, options);
// Commit Cache
core.debug('Commiting cache');
const cacheSize = utils.getArchiveFileSizeIsBytes(archivePath);
const cacheSize = utils.getArchiveFileSizeInBytes(archivePath);
core.info(`Cache Size: ~${Math.round(cacheSize / (1024 * 1024))} MB (${cacheSize} B)`);
const commitCacheResponse = yield commitCache(httpClient, cacheId, cacheSize);
if (!requestUtils_1.isSuccessStatusCode(commitCacheResponse.statusCode)) {
@@ -890,10 +915,10 @@ function createTempDirectory() {
});
}
exports.createTempDirectory = createTempDirectory;
function getArchiveFileSizeIsBytes(filePath) {
function getArchiveFileSizeInBytes(filePath) {
return fs.statSync(filePath).size;
}
exports.getArchiveFileSizeIsBytes = getArchiveFileSizeIsBytes;
exports.getArchiveFileSizeInBytes = getArchiveFileSizeInBytes;
function resolvePaths(patterns) {
var e_1, _a;
var _b;
@@ -1198,7 +1223,7 @@ function downloadCacheHttpClient(archiveLocation, archivePath) {
const contentLengthHeader = downloadResponse.message.headers['content-length'];
if (contentLengthHeader) {
const expectedLength = parseInt(contentLengthHeader);
const actualLength = utils.getArchiveFileSizeIsBytes(archivePath);
const actualLength = utils.getArchiveFileSizeInBytes(archivePath);
if (actualLength !== expectedLength) {
throw new Error(`Incomplete download. Expected file size: ${expectedLength}, actual file size: ${actualLength}`);
}
@@ -58777,13 +58802,13 @@ function getVersions(platform) {
"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-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.3.0.0", "9.3.1.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": [
@@ -58894,7 +58919,7 @@ async function downloadAndExtract(platform, engine, version, rubyPrefix) {
return await tc.downloadTool(url)
})
await common.measure('Extracting Ruby', async () => {
await common.measure('Extracting Ruby', async () => {
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(parentDir), '-f', common.win2nix(downloadPath)])
@@ -58970,17 +58995,22 @@ const versions = {
"2.6.6": "https://github.com/oneclick/rubyinstaller2/releases/download/RubyInstaller-2.6.6-2/rubyinstaller-2.6.6-2-x64.7z",
"2.6.7": "https://github.com/oneclick/rubyinstaller2/releases/download/RubyInstaller-2.6.7-1/rubyinstaller-2.6.7-1-x64.7z",
"2.6.8": "https://github.com/oneclick/rubyinstaller2/releases/download/RubyInstaller-2.6.8-1/rubyinstaller-2.6.8-1-x64.7z",
"2.6.9": "https://github.com/oneclick/rubyinstaller2/releases/download/RubyInstaller-2.6.9-1/rubyinstaller-2.6.9-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",
"2.7.3": "https://github.com/oneclick/rubyinstaller2/releases/download/RubyInstaller-2.7.3-1/rubyinstaller-2.7.3-1-x64.7z",
"2.7.4": "https://github.com/oneclick/rubyinstaller2/releases/download/RubyInstaller-2.7.4-1/rubyinstaller-2.7.4-1-x64.7z",
"2.7.5": "https://github.com/oneclick/rubyinstaller2/releases/download/RubyInstaller-2.7.5-1/rubyinstaller-2.7.5-1-x64.7z",
"3.0.0": "https://github.com/oneclick/rubyinstaller2/releases/download/RubyInstaller-3.0.0-1/rubyinstaller-3.0.0-1-x64.7z",
"3.0.1": "https://github.com/oneclick/rubyinstaller2/releases/download/RubyInstaller-3.0.1-1/rubyinstaller-3.0.1-1-x64.7z",
"3.0.2": "https://github.com/oneclick/rubyinstaller2/releases/download/RubyInstaller-3.0.2-1/rubyinstaller-3.0.2-1-x64.7z",
"3.0.3": "https://github.com/oneclick/rubyinstaller2/releases/download/RubyInstaller-3.0.3-1/rubyinstaller-3.0.3-1-x64.7z",
"3.1.0": "https://github.com/oneclick/rubyinstaller2/releases/download/RubyInstaller-3.1.0-1/rubyinstaller-3.1.0-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"
"mswin": "https://github.com/MSP-Greg/ruby-loco/releases/download/ruby-master/ruby-mswin.7z",
"ucrt": "https://github.com/MSP-Greg/ruby-loco/releases/download/ruby-master/ruby-ucrt.7z"
}
@@ -58994,6 +59024,7 @@ __nccwpck_require__.r(__webpack_exports__);
/* harmony export */ __nccwpck_require__.d(__webpack_exports__, {
/* harmony export */ "getAvailableVersions": () => (/* binding */ getAvailableVersions),
/* harmony export */ "install": () => (/* binding */ install),
/* harmony export */ "installJRubyTools": () => (/* binding */ installJRubyTools),
/* harmony export */ "addVCVARSEnv": () => (/* binding */ addVCVARSEnv)
/* harmony export */ });
// Most of this logic is from
@@ -59011,12 +59042,16 @@ const rubyInstallerVersions = __nccwpck_require__(7223)/* .versions */ .d
const drive = common.drive
const msys2BasePath = 'C:\\msys64'
// needed for 2.0-2.3, and mswin, cert file used by Git for Windows
const certFile = 'C:\\Program Files\\Git\\mingw64\\ssl\\cert.pem'
// location & path for old RubyInstaller DevKit (MSYS), Ruby 2.0-2.3
const msys = `${drive}:\\DevKit64`
const msysPathEntries = [`${msys}\\mingw\\x86_64-w64-mingw32\\bin`, `${msys}\\mingw\\bin`, `${msys}\\bin`]
// location & path for old RubyInstaller DevKit (MSYS1), Ruby 2.0-2.3
const msys1 = `${drive}:\\DevKit64`
const msysPathEntries = [`${msys1}\\mingw\\x86_64-w64-mingw32\\bin`, `${msys1}\\mingw\\bin`, `${msys1}\\bin`]
const virtualEnv = common.getVirtualEnvironmentName()
function getAvailableVersions(platform, engine) {
if (engine === 'ruby') {
@@ -59029,6 +59064,10 @@ function getAvailableVersions(platform, engine) {
async function install(platform, engine, version) {
const url = rubyInstallerVersions[version]
// The windows-2016 and windows-2019 images have MSYS2 build tools (C:/msys64/usr)
// and MinGW build tools installed. The windows-2022 image has neither.
const hasMSYS2PreInstalled = ['windows-2019', 'windows-2016'].includes(virtualEnv)
if (!url.endsWith('.7z')) {
throw new Error(`URL should end in .7z: ${url}`)
}
@@ -59048,15 +59087,71 @@ async function install(platform, engine, version) {
let toolchainPaths = (version === 'mswin') ? await setupMSWin() : await setupMingw(version)
common.setupPath([`${rubyPrefix}\\bin`, ...toolchainPaths])
if (!inToolCache) {
await downloadAndExtract(engine, version, url, base, rubyPrefix);
}
const msys2Type = common.setupPath([`${rubyPrefix}\\bin`, ...toolchainPaths])
// install msys2 tools for all Ruby versions, only install mingw or ucrt for Rubies >= 2.4
if (!hasMSYS2PreInstalled) {
await installMSYS2Tools()
}
// windows 2016 and 2019 need ucrt64 installed, 2022 and future images need
// ucrt64 or mingw64 installed, depending on Ruby version
if (((msys2Type === 'ucrt64') || !hasMSYS2PreInstalled) && common.floatVersion(version) >= 2.4) {
await installGCCTools(msys2Type)
}
const ridk = `${rubyPrefix}\\bin\\ridk.cmd`
if (fs.existsSync(ridk)) {
await common.measure('Adding ridk env variables', async () => addRidkEnv(ridk))
}
return rubyPrefix
}
// 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.
async function installGCCTools(type) {
const downloadPath = await common.measure(`Downloading ${type} build tools`, async () => {
let url = `https://github.com/MSP-Greg/setup-msys2-gcc/releases/download/msys2-gcc-pkgs/${type}.7z`
console.log(url)
return await tc.downloadTool(url)
})
await common.measure(`Extracting ${type} build tools`, async () =>
// -aoa overwrite existing, -bd disable progress indicator
exec.exec('7z', ['x', downloadPath, '-aoa', '-bd', `-o${msys2BasePath}`], { silent: true }))
}
// Actions windows-2022 image does not contain any MSYS2 build tools. Install tools for it.
// A subset of the MSYS2 base-devel group
async function installMSYS2Tools() {
const downloadPath = await common.measure(`Downloading msys2 build tools`, async () => {
let url = `https://github.com/MSP-Greg/setup-msys2-gcc/releases/download/msys2-gcc-pkgs/msys2.7z`
console.log(url)
return await tc.downloadTool(url)
})
// need to remove all directories, since they may indicate old packages are installed,
// otherwise, error of "error: duplicated database entry"
fs.rmdirSync(`${msys2BasePath}\\var\\lib\\pacman\\local`, { recursive: true, force: true })
await common.measure(`Extracting msys2 build tools`, async () =>
// -aoa overwrite existing, -bd disable progress indicator
exec.exec('7z', ['x', downloadPath, '-aoa', '-bd', `-o${msys2BasePath}`], { silent: true }))
}
// Windows JRuby can install gems that require compile tools, only needed for
// windows-2022 and later images
async function installJRubyTools() {
await installMSYS2Tools()
await installGCCTools('mingw64')
}
async function downloadAndExtract(engine, version, url, base, rubyPrefix) {
const parentDir = path.dirname(rubyPrefix)
@@ -59065,8 +59160,9 @@ async function downloadAndExtract(engine, version, url, base, rubyPrefix) {
return await tc.downloadTool(url)
})
await common.measure('Extracting Ruby', async () =>
exec.exec('7z', ['x', downloadPath, `-xr!${base}\\share\\doc`, `-o${parentDir}`], { silent: true }))
await common.measure('Extracting Ruby', async () =>
// -bd disable progress indicator, -xr extract but exclude share\doc files
exec.exec('7z', ['x', downloadPath, '-bd', `-xr!${base}\\share\\doc`, `-o${parentDir}`], { silent: true }))
if (base !== path.basename(rubyPrefix)) {
await io.mv(path.join(parentDir, base), rubyPrefix)
@@ -59080,23 +59176,29 @@ async function downloadAndExtract(engine, version, url, base, rubyPrefix) {
async function setupMingw(version) {
core.exportVariable('MAKE', 'make.exe')
// rename these to avoid confusion when Ruby is using OpenSSL 1.0.2.
// most current extconf files look for 1.1.x dll files first, which is the version of the renamed files
if (common.floatVersion(version) <= 2.4) {
renameSystem32Dlls()
}
if (common.floatVersion(version) <= 2.3) {
core.exportVariable('SSL_CERT_FILE', certFile)
await common.measure('Installing MSYS', async () => installMSYS(version))
await common.measure('Installing MSYS1', async () => installMSYS1(version))
return msysPathEntries
} else {
return []
}
}
// Ruby 2.0, 2.1, 2.2 and 2.3
async function installMSYS(version) {
// Ruby 2.0-2.3
async function installMSYS1(version) {
const url = 'https://github.com/oneclick/rubyinstaller/releases/download/devkit-4.7.2/DevKit-mingw64-64-4.7.2-20130224-1432-sfx.exe'
const downloadPath = await tc.downloadTool(url)
await exec.exec('7z', ['x', downloadPath, `-o${msys}`], { silent: true })
await exec.exec('7z', ['x', downloadPath, `-o${msys1}`], { silent: true })
// below are set in the old devkit.rb file ?
core.exportVariable('RI_DEVKIT', msys)
core.exportVariable('RI_DEVKIT', msys1)
core.exportVariable('CC' , 'gcc')
core.exportVariable('CXX', 'g++')
core.exportVariable('CPP', 'cpp')
@@ -59124,9 +59226,22 @@ async function setupMSWin() {
/* Sets MSVC environment for use in Actions
* allows steps to run without running vcvars*.bat, also for PowerShell
* adds a convenience VCVARS environment variable
* this assumes a single Visual Studio version being available in the windows-latest image */
* this assumes a single Visual Studio version being available in the Windows images */
function addVCVARSEnv() {
const vcVars = '"C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Enterprise\\VC\\Auxiliary\\Build\\vcvars64.bat"'
let vcVars = ''
switch (virtualEnv) {
case 'windows-2016':
vcVars = '"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Enterprise\\VC\\Auxiliary\\Build\\vcvars64.bat"'
break
case 'windows-2019':
vcVars = '"C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Enterprise\\VC\\Auxiliary\\Build\\vcvars64.bat"'
break
case 'windows-2022':
vcVars = '"C:\\Program Files\\Microsoft Visual Studio\\2022\\Enterprise\\VC\\Auxiliary\\Build\\vcvars64.bat"'
break
default:
throw new Error(`Unknown Windows Image: ${virtualEnv}`)
}
core.exportVariable('VCVARS', vcVars)
let newEnv = new Map()
@@ -59152,6 +59267,36 @@ function addVCVARSEnv() {
return newPathEntries
}
// ssl files cause issues with non RI2 Rubies (<2.4) and ruby/ruby's CI from build folder due to dll resolution
function renameSystem32Dlls() {
const sys32 = 'C:\\Windows\\System32\\'
const badFiles = [`${sys32}libcrypto-1_1-x64.dll`, `${sys32}libssl-1_1-x64.dll`]
const existing = badFiles.filter((dll) => fs.existsSync(dll))
console.log(`Renaming ${existing.join(' and ')} to avoid dll resolution conflicts on Ruby <= 2.4`)
existing.forEach(dll => fs.renameSync(dll, `${dll}_`))
}
// Sets MSYS2 ENV variables set from running `ridk enable`
function addRidkEnv(ridk) {
let newEnv = new Map()
let cmd = `cmd.exe /c "${ridk} enable && set"`
let newSet = cp.execSync(cmd).toString().trim().split(/\r?\n/)
newSet = newSet.filter(line => /^\S+=\S+/.test(line))
newSet.forEach(s => {
let [k, v] = common.partition(s, '=')
newEnv.set(k, v)
})
for (let [k, v] of newEnv) {
if (process.env[k] !== v) {
if (!/^Path$/i.test(k)) {
console.log(`${k}=${v}`)
core.exportVariable(k, v)
}
}
}
}
/***/ }),
@@ -59183,7 +59328,7 @@ module.exports = JSON.parse('["ac","com.ac","edu.ac","gov.ac","net.ac","mil.ac",
/***/ ((module) => {
"use strict";
module.exports = require("assert");;
module.exports = require("assert");
/***/ }),
@@ -59191,7 +59336,7 @@ module.exports = require("assert");;
/***/ ((module) => {
"use strict";
module.exports = require("buffer");;
module.exports = require("buffer");
/***/ }),
@@ -59199,7 +59344,7 @@ module.exports = require("buffer");;
/***/ ((module) => {
"use strict";
module.exports = require("child_process");;
module.exports = require("child_process");
/***/ }),
@@ -59207,7 +59352,7 @@ module.exports = require("child_process");;
/***/ ((module) => {
"use strict";
module.exports = require("crypto");;
module.exports = require("crypto");
/***/ }),
@@ -59215,7 +59360,7 @@ module.exports = require("crypto");;
/***/ ((module) => {
"use strict";
module.exports = require("events");;
module.exports = require("events");
/***/ }),
@@ -59223,7 +59368,7 @@ module.exports = require("events");;
/***/ ((module) => {
"use strict";
module.exports = require("fs");;
module.exports = require("fs");
/***/ }),
@@ -59231,7 +59376,7 @@ module.exports = require("fs");;
/***/ ((module) => {
"use strict";
module.exports = require("http");;
module.exports = require("http");
/***/ }),
@@ -59239,7 +59384,7 @@ module.exports = require("http");;
/***/ ((module) => {
"use strict";
module.exports = require("https");;
module.exports = require("https");
/***/ }),
@@ -59247,7 +59392,7 @@ module.exports = require("https");;
/***/ ((module) => {
"use strict";
module.exports = require("net");;
module.exports = require("net");
/***/ }),
@@ -59255,7 +59400,7 @@ module.exports = require("net");;
/***/ ((module) => {
"use strict";
module.exports = require("os");;
module.exports = require("os");
/***/ }),
@@ -59263,7 +59408,7 @@ module.exports = require("os");;
/***/ ((module) => {
"use strict";
module.exports = require("path");;
module.exports = require("path");
/***/ }),
@@ -59271,7 +59416,7 @@ module.exports = require("path");;
/***/ ((module) => {
"use strict";
module.exports = require("perf_hooks");;
module.exports = require("perf_hooks");
/***/ }),
@@ -59279,7 +59424,7 @@ module.exports = require("perf_hooks");;
/***/ ((module) => {
"use strict";
module.exports = require("punycode");;
module.exports = require("punycode");
/***/ }),
@@ -59287,7 +59432,7 @@ module.exports = require("punycode");;
/***/ ((module) => {
"use strict";
module.exports = require("stream");;
module.exports = require("stream");
/***/ }),
@@ -59295,7 +59440,7 @@ module.exports = require("stream");;
/***/ ((module) => {
"use strict";
module.exports = require("string_decoder");;
module.exports = require("string_decoder");
/***/ }),
@@ -59303,7 +59448,7 @@ module.exports = require("string_decoder");;
/***/ ((module) => {
"use strict";
module.exports = require("timers");;
module.exports = require("timers");
/***/ }),
@@ -59311,7 +59456,7 @@ module.exports = require("timers");;
/***/ ((module) => {
"use strict";
module.exports = require("tls");;
module.exports = require("tls");
/***/ }),
@@ -59319,7 +59464,7 @@ module.exports = require("tls");;
/***/ ((module) => {
"use strict";
module.exports = require("url");;
module.exports = require("url");
/***/ }),
@@ -59327,7 +59472,7 @@ module.exports = require("url");;
/***/ ((module) => {
"use strict";
module.exports = require("util");;
module.exports = require("util");
/***/ }),
@@ -59335,7 +59480,7 @@ module.exports = require("util");;
/***/ ((module) => {
"use strict";
module.exports = require("zlib");;
module.exports = require("zlib");
/***/ })
@@ -59402,7 +59547,9 @@ module.exports = require("zlib");;
/******/
/******/ /* webpack/runtime/compat */
/******/
/******/ if (typeof __nccwpck_require__ !== 'undefined') __nccwpck_require__.ab = __dirname + "/";/************************************************************************/
/******/ if (typeof __nccwpck_require__ !== 'undefined') __nccwpck_require__.ab = __dirname + "/";
/******/
/************************************************************************/
var __webpack_exports__ = {};
// This entry need to be wrapped in an IIFE because it need to be in strict mode.
(() => {
@@ -59465,6 +59612,13 @@ async function setupRuby(options = {}) {
createGemRC(engine, version)
envPreInstall()
// JRuby can use compiled extension code, so make sure gcc exists.
// As of Jan-2022, JRuby compiles against msvcrt.
if (platform.startsWith('windows') && (engine === 'jruby') &&
!fs.existsSync('C:\\msys64\\mingw64\\bin\\gcc.exe')) {
await __nccwpck_require__(3216).installJRubyTools()
}
const rubyPrefix = await installer.install(platform, engine, version)
// When setup-ruby is used by other actions, this allows code in them to run
+1
View File
@@ -28,6 +28,7 @@ versions = entries.select { |entry|
versions['head'] = 'https://github.com/oneclick/rubyinstaller2/releases/download/rubyinstaller-head/rubyinstaller-head-x64.7z'
versions['mingw'] = 'https://github.com/MSP-Greg/ruby-loco/releases/download/ruby-master/ruby-mingw.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'
js = "export const versions = #{JSON.pretty_generate(versions)}\n"
File.binwrite 'windows-versions.js', js
+7
View File
@@ -51,6 +51,13 @@ export async function setupRuby(options = {}) {
createGemRC(engine, version)
envPreInstall()
// JRuby can use compiled extension code, so make sure gcc exists.
// As of Jan-2022, JRuby compiles against msvcrt.
if (platform.startsWith('windows') && (engine === 'jruby') &&
!fs.existsSync('C:\\msys64\\mingw64\\bin\\gcc.exe')) {
await require('./windows').installJRubyTools()
}
const rubyPrefix = await installer.install(platform, engine, version)
// When setup-ruby is used by other actions, this allows code in them to run
+2 -2
View File
@@ -22,13 +22,13 @@
},
"homepage": "https://github.com/ruby/setup-ruby",
"dependencies": {
"@actions/cache": "^1.0.7",
"@actions/cache": "^1.0.8",
"@actions/core": "^1.4.0",
"@actions/exec": "^1.1.0",
"@actions/io": "^1.1.1",
"@actions/tool-cache": "^1.7.1"
},
"devDependencies": {
"@vercel/ncc": "^0.28.6"
"@vercel/ncc": "^0.31.1"
}
}
+3 -3
View File
@@ -11,13 +11,13 @@ export function getVersions(platform) {
"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-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.3.0.0", "9.3.1.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": [
+1 -1
View File
@@ -79,7 +79,7 @@ async function downloadAndExtract(platform, engine, version, rubyPrefix) {
return await tc.downloadTool(url)
})
await common.measure('Extracting Ruby', async () => {
await common.measure('Extracting Ruby', async () => {
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(parentDir), '-f', common.win2nix(downloadPath)])
+6 -1
View File
@@ -31,15 +31,20 @@ export const versions = {
"2.6.6": "https://github.com/oneclick/rubyinstaller2/releases/download/RubyInstaller-2.6.6-2/rubyinstaller-2.6.6-2-x64.7z",
"2.6.7": "https://github.com/oneclick/rubyinstaller2/releases/download/RubyInstaller-2.6.7-1/rubyinstaller-2.6.7-1-x64.7z",
"2.6.8": "https://github.com/oneclick/rubyinstaller2/releases/download/RubyInstaller-2.6.8-1/rubyinstaller-2.6.8-1-x64.7z",
"2.6.9": "https://github.com/oneclick/rubyinstaller2/releases/download/RubyInstaller-2.6.9-1/rubyinstaller-2.6.9-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",
"2.7.3": "https://github.com/oneclick/rubyinstaller2/releases/download/RubyInstaller-2.7.3-1/rubyinstaller-2.7.3-1-x64.7z",
"2.7.4": "https://github.com/oneclick/rubyinstaller2/releases/download/RubyInstaller-2.7.4-1/rubyinstaller-2.7.4-1-x64.7z",
"2.7.5": "https://github.com/oneclick/rubyinstaller2/releases/download/RubyInstaller-2.7.5-1/rubyinstaller-2.7.5-1-x64.7z",
"3.0.0": "https://github.com/oneclick/rubyinstaller2/releases/download/RubyInstaller-3.0.0-1/rubyinstaller-3.0.0-1-x64.7z",
"3.0.1": "https://github.com/oneclick/rubyinstaller2/releases/download/RubyInstaller-3.0.1-1/rubyinstaller-3.0.1-1-x64.7z",
"3.0.2": "https://github.com/oneclick/rubyinstaller2/releases/download/RubyInstaller-3.0.2-1/rubyinstaller-3.0.2-1-x64.7z",
"3.0.3": "https://github.com/oneclick/rubyinstaller2/releases/download/RubyInstaller-3.0.3-1/rubyinstaller-3.0.3-1-x64.7z",
"3.1.0": "https://github.com/oneclick/rubyinstaller2/releases/download/RubyInstaller-3.1.0-1/rubyinstaller-3.1.0-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"
"mswin": "https://github.com/MSP-Greg/ruby-loco/releases/download/ruby-master/ruby-mswin.7z",
"ucrt": "https://github.com/MSP-Greg/ruby-loco/releases/download/ruby-master/ruby-ucrt.7z"
}
+128 -14
View File
@@ -13,12 +13,16 @@ const rubyInstallerVersions = require('./windows-versions').versions
const drive = common.drive
const msys2BasePath = 'C:\\msys64'
// needed for 2.0-2.3, and mswin, cert file used by Git for Windows
const certFile = 'C:\\Program Files\\Git\\mingw64\\ssl\\cert.pem'
// location & path for old RubyInstaller DevKit (MSYS), Ruby 2.0-2.3
const msys = `${drive}:\\DevKit64`
const msysPathEntries = [`${msys}\\mingw\\x86_64-w64-mingw32\\bin`, `${msys}\\mingw\\bin`, `${msys}\\bin`]
// location & path for old RubyInstaller DevKit (MSYS1), Ruby 2.0-2.3
const msys1 = `${drive}:\\DevKit64`
const msysPathEntries = [`${msys1}\\mingw\\x86_64-w64-mingw32\\bin`, `${msys1}\\mingw\\bin`, `${msys1}\\bin`]
const virtualEnv = common.getVirtualEnvironmentName()
export function getAvailableVersions(platform, engine) {
if (engine === 'ruby') {
@@ -31,6 +35,10 @@ export function getAvailableVersions(platform, engine) {
export async function install(platform, engine, version) {
const url = rubyInstallerVersions[version]
// The windows-2016 and windows-2019 images have MSYS2 build tools (C:/msys64/usr)
// and MinGW build tools installed. The windows-2022 image has neither.
const hasMSYS2PreInstalled = ['windows-2019', 'windows-2016'].includes(virtualEnv)
if (!url.endsWith('.7z')) {
throw new Error(`URL should end in .7z: ${url}`)
}
@@ -50,15 +58,71 @@ export async function install(platform, engine, version) {
let toolchainPaths = (version === 'mswin') ? await setupMSWin() : await setupMingw(version)
common.setupPath([`${rubyPrefix}\\bin`, ...toolchainPaths])
if (!inToolCache) {
await downloadAndExtract(engine, version, url, base, rubyPrefix);
}
const msys2Type = common.setupPath([`${rubyPrefix}\\bin`, ...toolchainPaths])
// install msys2 tools for all Ruby versions, only install mingw or ucrt for Rubies >= 2.4
if (!hasMSYS2PreInstalled) {
await installMSYS2Tools()
}
// windows 2016 and 2019 need ucrt64 installed, 2022 and future images need
// ucrt64 or mingw64 installed, depending on Ruby version
if (((msys2Type === 'ucrt64') || !hasMSYS2PreInstalled) && common.floatVersion(version) >= 2.4) {
await installGCCTools(msys2Type)
}
const ridk = `${rubyPrefix}\\bin\\ridk.cmd`
if (fs.existsSync(ridk)) {
await common.measure('Adding ridk env variables', async () => addRidkEnv(ridk))
}
return rubyPrefix
}
// 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.
async function installGCCTools(type) {
const downloadPath = await common.measure(`Downloading ${type} build tools`, async () => {
let url = `https://github.com/MSP-Greg/setup-msys2-gcc/releases/download/msys2-gcc-pkgs/${type}.7z`
console.log(url)
return await tc.downloadTool(url)
})
await common.measure(`Extracting ${type} build tools`, async () =>
// -aoa overwrite existing, -bd disable progress indicator
exec.exec('7z', ['x', downloadPath, '-aoa', '-bd', `-o${msys2BasePath}`], { silent: true }))
}
// Actions windows-2022 image does not contain any MSYS2 build tools. Install tools for it.
// A subset of the MSYS2 base-devel group
async function installMSYS2Tools() {
const downloadPath = await common.measure(`Downloading msys2 build tools`, async () => {
let url = `https://github.com/MSP-Greg/setup-msys2-gcc/releases/download/msys2-gcc-pkgs/msys2.7z`
console.log(url)
return await tc.downloadTool(url)
})
// need to remove all directories, since they may indicate old packages are installed,
// otherwise, error of "error: duplicated database entry"
fs.rmdirSync(`${msys2BasePath}\\var\\lib\\pacman\\local`, { recursive: true, force: true })
await common.measure(`Extracting msys2 build tools`, async () =>
// -aoa overwrite existing, -bd disable progress indicator
exec.exec('7z', ['x', downloadPath, '-aoa', '-bd', `-o${msys2BasePath}`], { silent: true }))
}
// Windows JRuby can install gems that require compile tools, only needed for
// windows-2022 and later images
export async function installJRubyTools() {
await installMSYS2Tools()
await installGCCTools('mingw64')
}
async function downloadAndExtract(engine, version, url, base, rubyPrefix) {
const parentDir = path.dirname(rubyPrefix)
@@ -67,8 +131,9 @@ async function downloadAndExtract(engine, version, url, base, rubyPrefix) {
return await tc.downloadTool(url)
})
await common.measure('Extracting Ruby', async () =>
exec.exec('7z', ['x', downloadPath, `-xr!${base}\\share\\doc`, `-o${parentDir}`], { silent: true }))
await common.measure('Extracting Ruby', async () =>
// -bd disable progress indicator, -xr extract but exclude share\doc files
exec.exec('7z', ['x', downloadPath, '-bd', `-xr!${base}\\share\\doc`, `-o${parentDir}`], { silent: true }))
if (base !== path.basename(rubyPrefix)) {
await io.mv(path.join(parentDir, base), rubyPrefix)
@@ -82,23 +147,29 @@ async function downloadAndExtract(engine, version, url, base, rubyPrefix) {
async function setupMingw(version) {
core.exportVariable('MAKE', 'make.exe')
// rename these to avoid confusion when Ruby is using OpenSSL 1.0.2.
// most current extconf files look for 1.1.x dll files first, which is the version of the renamed files
if (common.floatVersion(version) <= 2.4) {
renameSystem32Dlls()
}
if (common.floatVersion(version) <= 2.3) {
core.exportVariable('SSL_CERT_FILE', certFile)
await common.measure('Installing MSYS', async () => installMSYS(version))
await common.measure('Installing MSYS1', async () => installMSYS1(version))
return msysPathEntries
} else {
return []
}
}
// Ruby 2.0, 2.1, 2.2 and 2.3
async function installMSYS(version) {
// Ruby 2.0-2.3
async function installMSYS1(version) {
const url = 'https://github.com/oneclick/rubyinstaller/releases/download/devkit-4.7.2/DevKit-mingw64-64-4.7.2-20130224-1432-sfx.exe'
const downloadPath = await tc.downloadTool(url)
await exec.exec('7z', ['x', downloadPath, `-o${msys}`], { silent: true })
await exec.exec('7z', ['x', downloadPath, `-o${msys1}`], { silent: true })
// below are set in the old devkit.rb file ?
core.exportVariable('RI_DEVKIT', msys)
core.exportVariable('RI_DEVKIT', msys1)
core.exportVariable('CC' , 'gcc')
core.exportVariable('CXX', 'g++')
core.exportVariable('CPP', 'cpp')
@@ -126,9 +197,22 @@ async function setupMSWin() {
/* Sets MSVC environment for use in Actions
* allows steps to run without running vcvars*.bat, also for PowerShell
* adds a convenience VCVARS environment variable
* this assumes a single Visual Studio version being available in the windows-latest image */
* this assumes a single Visual Studio version being available in the Windows images */
export function addVCVARSEnv() {
const vcVars = '"C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Enterprise\\VC\\Auxiliary\\Build\\vcvars64.bat"'
let vcVars = ''
switch (virtualEnv) {
case 'windows-2016':
vcVars = '"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Enterprise\\VC\\Auxiliary\\Build\\vcvars64.bat"'
break
case 'windows-2019':
vcVars = '"C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Enterprise\\VC\\Auxiliary\\Build\\vcvars64.bat"'
break
case 'windows-2022':
vcVars = '"C:\\Program Files\\Microsoft Visual Studio\\2022\\Enterprise\\VC\\Auxiliary\\Build\\vcvars64.bat"'
break
default:
throw new Error(`Unknown Windows Image: ${virtualEnv}`)
}
core.exportVariable('VCVARS', vcVars)
let newEnv = new Map()
@@ -153,3 +237,33 @@ export function addVCVARSEnv() {
}
return newPathEntries
}
// ssl files cause issues with non RI2 Rubies (<2.4) and ruby/ruby's CI from build folder due to dll resolution
function renameSystem32Dlls() {
const sys32 = 'C:\\Windows\\System32\\'
const badFiles = [`${sys32}libcrypto-1_1-x64.dll`, `${sys32}libssl-1_1-x64.dll`]
const existing = badFiles.filter((dll) => fs.existsSync(dll))
console.log(`Renaming ${existing.join(' and ')} to avoid dll resolution conflicts on Ruby <= 2.4`)
existing.forEach(dll => fs.renameSync(dll, `${dll}_`))
}
// Sets MSYS2 ENV variables set from running `ridk enable`
function addRidkEnv(ridk) {
let newEnv = new Map()
let cmd = `cmd.exe /c "${ridk} enable && set"`
let newSet = cp.execSync(cmd).toString().trim().split(/\r?\n/)
newSet = newSet.filter(line => /^\S+=\S+/.test(line))
newSet.forEach(s => {
let [k, v] = common.partition(s, '=')
newEnv.set(k, v)
})
for (let [k, v] of newEnv) {
if (process.env[k] !== v) {
if (!/^Path$/i.test(k)) {
console.log(`${k}=${v}`)
core.exportVariable(k, v)
}
}
}
}
Generated
+8 -8
View File
@@ -2,10 +2,10 @@
# yarn lockfile v1
"@actions/cache@^1.0.7":
version "1.0.7"
resolved "https://registry.yarnpkg.com/@actions/cache/-/cache-1.0.7.tgz#d80b0f5ac1e1ad48a5e77c39685100bd49b56b1c"
integrity sha512-MY69kxuubqUFq84pFlu8m6Poxl5sR/xyhpC4JEvno7Yg9ASYdGizEmKgt0m8ovewpYKf15UAOcSC0hzS+DuosA==
"@actions/cache@^1.0.8":
version "1.0.8"
resolved "https://registry.yarnpkg.com/@actions/cache/-/cache-1.0.8.tgz#426ad3a2127b35a4e21ad906e02202dc8b96663f"
integrity sha512-GWNNB67w93HGJRQXlsV56YqrdAuDoP3esK/mo5mzU8WoDCVjtQgJGsTdkYUX7brswtT7xnI30bWNo1WLKQ8FZQ==
dependencies:
"@actions/core" "^1.2.6"
"@actions/exec" "^1.0.1"
@@ -195,10 +195,10 @@
dependencies:
"@types/node" "*"
"@vercel/ncc@^0.28.6":
version "0.28.6"
resolved "https://registry.yarnpkg.com/@vercel/ncc/-/ncc-0.28.6.tgz#073c0ce8e0269210c0a9f180fb0bf949eecc20e0"
integrity sha512-t4BoSSuyK8BZaUE0gV18V6bkFs4st7baumtFGa50dv1tMu2GDBEBF8sUZaKBdKiL6DzJ2D2+XVCwYWWDcQOYdQ==
"@vercel/ncc@^0.31.1":
version "0.31.1"
resolved "https://registry.yarnpkg.com/@vercel/ncc/-/ncc-0.31.1.tgz#9346c7e59326f5eeac75c0286e47df94c2d6d8f7"
integrity sha512-g0FAxwdViI6UzsiVz5HssIHqjcPa1EHL6h+2dcJD893SoCJaGdqqgUF09xnMW6goWnnhbLvgiKlgJWrJa+7qYA==
abort-controller@^3.0.0:
version "3.0.0"