mirror of
https://github.com/ruby/setup-ruby.git
synced 2026-09-13 14:34:21 +02:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f302e4ff49 | ||
|
|
3065f0b392 | ||
|
|
cf617ba62d | ||
|
|
c96a8640af | ||
|
|
d359377deb | ||
|
|
4a1b0853ab | ||
|
|
c36d5afe85 | ||
|
|
8781aa98b4 | ||
|
|
578365d08b | ||
|
|
c3f0cb18af | ||
|
|
180e1d1f1c | ||
|
|
238b81ee64 | ||
|
|
8f312efe12 | ||
|
|
26470672e5 | ||
|
|
fb94cfb62e | ||
|
|
f51e04d8c5 | ||
|
|
e9c1c1bf40 | ||
|
|
24d6deea38 | ||
|
|
3b96304b91 | ||
|
|
18485596cf | ||
|
|
70ec766ec5 | ||
|
|
ffd46bd1d2 | ||
|
|
480fe921a2 | ||
|
|
4fbcf63963 | ||
|
|
66308367ad | ||
|
|
b0aab3e1cf | ||
|
|
23b44d8ec5 | ||
|
|
6cc535991c | ||
|
|
226c4cceaa | ||
|
|
4726835508 | ||
|
|
bee16c98fd | ||
|
|
168d6a54b4 | ||
|
|
f0971f0dd4 | ||
|
|
471466b54c | ||
|
|
be0cc84c1b | ||
|
|
e7eea4e63a | ||
|
|
bb8200704b | ||
|
|
cf1a6dd2d8 | ||
|
|
5b2e10fa5f | ||
|
|
313811148f | ||
|
|
74cfbf0614 | ||
|
|
f20f1eae72 | ||
|
|
330f7f5faa | ||
|
|
a2b2637a7c | ||
|
|
e5b2d1fb1e | ||
|
|
b00551441a | ||
|
|
f514fbcdac | ||
|
|
a6f2286594 | ||
|
|
c84889b9b9 | ||
|
|
ac03cb7d18 | ||
|
|
5e4f0a10bf | ||
|
|
57d46d78b7 | ||
|
|
7edf159e98 | ||
|
|
d9a8687ae9 | ||
|
|
ae9cb3b565 | ||
|
|
77d7ca9909 | ||
|
|
e08bf35edf | ||
|
|
0997e21bf3 | ||
|
|
0c7e9c4d53 | ||
|
|
ee30953387 | ||
|
|
a4630ae79b |
+55
-11
@@ -15,19 +15,26 @@ jobs:
|
|||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
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-2019, windows-2022 ]
|
||||||
ruby: [ '2.0', 2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7, '3.0', ruby-head, jruby, jruby-head, truffleruby, truffleruby-head ]
|
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:
|
include:
|
||||||
- { os: windows-2016, ruby: mingw }
|
|
||||||
- { os: windows-2019, ruby: mingw }
|
- { os: windows-2019, ruby: mingw }
|
||||||
- { os: windows-2019, ruby: mswin }
|
- { os: windows-2019, ruby: mswin }
|
||||||
|
- { os: windows-2022, ruby: mingw }
|
||||||
|
- { os: windows-2022, ruby: ucrt }
|
||||||
exclude:
|
exclude:
|
||||||
- { os: windows-2016, ruby: debug }
|
- { os: windows-2019, ruby: 1.9 }
|
||||||
- { os: windows-2016, ruby: truffleruby }
|
|
||||||
- { os: windows-2016, ruby: truffleruby-head }
|
|
||||||
- { 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-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 }}
|
name: ${{ matrix.os }} ${{ matrix.ruby }}
|
||||||
runs-on: ${{ matrix.os }}
|
runs-on: ${{ matrix.os }}
|
||||||
@@ -67,18 +74,22 @@ jobs:
|
|||||||
|
|
||||||
- name: Subprocess test
|
- name: Subprocess test
|
||||||
run: ruby test_subprocess.rb
|
run: ruby test_subprocess.rb
|
||||||
- name: OpenSSL version
|
- name: OpenSSL compiled version
|
||||||
|
run: ruby -ropenssl -e 'puts OpenSSL::OPENSSL_VERSION'
|
||||||
|
- name: OpenSSL loaded version
|
||||||
run: ruby -ropenssl -e 'puts OpenSSL::OPENSSL_LIBRARY_VERSION'
|
run: ruby -ropenssl -e 'puts OpenSSL::OPENSSL_LIBRARY_VERSION'
|
||||||
|
if: matrix.ruby != '1.9'
|
||||||
- name: OpenSSL test
|
- name: OpenSSL test
|
||||||
run: ruby -ropen-uri -e 'puts URI.send(:open, %{https://rubygems.org/}) { |f| f.read(1024) }'
|
run: ruby -ropen-uri -e 'puts URI.send(:open, %{https://rubygems.org/}) { |f| f.read(1024) }'
|
||||||
|
|
||||||
- run: gem env
|
- run: gem env
|
||||||
- name: C extension test
|
- name: C extension test
|
||||||
run: gem install json:2.2.0 --no-document
|
run: gem install json -v 2.2.0
|
||||||
- run: bundle --version
|
- run: bundle --version
|
||||||
# This step is redundant with `bundler-cache: true` but is there to check a redundant `bundle install` still works
|
# This step is redundant with `bundler-cache: true` but is there to check a redundant `bundle install` still works
|
||||||
- run: bundle install
|
- run: bundle install
|
||||||
- run: bundle exec rake --version
|
- run: bundle exec rake --version
|
||||||
|
- run: bundle exec rake
|
||||||
|
|
||||||
- name: which ruby, rake
|
- name: which ruby, rake
|
||||||
if: "!startsWith(matrix.os, 'windows')"
|
if: "!startsWith(matrix.os, 'windows')"
|
||||||
@@ -101,6 +112,39 @@ jobs:
|
|||||||
if: startsWith(matrix.os, 'windows') && startsWith(matrix.ruby, 'jruby')
|
if: startsWith(matrix.os, 'windows') && startsWith(matrix.ruby, 'jruby')
|
||||||
run: gem install sassc
|
run: gem install sassc
|
||||||
|
|
||||||
|
testLatestRubygemsVersion:
|
||||||
|
name: "Test rubygems input set to latest upgrades the default RubyGems version"
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
- uses: ./
|
||||||
|
with:
|
||||||
|
ruby-version: 2.6
|
||||||
|
rubygems: latest
|
||||||
|
- run: ruby -e "exit(Gem.rubygems_version > Gem::Version.new('3.0.3'))"
|
||||||
|
|
||||||
|
testFixedRubygemsVersionUpgrades:
|
||||||
|
name: "Test rubygems input set to a fixed version upgrades RubyGems to that version if the default is older"
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
- uses: ./
|
||||||
|
with:
|
||||||
|
ruby-version: 2.6
|
||||||
|
rubygems: 3.2.3
|
||||||
|
- run: gem --version | grep -F "3.2.3"
|
||||||
|
|
||||||
|
testFixedRubygemsVersionNoop:
|
||||||
|
name: "Test rubygems input set to a fixed version noops if the default is newer"
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
- uses: ./
|
||||||
|
with:
|
||||||
|
ruby-version: 3.1
|
||||||
|
rubygems: 3.2.3
|
||||||
|
- run: gem --version | grep -F "3.3.3"
|
||||||
|
|
||||||
testExactBundlerVersion:
|
testExactBundlerVersion:
|
||||||
name: "Test with an exact Bundler version"
|
name: "Test with an exact Bundler version"
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
@@ -116,7 +160,7 @@ jobs:
|
|||||||
name: "Test gemfile depending on Bundler 1"
|
name: "Test gemfile depending on Bundler 1"
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
env:
|
env:
|
||||||
BUNDLE_GEMFILE: gemfiles/bundler1.gemfile
|
BUNDLE_GEMFILE: ${{ github.workspace }}/gemfiles/bundler1.gemfile
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v2
|
||||||
- uses: ./
|
- uses: ./
|
||||||
@@ -134,7 +178,7 @@ jobs:
|
|||||||
name: "Test with ${{ matrix.gemfile }} gemfile"
|
name: "Test with ${{ matrix.gemfile }} gemfile"
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
env:
|
env:
|
||||||
BUNDLE_GEMFILE: gemfiles/${{ matrix.gemfile }}.gemfile
|
BUNDLE_GEMFILE: ${{ github.workspace }}/gemfiles/${{ matrix.gemfile }}.gemfile
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v2
|
||||||
- uses: ./
|
- uses: ./
|
||||||
@@ -147,7 +191,7 @@ jobs:
|
|||||||
name: "Test installing a Gemfile with nokogiri on TruffleRuby"
|
name: "Test installing a Gemfile with nokogiri on TruffleRuby"
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
env:
|
env:
|
||||||
BUNDLE_GEMFILE: gemfiles/nokogiri.gemfile
|
BUNDLE_GEMFILE: ${{ github.workspace }}/gemfiles/nokogiri.gemfile
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v2
|
||||||
- uses: ./
|
- uses: ./
|
||||||
|
|||||||
@@ -19,3 +19,9 @@ It is recommended to add this as a `git` `pre-commit` hook:
|
|||||||
```bash
|
```bash
|
||||||
$ cp pre-commit .git/hooks/pre-commit
|
$ cp pre-commit .git/hooks/pre-commit
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Adding a new Ruby version
|
||||||
|
|
||||||
|
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.
|
||||||
|
|||||||
@@ -14,9 +14,10 @@ This action currently supports these versions of MRI, JRuby and TruffleRuby:
|
|||||||
|
|
||||||
| Interpreter | Versions |
|
| Interpreter | Versions |
|
||||||
| ----------- | -------- |
|
| ----------- | -------- |
|
||||||
| `ruby` | 2.0.0, 2.1.9, 2.2, all versions from 2.3.0 until 3.0.2, 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.2.9.0 - 9.2.19.0, head |
|
| `jruby` | 9.1.17.0 - 9.3.2.0, head |
|
||||||
| `truffleruby` | 19.3.0 - 21.1.0, head |
|
| `truffleruby` | 19.3.0 - 21.3.0, head |
|
||||||
|
| `truffleruby+graalvm` | 21.2.0 - 21.3.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.
|
||||||
@@ -40,16 +41,17 @@ The action works for all [GitHub-hosted runners](https://help.github.com/en/acti
|
|||||||
| ----------- | -------- | -------- |
|
| ----------- | -------- | -------- |
|
||||||
| Ubuntu | `ubuntu-latest` (= `ubuntu-20.04`) | `ubuntu-18.04`, `ubuntu-16.04` |
|
| Ubuntu | `ubuntu-latest` (= `ubuntu-20.04`) | `ubuntu-18.04`, `ubuntu-16.04` |
|
||||||
| macOS | `macos-latest` (= `macos-10.15`) | `macos-11.0` |
|
| macOS | `macos-latest` (= `macos-10.15`) | `macos-11.0` |
|
||||||
| Windows | `windows-latest` (= `windows-2019`) | `windows-2016` |
|
| Windows | `windows-latest` (= `windows-2019`) | `windows-2022` |
|
||||||
|
|
||||||
The prebuilt releases are generated by [ruby-builder](https://github.com/ruby/ruby-builder)
|
The prebuilt releases are generated by [ruby-builder](https://github.com/ruby/ruby-builder)
|
||||||
and on Windows by [RubyInstaller2](https://github.com/oneclick/rubyinstaller2).
|
and on Windows by [RubyInstaller2](https://github.com/oneclick/rubyinstaller2).
|
||||||
`mingw` and `mswin` builds are generated by [ruby-loco](https://github.com/MSP-Greg/ruby-loco).
|
`mingw` and `mswin` builds are generated by [ruby-loco](https://github.com/MSP-Greg/ruby-loco).
|
||||||
`ruby-head` is generated by [ruby-dev-builder](https://github.com/ruby/ruby-dev-builder),
|
`ruby-head` is generated by [ruby-dev-builder](https://github.com/ruby/ruby-dev-builder),
|
||||||
`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),
|
||||||
and `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)
|
||||||
The full list of available Ruby versions can be seen in [ruby-builder-versions.js](ruby-builder-versions.js)
|
and `truffleruby+graalvm` is generated by [graalvm-ce-dev-builds](https://github.com/graalvm/graalvm-ce-dev-builds).
|
||||||
for Ubuntu and macOS and in [windows-versions.js](windows-versions.js) for Windows.
|
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.json](windows-versions.json) for Windows.
|
||||||
|
|
||||||
## Usage
|
## Usage
|
||||||
|
|
||||||
@@ -84,7 +86,7 @@ jobs:
|
|||||||
matrix:
|
matrix:
|
||||||
os: [ubuntu-latest, macos-latest]
|
os: [ubuntu-latest, macos-latest]
|
||||||
# Due to https://github.com/actions/runner/issues/849, we have to use quotes for '3.0'
|
# 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 }}
|
runs-on: ${{ matrix.os }}
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v2
|
||||||
@@ -108,7 +110,7 @@ jobs:
|
|||||||
gemfile: [ rails5, rails6 ]
|
gemfile: [ rails5, rails6 ]
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
env: # $BUNDLE_GEMFILE must be set at the job level, so it is set for all steps
|
env: # $BUNDLE_GEMFILE must be set at the job level, so it is set for all steps
|
||||||
BUNDLE_GEMFILE: gemfiles/${{ matrix.gemfile }}.gemfile
|
BUNDLE_GEMFILE: ${{ github.workspace }}/gemfiles/${{ matrix.gemfile }}.gemfile
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v2
|
||||||
- uses: ruby/setup-ruby@v1
|
- uses: ruby/setup-ruby@v1
|
||||||
@@ -137,6 +139,18 @@ and the [condition and expression syntax](https://help.github.com/en/actions/ref
|
|||||||
The `working-directory` input can be set to resolve `.ruby-version`, `.tool-versions` and `Gemfile.lock`
|
The `working-directory` input can be set to resolve `.ruby-version`, `.tool-versions` and `Gemfile.lock`
|
||||||
if they are not at the root of the repository, see [action.yml](action.yml) for details.
|
if they are not at the root of the repository, see [action.yml](action.yml) for details.
|
||||||
|
|
||||||
|
### RubyGems
|
||||||
|
|
||||||
|
By default, the default RubyGems version that comes with each Ruby is used.
|
||||||
|
However, users can optionally customize the RubyGems version that they want by
|
||||||
|
setting the `rubygems` input.
|
||||||
|
|
||||||
|
See [action.yml](action.yml) for more details about the `rubygems` input.
|
||||||
|
|
||||||
|
If you're running into `ArgumentError: wrong number of arguments (given 4,
|
||||||
|
expected 1)` errors with a stacktrace including Psych and RubyGems entries, you
|
||||||
|
should be able to fix them by setting `rubygems: 3.0.0` or higher.
|
||||||
|
|
||||||
### Bundler
|
### Bundler
|
||||||
|
|
||||||
By default, if there is a `Gemfile.lock` file (or `$BUNDLE_GEMFILE.lock` or `gems.locked`) 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,
|
||||||
@@ -205,6 +219,7 @@ So, please use `bundler-cache: true` instead and report any issue.
|
|||||||
Note that running CI on Windows can be quite challenging if you are not very familiar with Windows.
|
Note that running CI on Windows can be quite challenging if you are not very familiar with Windows.
|
||||||
It is recommended to first get your build working on Ubuntu and macOS before trying Windows.
|
It is recommended to first get your build working on Ubuntu and macOS before trying Windows.
|
||||||
|
|
||||||
|
* Use Bundler 2.2.18+ on Windows (older versions have [bugs](https://github.com/ruby/setup-ruby/issues/209#issuecomment-889064123)) by not setting the `bundler:` input and ensuring there is no `BUNDLED WITH 1.x.y` in a checked-in `Gemfile.lock`.
|
||||||
* The default shell on Windows is not Bash but [PowerShell](https://help.github.com/en/actions/automating-your-workflow-with-github-actions/workflow-syntax-for-github-actions#using-a-specific-shell).
|
* The default shell on Windows is not Bash but [PowerShell](https://help.github.com/en/actions/automating-your-workflow-with-github-actions/workflow-syntax-for-github-actions#using-a-specific-shell).
|
||||||
This can lead issues such as multi-line scripts [not working as expected](https://github.com/ruby/setup-ruby/issues/13).
|
This can lead issues such as multi-line scripts [not working as expected](https://github.com/ruby/setup-ruby/issues/13).
|
||||||
* The `PATH` contains [multiple compiler toolchains](https://github.com/ruby/setup-ruby/issues/19). Use `where.exe` to debug which tool is used.
|
* The `PATH` contains [multiple compiler toolchains](https://github.com/ruby/setup-ruby/issues/19). Use `where.exe` to debug which tool is used.
|
||||||
@@ -240,6 +255,8 @@ if the [virtual environment](https://github.com/actions/virtual-environments) is
|
|||||||
|
|
||||||
In other cases, please use a system Ruby or [install Ruby manually](https://github.com/postmodern/chruby/wiki#installing-rubies) instead.
|
In other cases, please use a system Ruby or [install Ruby manually](https://github.com/postmodern/chruby/wiki#installing-rubies) instead.
|
||||||
|
|
||||||
|
On a self-hosted runner you need to define the `ImageOs` as an evironment variable on the host, you can do this in the `~/actions-runner/.env` file (See [#230](https://github.com/ruby/setup-ruby/issues/230)).
|
||||||
|
|
||||||
## History
|
## History
|
||||||
|
|
||||||
This action used to be at `eregon/use-ruby-action` and was moved to the `ruby` organization.
|
This action used to be at `eregon/use-ruby-action` and was moved to the `ruby` organization.
|
||||||
|
|||||||
@@ -9,6 +9,13 @@ inputs:
|
|||||||
description: 'Engine and version to use, see the syntax in the README. Reads from .ruby-version or .tool-versions if unset.'
|
description: 'Engine and version to use, see the syntax in the README. Reads from .ruby-version or .tool-versions if unset.'
|
||||||
required: false
|
required: false
|
||||||
default: 'default'
|
default: 'default'
|
||||||
|
rubygems:
|
||||||
|
description: |
|
||||||
|
The version of RubyGems to use. Either 'default', 'latest', or a version number (e.g., 3.3.5).
|
||||||
|
For 'default', no action is taken and the version of RubyGems that comes with Ruby by default is used.
|
||||||
|
For 'latest', `gem update --system` is run to update to the latest RubyGems version.
|
||||||
|
Similarly, if a version number is given, `gem update --system <version>` is run to update to that version of RubyGems, as long as that version is newer than the one provided by default.
|
||||||
|
Defaults to 'default'.
|
||||||
bundler:
|
bundler:
|
||||||
description: |
|
description: |
|
||||||
The version of Bundler to install. Either 'none', 'latest', 'Gemfile.lock', or a version number (e.g., 1, 2, 2.1.4).
|
The version of Bundler to install. Either 'none', 'latest', 'Gemfile.lock', or a version number (e.g., 1, 2, 2.1.4).
|
||||||
|
|||||||
+27
-21
@@ -40,12 +40,12 @@ function readBundledWithFromGemfileLock(lockFile) {
|
|||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
|
|
||||||
async function afterLockFile(lockFile, platform, engine) {
|
async function afterLockFile(lockFile, platform, engine, rubyVersion) {
|
||||||
if (engine === 'truffleruby' && platform.startsWith('ubuntu-')) {
|
if (engine.startsWith('truffleruby') && common.floatVersion(rubyVersion) < 21.1 && platform.startsWith('ubuntu-')) {
|
||||||
const contents = fs.readFileSync(lockFile, 'utf8')
|
const contents = fs.readFileSync(lockFile, 'utf8')
|
||||||
if (contents.includes('nokogiri')) {
|
if (contents.includes('nokogiri')) {
|
||||||
await common.measure('Installing libxml2-dev libxslt-dev, required to install nokogiri on TruffleRuby', async () =>
|
await common.measure('Installing libxml2-dev libxslt-dev, required to install nokogiri on TruffleRuby < 21.1', async () =>
|
||||||
exec.exec('sudo', ['apt-get', '-yqq', 'install', 'libxml2-dev', 'libxslt-dev'], { silent: true }))
|
exec.exec('sudo', ['apt-get', '-yqq', 'install', 'libxml2-dev', 'libxslt-dev'], { silent: true }))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -71,10 +71,10 @@ 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' && rubyVersion.match(/^2\.[012]/)) {
|
if (engine === 'ruby' && common.floatVersion(rubyVersion) <= 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' && rubyVersion.match(/^2\.3\.[01]/)) {
|
} 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 === '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
|
||||||
@@ -86,12 +86,14 @@ export async function installBundler(bundlerVersionInput, lockFile, platform, ru
|
|||||||
// 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}`)
|
||||||
} else if (engine === 'truffleruby' && !common.isHeadVersion(rubyVersion) && bundlerVersion.startsWith('1')) {
|
} else if (engine.startsWith('truffleruby') && common.isBundler1Default(engine, rubyVersion) && bundlerVersion.startsWith('1')) {
|
||||||
console.log(`Using Bundler 1 shipped with ${engine}`)
|
console.log(`Using Bundler 1 shipped with ${engine}-${rubyVersion}`)
|
||||||
} else {
|
} else {
|
||||||
const gem = path.join(rubyPrefix, 'bin', 'gem')
|
const gem = path.join(rubyPrefix, 'bin', 'gem')
|
||||||
const bundlerVersionConstraint = bundlerVersion.match(/^\d+\.\d+\.\d+/) ? bundlerVersion : `~> ${bundlerVersion}`
|
const bundlerVersionConstraint = /^\d+\.\d+\.\d+/.test(bundlerVersion) ? bundlerVersion : `~> ${bundlerVersion}`
|
||||||
await exec.exec(gem, ['install', 'bundler', '-v', bundlerVersionConstraint, '--no-document'])
|
// 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
|
return bundlerVersion
|
||||||
@@ -126,7 +128,7 @@ export async function bundleInstall(gemfile, lockFile, platform, engine, rubyVer
|
|||||||
await exec.exec('bundle', ['lock'], envOptions)
|
await exec.exec('bundle', ['lock'], envOptions)
|
||||||
}
|
}
|
||||||
|
|
||||||
await afterLockFile(lockFile, platform, engine)
|
await afterLockFile(lockFile, platform, engine, rubyVersion)
|
||||||
|
|
||||||
// cache key
|
// cache key
|
||||||
const paths = [cachePath]
|
const paths = [cachePath]
|
||||||
@@ -183,17 +185,21 @@ async function computeBaseKey(platform, engine, version, lockFile, cacheVersion)
|
|||||||
const cacheVersionSuffix = DEFAULT_CACHE_VERSION === cacheVersion ? '' : `-cachever:${cacheVersion}`
|
const cacheVersionSuffix = DEFAULT_CACHE_VERSION === cacheVersion ? '' : `-cachever:${cacheVersion}`
|
||||||
let key = `setup-ruby-bundler-cache-v3-${platform}-${engine}-${version}${cacheVersionSuffix}`
|
let key = `setup-ruby-bundler-cache-v3-${platform}-${engine}-${version}${cacheVersionSuffix}`
|
||||||
|
|
||||||
if (engine !== 'jruby' && common.isHeadVersion(version)) {
|
if (common.isHeadVersion(version)) {
|
||||||
let revision = '';
|
if (engine !== 'jruby') {
|
||||||
await exec.exec('ruby', ['-e', 'print RUBY_REVISION'], {
|
// CRuby dev versions do not change the ABI version when the ABI changes, so use the commit as the ABI version
|
||||||
silent: true,
|
let print_abi = engine === 'ruby' ? 'print RUBY_REVISION' : "print RbConfig::CONFIG['ruby_version']"
|
||||||
listeners: {
|
let abi = ''
|
||||||
stdout: (data) => {
|
await exec.exec('ruby', ['-e', print_abi], {
|
||||||
revision += data.toString();
|
silent: true,
|
||||||
|
listeners: {
|
||||||
|
stdout: (data) => {
|
||||||
|
abi += data.toString();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
});
|
||||||
});
|
key += `-ABI-${abi}`
|
||||||
key += `-revision-${revision}`
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
key += `-${lockFile}`
|
key += `-${lockFile}`
|
||||||
|
|||||||
@@ -48,20 +48,24 @@ export async function measure(name, block) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export function isHeadVersion(rubyVersion) {
|
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) {
|
export function isStableVersion(rubyVersion) {
|
||||||
return /^\d+(\.\d+)*$/.test(rubyVersion)
|
return /^\d+(\.\d+)*$/.test(rubyVersion)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function isBundler1Default(engine, rubyVersion) {
|
||||||
|
return !isBundler2Default(engine, rubyVersion)
|
||||||
|
}
|
||||||
|
|
||||||
export function isBundler2Default(engine, rubyVersion) {
|
export function isBundler2Default(engine, rubyVersion) {
|
||||||
if (engine === 'ruby') {
|
if (engine === 'ruby') {
|
||||||
return isHeadVersion(rubyVersion) || floatVersion(rubyVersion) >= 2.7
|
return floatVersion(rubyVersion) >= 2.7
|
||||||
} else if (engine === 'truffleruby') {
|
} else if (engine.startsWith('truffleruby')) {
|
||||||
return isHeadVersion(rubyVersion) || floatVersion(rubyVersion) >= 21.0
|
return floatVersion(rubyVersion) >= 21.0
|
||||||
} else if (engine === 'jruby') {
|
} else if (engine === 'jruby') {
|
||||||
return isHeadVersion(rubyVersion) || floatVersion(rubyVersion) >= 9.3
|
return floatVersion(rubyVersion) >= 9.3
|
||||||
} else {
|
} else {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
@@ -71,8 +75,10 @@ export function floatVersion(rubyVersion) {
|
|||||||
const match = rubyVersion.match(/^\d+\.\d+/)
|
const match = rubyVersion.match(/^\d+\.\d+/)
|
||||||
if (match) {
|
if (match) {
|
||||||
return parseFloat(match[0])
|
return parseFloat(match[0])
|
||||||
|
} else if (isHeadVersion(rubyVersion)) {
|
||||||
|
return 999.999
|
||||||
} else {
|
} else {
|
||||||
return 0.0
|
throw new Error(`Could not convert version ${rubyVersion} to a float`)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -149,7 +155,15 @@ export function win2nix(path) {
|
|||||||
return path.replace(/\\/g, '/').replace(/ /g, '\\ ')
|
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) {
|
export function setupPath(newPathEntries) {
|
||||||
|
let msys2Type = null
|
||||||
const envPath = windows ? 'Path' : 'PATH'
|
const envPath = windows ? 'Path' : 'PATH'
|
||||||
const originalPath = process.env[envPath].split(path.delimiter)
|
const originalPath = process.env[envPath].split(path.delimiter)
|
||||||
let cleanPath = originalPath.filter(entry => !/\bruby\b/i.test(entry))
|
let cleanPath = originalPath.filter(entry => !/\bruby\b/i.test(entry))
|
||||||
@@ -170,8 +184,11 @@ export function setupPath(newPathEntries) {
|
|||||||
// Then add new path entries using core.addPath()
|
// Then add new path entries using core.addPath()
|
||||||
let newPath
|
let newPath
|
||||||
if (windows) {
|
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
|
// 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]
|
newPath = [...newPathEntries, ...msys2]
|
||||||
} else {
|
} else {
|
||||||
newPath = newPathEntries
|
newPath = newPathEntries
|
||||||
@@ -183,4 +200,5 @@ export function setupPath(newPathEntries) {
|
|||||||
core.endGroup()
|
core.endGroup()
|
||||||
|
|
||||||
core.addPath(newPath.join(path.delimiter))
|
core.addPath(newPath.join(path.delimiter))
|
||||||
|
return msys2Type
|
||||||
}
|
}
|
||||||
|
|||||||
+343
-181
File diff suppressed because one or more lines are too long
@@ -28,6 +28,7 @@ versions = entries.select { |entry|
|
|||||||
versions['head'] = 'https://github.com/oneclick/rubyinstaller2/releases/download/rubyinstaller-head/rubyinstaller-head-x64.7z'
|
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['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['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'
|
||||||
|
|
||||||
|
File.binwrite 'windows-versions.json', "#{JSON.pretty_generate(versions)}\n"
|
||||||
|
|
||||||
js = "export const versions = #{JSON.pretty_generate(versions)}\n"
|
|
||||||
File.binwrite 'windows-versions.js', js
|
|
||||||
|
|||||||
@@ -2,13 +2,16 @@ 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 bundler = require('./bundler')
|
const bundler = require('./bundler')
|
||||||
|
|
||||||
const windows = common.windows
|
const windows = common.windows
|
||||||
|
|
||||||
const inputDefaults = {
|
const inputDefaults = {
|
||||||
'ruby-version': 'default',
|
'ruby-version': 'default',
|
||||||
|
'rubygems': 'default',
|
||||||
'bundler': 'default',
|
'bundler': 'default',
|
||||||
'bundler-cache': 'true',
|
'bundler-cache': 'true',
|
||||||
'working-directory': '.',
|
'working-directory': '.',
|
||||||
@@ -48,11 +51,26 @@ export async function setupRuby(options = {}) {
|
|||||||
const engineVersions = installer.getAvailableVersions(platform, engine)
|
const engineVersions = installer.getAvailableVersions(platform, engine)
|
||||||
const version = validateRubyEngineAndVersion(platform, engineVersions, engine, parsedVersion)
|
const version = validateRubyEngineAndVersion(platform, engineVersions, engine, parsedVersion)
|
||||||
|
|
||||||
createGemRC()
|
createGemRC(engine, version)
|
||||||
envPreInstall()
|
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)
|
const rubyPrefix = await installer.install(platform, engine, version)
|
||||||
|
|
||||||
|
await common.measure('Print Ruby version', async () =>
|
||||||
|
await exec.exec('ruby', ['--version']))
|
||||||
|
|
||||||
|
if (inputs['rubygems'] !== 'default') {
|
||||||
|
await common.measure('Updating RubyGems', async () =>
|
||||||
|
rubygems.rubygemsUpdate(inputs['rubygems'], rubyPrefix))
|
||||||
|
}
|
||||||
|
|
||||||
// When setup-ruby is used by other actions, this allows code in them to run
|
// When setup-ruby is used by other actions, this allows code in them to run
|
||||||
// before 'bundle install'. Installed dependencies may require additional
|
// before 'bundle install'. Installed dependencies may require additional
|
||||||
// libraries & headers, build tools, etc.
|
// libraries & headers, build tools, etc.
|
||||||
@@ -64,11 +82,11 @@ export async function setupRuby(options = {}) {
|
|||||||
const [gemfile, lockFile] = bundler.detectGemfiles()
|
const [gemfile, lockFile] = bundler.detectGemfiles()
|
||||||
|
|
||||||
const 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']))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -91,13 +109,13 @@ function parseRubyEngineAndVersion(rubyVersion) {
|
|||||||
console.log(`Using ${rubyVersion} as input from file .ruby-version`)
|
console.log(`Using ${rubyVersion} as input from file .ruby-version`)
|
||||||
} else if (rubyVersion === '.tool-versions') { // Read from .tool-versions
|
} else if (rubyVersion === '.tool-versions') { // Read from .tool-versions
|
||||||
const toolVersions = fs.readFileSync('.tool-versions', 'utf8').trim()
|
const toolVersions = fs.readFileSync('.tool-versions', 'utf8').trim()
|
||||||
const rubyLine = toolVersions.split(/\r?\n/).filter(e => e.match(/^ruby\s/))[0]
|
const rubyLine = toolVersions.split(/\r?\n/).filter(e => /^ruby\s/.test(e))[0]
|
||||||
rubyVersion = rubyLine.match(/^ruby\s+(.+)$/)[1]
|
rubyVersion = rubyLine.match(/^ruby\s+(.+)$/)[1]
|
||||||
console.log(`Using ${rubyVersion} as input from file .tool-versions`)
|
console.log(`Using ${rubyVersion} as input from file .tool-versions`)
|
||||||
}
|
}
|
||||||
|
|
||||||
let engine, version
|
let engine, version
|
||||||
if (rubyVersion.match(/^(\d+)/) || common.isHeadVersion(rubyVersion)) { // X.Y.Z => ruby-X.Y.Z
|
if (/^(\d+)/.test(rubyVersion) || common.isHeadVersion(rubyVersion)) { // X.Y.Z => ruby-X.Y.Z
|
||||||
engine = 'ruby'
|
engine = 'ruby'
|
||||||
version = rubyVersion
|
version = rubyVersion
|
||||||
} else if (!rubyVersion.includes('-')) { // myruby -> myruby-stableVersion
|
} else if (!rubyVersion.includes('-')) { // myruby -> myruby-stableVersion
|
||||||
@@ -138,10 +156,14 @@ function validateRubyEngineAndVersion(platform, engineVersions, engine, parsedVe
|
|||||||
return version
|
return version
|
||||||
}
|
}
|
||||||
|
|
||||||
function createGemRC() {
|
function createGemRC(engine, version) {
|
||||||
const gemrc = path.join(os.homedir(), '.gemrc')
|
const gemrc = path.join(os.homedir(), '.gemrc')
|
||||||
if (!fs.existsSync(gemrc)) {
|
if (!fs.existsSync(gemrc)) {
|
||||||
fs.writeFileSync(gemrc, `gem: --no-document${os.EOL}`)
|
if (engine === 'ruby' && common.floatVersion(version) < 2.0) {
|
||||||
|
fs.writeFileSync(gemrc, `install: --no-rdoc --no-ri${os.EOL}update: --no-rdoc --no-ri${os.EOL}`)
|
||||||
|
} else {
|
||||||
|
fs.writeFileSync(gemrc, `gem: --no-document${os.EOL}`)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,34 @@
|
|||||||
|
engine, version = ARGV.fetch(0).split('-', 2)
|
||||||
|
|
||||||
|
MATCH = case engine
|
||||||
|
when 'ruby', 'jruby'
|
||||||
|
/^\d+\.\d+\./
|
||||||
|
when 'truffleruby'
|
||||||
|
/^\d+\./
|
||||||
|
end
|
||||||
|
|
||||||
|
raise unless version[MATCH]
|
||||||
|
|
||||||
|
file = "#{__dir__}/ruby-builder-versions.json"
|
||||||
|
lines = File.readlines(file, chomp: true)
|
||||||
|
|
||||||
|
from = lines.index { |line| line =~ /"#{engine}": \[/ }
|
||||||
|
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
|
||||||
|
release_line << " #{version.inspect},"
|
||||||
|
else
|
||||||
|
lines.insert to+1, " #{version.inspect},"
|
||||||
|
end
|
||||||
|
|
||||||
|
File.write(file, lines.join("\n") + "\n")
|
||||||
+4
-3
@@ -22,13 +22,14 @@
|
|||||||
},
|
},
|
||||||
"homepage": "https://github.com/ruby/setup-ruby",
|
"homepage": "https://github.com/ruby/setup-ruby",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@actions/cache": "^1.0.7",
|
"@actions/cache": "^1.0.8",
|
||||||
"@actions/core": "^1.4.0",
|
"@actions/core": "^1.4.0",
|
||||||
"@actions/exec": "^1.1.0",
|
"@actions/exec": "^1.1.0",
|
||||||
"@actions/io": "^1.1.1",
|
"@actions/io": "^1.1.1",
|
||||||
"@actions/tool-cache": "^1.7.1"
|
"@actions/tool-cache": "^1.7.1",
|
||||||
|
"semver": "^6.1.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@vercel/ncc": "^0.28.6"
|
"@vercel/ncc": "^0.31.1"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,29 +0,0 @@
|
|||||||
export function getVersions(platform) {
|
|
||||||
const versions = {
|
|
||||||
"ruby": [
|
|
||||||
"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.7.0", "2.7.1", "2.7.2", "2.7.3", "2.7.4",
|
|
||||||
"3.0.0-preview1", "3.0.0-preview2", "3.0.0-rc1", "3.0.0", "3.0.1", "3.0.2",
|
|
||||||
"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",
|
|
||||||
"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",
|
|
||||||
"head"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
return versions
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
{
|
||||||
|
"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",
|
||||||
|
"head"
|
||||||
|
],
|
||||||
|
"truffleruby+graalvm": [
|
||||||
|
"21.2.0", "21.3.0",
|
||||||
|
"head"
|
||||||
|
]
|
||||||
|
}
|
||||||
+28
-4
@@ -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) {
|
||||||
@@ -35,19 +35,43 @@ export async function install(platform, engine, version) {
|
|||||||
common.setupPath([path.join(rubyPrefix, 'bin')])
|
common.setupPath([path.join(rubyPrefix, 'bin')])
|
||||||
|
|
||||||
if (!inToolCache) {
|
if (!inToolCache) {
|
||||||
await downloadAndExtract(platform, engine, version, rubyPrefix);
|
await preparePrefix(rubyPrefix)
|
||||||
|
if (engine === 'truffleruby+graalvm') {
|
||||||
|
await installWithRubyBuild(engine, version, rubyPrefix)
|
||||||
|
} else {
|
||||||
|
await downloadAndExtract(platform, engine, version, rubyPrefix)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return rubyPrefix
|
return rubyPrefix
|
||||||
}
|
}
|
||||||
|
|
||||||
async function downloadAndExtract(platform, engine, version, rubyPrefix) {
|
async function preparePrefix(rubyPrefix) {
|
||||||
const parentDir = path.dirname(rubyPrefix)
|
const parentDir = path.dirname(rubyPrefix)
|
||||||
|
|
||||||
await io.rmRF(rubyPrefix)
|
await io.rmRF(rubyPrefix)
|
||||||
if (!(fs.existsSync(parentDir) && fs.statSync(parentDir).isDirectory())) {
|
if (!(fs.existsSync(parentDir) && fs.statSync(parentDir).isDirectory())) {
|
||||||
await io.mkdirP(parentDir)
|
await io.mkdirP(parentDir)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async function installWithRubyBuild(engine, version, rubyPrefix) {
|
||||||
|
const tmp = process.env['RUNNER_TEMP'] || os.tmpdir()
|
||||||
|
const rubyBuildDir = path.join(tmp, 'ruby-build-for-setup-ruby')
|
||||||
|
await common.measure('Cloning ruby-build', async () => {
|
||||||
|
await exec.exec('git', ['clone', 'https://github.com/rbenv/ruby-build.git', rubyBuildDir])
|
||||||
|
})
|
||||||
|
|
||||||
|
const rubyName = `${engine}-${version === 'head' ? 'dev' : version}`
|
||||||
|
await common.measure(`Installing ${engine}-${version} with ruby-build`, async () => {
|
||||||
|
await exec.exec(`${rubyBuildDir}/bin/ruby-build`, [rubyName, rubyPrefix])
|
||||||
|
})
|
||||||
|
|
||||||
|
await io.rmRF(rubyBuildDir)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function downloadAndExtract(platform, engine, version, rubyPrefix) {
|
||||||
|
const parentDir = path.dirname(rubyPrefix)
|
||||||
|
|
||||||
const downloadPath = await common.measure('Downloading Ruby', async () => {
|
const downloadPath = await common.measure('Downloading Ruby', async () => {
|
||||||
const url = getDownloadURL(platform, engine, version)
|
const url = getDownloadURL(platform, engine, version)
|
||||||
@@ -55,7 +79,7 @@ async function downloadAndExtract(platform, engine, version, rubyPrefix) {
|
|||||||
return await tc.downloadTool(url)
|
return await tc.downloadTool(url)
|
||||||
})
|
})
|
||||||
|
|
||||||
await common.measure('Extracting Ruby', async () => {
|
await common.measure('Extracting Ruby', async () => {
|
||||||
if (windows) {
|
if (windows) {
|
||||||
// Windows 2016 doesn't have system tar, use MSYS2's, it needs unix style paths
|
// 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)])
|
await exec.exec('tar', ['-xz', '-C', common.win2nix(parentDir), '-f', common.win2nix(downloadPath)])
|
||||||
|
|||||||
+30
@@ -0,0 +1,30 @@
|
|||||||
|
const path = require('path')
|
||||||
|
const exec = require('@actions/exec')
|
||||||
|
const semver = require('semver')
|
||||||
|
|
||||||
|
export async function rubygemsUpdate(rubygemsVersionInput, rubyPrefix) {
|
||||||
|
const gem = path.join(rubyPrefix, 'bin', 'gem')
|
||||||
|
|
||||||
|
let gemVersion = ''
|
||||||
|
|
||||||
|
await exec.exec(gem, ['--version'], {
|
||||||
|
listeners: {
|
||||||
|
stdout: (data) => (gemVersion += data.toString()),
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
gemVersion = semver.coerce(gemVersion.trim())
|
||||||
|
console.log(`Default RubyGems version is ${gemVersion}`)
|
||||||
|
|
||||||
|
if (rubygemsVersionInput === 'latest') {
|
||||||
|
console.log('Updating RubyGems to latest version')
|
||||||
|
await exec.exec(gem, ['update', '--system'])
|
||||||
|
} else if (semver.gt(rubygemsVersionInput, gemVersion)) {
|
||||||
|
console.log(`Updating RubyGems to ${rubygemsVersionInput}`)
|
||||||
|
await exec.exec(gem, ['update', '--system', rubygemsVersionInput])
|
||||||
|
} else {
|
||||||
|
console.log(`Skipping RubyGems update because the given version (${rubygemsVersionInput}) is not newer than the default version (${gemVersion})`)
|
||||||
|
}
|
||||||
|
|
||||||
|
return true
|
||||||
|
}
|
||||||
@@ -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",
|
||||||
@@ -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.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.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.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.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.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.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.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.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.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.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.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",
|
"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",
|
||||||
|
"ucrt": "https://github.com/MSP-Greg/ruby-loco/releases/download/ruby-master/ruby-ucrt.7z"
|
||||||
}
|
}
|
||||||
+133
-17
@@ -9,16 +9,20 @@ 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
|
||||||
|
|
||||||
|
const msys2BasePath = 'C:\\msys64'
|
||||||
|
|
||||||
// needed for 2.0-2.3, and mswin, cert file used by Git for Windows
|
// 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'
|
const certFile = 'C:\\Program Files\\Git\\mingw64\\ssl\\cert.pem'
|
||||||
|
|
||||||
// location & path for old RubyInstaller DevKit (MSYS), Ruby 2.0-2.3
|
// location & path for old RubyInstaller DevKit (MSYS1), Ruby 2.0-2.3
|
||||||
const msys = `${drive}:\\DevKit64`
|
const msys1 = `${drive}:\\DevKit64`
|
||||||
const msysPathEntries = [`${msys}\\mingw\\x86_64-w64-mingw32\\bin`, `${msys}\\mingw\\bin`, `${msys}\\bin`]
|
const msysPathEntries = [`${msys1}\\mingw\\x86_64-w64-mingw32\\bin`, `${msys1}\\mingw\\bin`, `${msys1}\\bin`]
|
||||||
|
|
||||||
|
const virtualEnv = common.getVirtualEnvironmentName()
|
||||||
|
|
||||||
export function getAvailableVersions(platform, engine) {
|
export function getAvailableVersions(platform, engine) {
|
||||||
if (engine === 'ruby') {
|
if (engine === 'ruby') {
|
||||||
@@ -31,6 +35,10 @@ export function getAvailableVersions(platform, engine) {
|
|||||||
export async function install(platform, engine, version) {
|
export async function install(platform, engine, version) {
|
||||||
const url = rubyInstallerVersions[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')) {
|
if (!url.endsWith('.7z')) {
|
||||||
throw new Error(`URL should end in .7z: ${url}`)
|
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)
|
let toolchainPaths = (version === 'mswin') ? await setupMSWin() : await setupMingw(version)
|
||||||
|
|
||||||
common.setupPath([`${rubyPrefix}\\bin`, ...toolchainPaths])
|
|
||||||
|
|
||||||
if (!inToolCache) {
|
if (!inToolCache) {
|
||||||
await downloadAndExtract(engine, version, url, base, rubyPrefix);
|
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
|
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) {
|
async function downloadAndExtract(engine, version, url, base, rubyPrefix) {
|
||||||
const parentDir = path.dirname(rubyPrefix)
|
const parentDir = path.dirname(rubyPrefix)
|
||||||
|
|
||||||
@@ -67,8 +131,9 @@ async function downloadAndExtract(engine, version, url, base, rubyPrefix) {
|
|||||||
return await tc.downloadTool(url)
|
return await tc.downloadTool(url)
|
||||||
})
|
})
|
||||||
|
|
||||||
await common.measure('Extracting Ruby', async () =>
|
await common.measure('Extracting Ruby', async () =>
|
||||||
exec.exec('7z', ['x', downloadPath, `-xr!${base}\\share\\doc`, `-o${parentDir}`], { silent: true }))
|
// -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)) {
|
if (base !== path.basename(rubyPrefix)) {
|
||||||
await io.mv(path.join(parentDir, base), 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) {
|
async function setupMingw(version) {
|
||||||
core.exportVariable('MAKE', 'make.exe')
|
core.exportVariable('MAKE', 'make.exe')
|
||||||
|
|
||||||
if (version.match(/^2\.[0123]/)) {
|
// 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)
|
core.exportVariable('SSL_CERT_FILE', certFile)
|
||||||
await common.measure('Installing MSYS', async () => installMSYS(version))
|
await common.measure('Installing MSYS1', async () => installMSYS1(version))
|
||||||
return msysPathEntries
|
return msysPathEntries
|
||||||
} else {
|
} else {
|
||||||
return []
|
return []
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Ruby 2.0, 2.1, 2.2 and 2.3
|
// Ruby 2.0-2.3
|
||||||
async function installMSYS(version) {
|
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 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)
|
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 ?
|
// 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('CC' , 'gcc')
|
||||||
core.exportVariable('CXX', 'g++')
|
core.exportVariable('CXX', 'g++')
|
||||||
core.exportVariable('CPP', 'cpp')
|
core.exportVariable('CPP', 'cpp')
|
||||||
@@ -126,15 +197,28 @@ async function setupMSWin() {
|
|||||||
/* Sets MSVC environment for use in Actions
|
/* Sets MSVC environment for use in Actions
|
||||||
* allows steps to run without running vcvars*.bat, also for PowerShell
|
* allows steps to run without running vcvars*.bat, also for PowerShell
|
||||||
* adds a convenience VCVARS environment variable
|
* 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() {
|
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)
|
core.exportVariable('VCVARS', vcVars)
|
||||||
|
|
||||||
let newEnv = new Map()
|
let newEnv = new Map()
|
||||||
let cmd = `cmd.exe /c "${vcVars} && set"`
|
let cmd = `cmd.exe /c "${vcVars} && set"`
|
||||||
let newSet = cp.execSync(cmd).toString().trim().split(/\r?\n/)
|
let newSet = cp.execSync(cmd).toString().trim().split(/\r?\n/)
|
||||||
newSet = newSet.filter(line => line.match(/\S=\S/))
|
newSet = newSet.filter(line => /\S=\S/.test(line))
|
||||||
newSet.forEach(s => {
|
newSet.forEach(s => {
|
||||||
let [k,v] = common.partition(s, '=')
|
let [k,v] = common.partition(s, '=')
|
||||||
newEnv.set(k,v)
|
newEnv.set(k,v)
|
||||||
@@ -153,3 +237,35 @@ export function addVCVARSEnv() {
|
|||||||
}
|
}
|
||||||
return newPathEntries
|
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))
|
||||||
|
if (existing.length > 0) {
|
||||||
|
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)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -2,10 +2,10 @@
|
|||||||
# yarn lockfile v1
|
# yarn lockfile v1
|
||||||
|
|
||||||
|
|
||||||
"@actions/cache@^1.0.7":
|
"@actions/cache@^1.0.8":
|
||||||
version "1.0.7"
|
version "1.0.8"
|
||||||
resolved "https://registry.yarnpkg.com/@actions/cache/-/cache-1.0.7.tgz#d80b0f5ac1e1ad48a5e77c39685100bd49b56b1c"
|
resolved "https://registry.yarnpkg.com/@actions/cache/-/cache-1.0.8.tgz#426ad3a2127b35a4e21ad906e02202dc8b96663f"
|
||||||
integrity sha512-MY69kxuubqUFq84pFlu8m6Poxl5sR/xyhpC4JEvno7Yg9ASYdGizEmKgt0m8ovewpYKf15UAOcSC0hzS+DuosA==
|
integrity sha512-GWNNB67w93HGJRQXlsV56YqrdAuDoP3esK/mo5mzU8WoDCVjtQgJGsTdkYUX7brswtT7xnI30bWNo1WLKQ8FZQ==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@actions/core" "^1.2.6"
|
"@actions/core" "^1.2.6"
|
||||||
"@actions/exec" "^1.0.1"
|
"@actions/exec" "^1.0.1"
|
||||||
@@ -195,10 +195,10 @@
|
|||||||
dependencies:
|
dependencies:
|
||||||
"@types/node" "*"
|
"@types/node" "*"
|
||||||
|
|
||||||
"@vercel/ncc@^0.28.6":
|
"@vercel/ncc@^0.31.1":
|
||||||
version "0.28.6"
|
version "0.31.1"
|
||||||
resolved "https://registry.yarnpkg.com/@vercel/ncc/-/ncc-0.28.6.tgz#073c0ce8e0269210c0a9f180fb0bf949eecc20e0"
|
resolved "https://registry.yarnpkg.com/@vercel/ncc/-/ncc-0.31.1.tgz#9346c7e59326f5eeac75c0286e47df94c2d6d8f7"
|
||||||
integrity sha512-t4BoSSuyK8BZaUE0gV18V6bkFs4st7baumtFGa50dv1tMu2GDBEBF8sUZaKBdKiL6DzJ2D2+XVCwYWWDcQOYdQ==
|
integrity sha512-g0FAxwdViI6UzsiVz5HssIHqjcPa1EHL6h+2dcJD893SoCJaGdqqgUF09xnMW6goWnnhbLvgiKlgJWrJa+7qYA==
|
||||||
|
|
||||||
abort-controller@^3.0.0:
|
abort-controller@^3.0.0:
|
||||||
version "3.0.0"
|
version "3.0.0"
|
||||||
|
|||||||
Reference in New Issue
Block a user