mirror of
https://github.com/ruby/setup-ruby.git
synced 2026-09-13 14:34:21 +02:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3190662165 | ||
|
|
eb7f94ffae | ||
|
|
ad718faf7a | ||
|
|
09c10210cc | ||
|
|
f78d71faf4 | ||
|
|
fe42d0e73b | ||
|
|
8a6667e214 | ||
|
|
03b78bdda2 | ||
|
|
5fe1a6694c | ||
|
|
bb3a0553d5 | ||
|
|
02c9cccf0e | ||
|
|
8d6236c5db | ||
|
|
4b2d1d631e | ||
|
|
349473288f | ||
|
|
846173692d | ||
|
|
9d93e96fe7 | ||
|
|
ee2113536a | ||
|
|
ee37499046 | ||
|
|
a5e2883296 | ||
|
|
705fe056cf | ||
|
|
8e7720ca42 | ||
|
|
7a0bff23cb | ||
|
|
c7079efafd | ||
|
|
384fc1b92f | ||
|
|
0a6498048c | ||
|
|
de6f5b9c34 | ||
|
|
4887fd8753 | ||
|
|
c4fe7bd15d | ||
|
|
84dd2abab6 | ||
|
|
8ddb7b3348 | ||
|
|
f2c070bbf7 | ||
|
|
ece8276942 | ||
|
|
bc92d02ed9 | ||
|
|
eae47962ba | ||
|
|
d240f61f8b | ||
|
|
3068fa83f9 | ||
|
|
72d5948221 | ||
|
|
51899ef157 | ||
|
|
a727442384 | ||
|
|
f564484a57 | ||
|
|
ce94adffd3 | ||
|
|
42a259edb2 | ||
|
|
f7849898b0 | ||
|
|
a3894ac3b7 | ||
|
|
5022ef5ab9 | ||
|
|
875ff82065 | ||
|
|
6776a1b083 | ||
|
|
b289c1ab17 | ||
|
|
b5206a3d03 | ||
|
|
925d63f634 | ||
|
|
0b2c3ee702 | ||
|
|
658402fc50 | ||
|
|
0a29871fe2 | ||
|
|
ae403e8ff4 | ||
|
|
3804ad4ff2 | ||
|
|
87ccb7599f | ||
|
|
19b31c7064 | ||
|
|
a1396b7d70 | ||
|
|
5ece9850ad | ||
|
|
6148f408d3 | ||
|
|
699560a00d | ||
|
|
8b5af312bd | ||
|
|
d5ee2364f0 | ||
|
|
8731780d5e | ||
|
|
3882fb634e | ||
|
|
d6ebfae201 | ||
|
|
3325fe2d4e | ||
|
|
e8f04a3cee | ||
|
|
bb1d54ff77 | ||
|
|
4e1189c53d | ||
|
|
a54c48c94b | ||
|
|
cb55cb0ce4 | ||
|
|
08245253a7 | ||
|
|
51df335734 | ||
|
|
c4167d16b3 | ||
|
|
d97cd77c44 | ||
|
|
706bae07c5 | ||
|
|
2489e28c66 | ||
|
|
d20d4c5fed | ||
|
|
ad637dce55 | ||
|
|
8029ebd6e5 | ||
|
|
356354c8aa | ||
|
|
be54de855e | ||
|
|
cd4241788a | ||
|
|
3c76dcfa76 | ||
|
|
a7439cf424 | ||
|
|
b9675e15ad | ||
|
|
57a3395c80 | ||
|
|
296bf7f67a | ||
|
|
e92b7971f0 | ||
|
|
b2e1b33839 | ||
|
|
645077fe5e | ||
|
|
301d3e0984 | ||
|
|
8c72644a0b | ||
|
|
d02b65e726 | ||
|
|
d246303ba7 | ||
|
|
d78e94b867 | ||
|
|
793715001d | ||
|
|
69fe46858b | ||
|
|
dcbc29fae9 | ||
|
|
3f53c4ecc2 | ||
|
|
9b993bc63c | ||
|
|
d6a695ac2a | ||
|
|
e404913b05 | ||
|
|
eb938a806e | ||
|
|
ee5764de2c | ||
|
|
2b019609e2 | ||
|
|
7e21bdc34c | ||
|
|
b37f0a38ea | ||
|
|
ebaea52cb2 | ||
|
|
382b2c5e9b | ||
|
|
0d85c5bbb7 | ||
|
|
b80945c764 | ||
|
|
1a68550f2e | ||
|
|
bd94d6a504 | ||
|
|
b9d02e5f7e | ||
|
|
4d8ce7b87d | ||
|
|
cd9d3de43b | ||
|
|
7baabd2c5d | ||
|
|
e5517072e8 | ||
|
|
cca23415f7 | ||
|
|
cb1708a42d | ||
|
|
339cddd0ab | ||
|
|
0bb302e3c3 | ||
|
|
359bebbc29 | ||
|
|
fabf2515e6 | ||
|
|
51c0d59222 | ||
|
|
6d62a2dcce | ||
|
|
8a48a656bf | ||
|
|
32c0569c64 | ||
|
|
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 | ||
|
|
cae9d256bd | ||
|
|
189661fc29 | ||
|
|
d3625ee300 | ||
|
|
a783f957cd | ||
|
|
2ebd17bccd | ||
|
|
9f177f2b7c | ||
|
|
477b21f02b | ||
|
|
65c1995be7 | ||
|
|
fe983d22a1 | ||
|
|
517a3b1b36 | ||
|
|
4406a4131e | ||
|
|
1328335dba | ||
|
|
ea774f6ee1 | ||
|
|
77ca66ce27 | ||
|
|
fd1a6a00ca | ||
|
|
01144718b5 | ||
|
|
b161cb92f0 | ||
|
|
fa2182b2a4 | ||
|
|
2eb6adbfb1 | ||
|
|
6f2028eda5 | ||
|
|
b12138f02d | ||
|
|
b2296551a1 | ||
|
|
d320226fe2 | ||
|
|
d2f535c1ed | ||
|
|
ad65390c0a | ||
|
|
c5c7583a68 | ||
|
|
117edf3c27 | ||
|
|
df8f44e55c | ||
|
|
2b7bafee36 | ||
|
|
dddacd7ec1 | ||
|
|
5ee10197cf | ||
|
|
4f47b3664d | ||
|
|
b97fdb9941 | ||
|
|
0a19fc237d | ||
|
|
745f03fc1c | ||
|
|
51b5bc2e0e | ||
|
|
034294ac91 | ||
|
|
b818bea8cf | ||
|
|
4281753149 | ||
|
|
7b5a90250e | ||
|
|
e90803a1bf | ||
|
|
fdcfbcf14e | ||
|
|
a358e49b56 | ||
|
|
6e288cd651 | ||
|
|
3ab5bf6391 | ||
|
|
1891d63a08 | ||
|
|
c782da25bd | ||
|
|
5aaa89ff0d | ||
|
|
3460195737 | ||
|
|
d195ecb9ec | ||
|
|
c34fe21c5f | ||
|
|
324b8ce0e9 | ||
|
|
ce63da5b3b | ||
|
|
0d3b8b502e | ||
|
|
2320cdc287 | ||
|
|
95193d6d48 | ||
|
|
9aeedd9a81 | ||
|
|
72d75bd883 | ||
|
|
473e4d8fe5 | ||
|
|
3cb8cff23d | ||
|
|
f36eef7a2f | ||
|
|
ec4649be90 | ||
|
|
1771151f64 | ||
|
|
f5db46ebcb | ||
|
|
dc58db7220 | ||
|
|
0e7d36a67f | ||
|
|
e5b6990d51 | ||
|
|
c3f248a282 | ||
|
|
a9926985f9 | ||
|
|
07b100f2a1 | ||
|
|
515629a013 | ||
|
|
0981b5ec00 | ||
|
|
c101335f33 | ||
|
|
1482e9180a | ||
|
|
3e7640a17e | ||
|
|
f6f61ea575 | ||
|
|
084885eaca | ||
|
|
efd6675fc9 | ||
|
|
e5a267414f | ||
|
|
cadade3366 | ||
|
|
d3562e70d9 | ||
|
|
23b2b5e5f1 | ||
|
|
42fc2d3bce | ||
|
|
30f5e2d4cd | ||
|
|
fd1d77b75c | ||
|
|
2a0be7a409 | ||
|
|
bacba738b2 | ||
|
|
21351ecc0a | ||
|
|
4d7e038419 | ||
|
|
e27aee156d | ||
|
|
43bb24d212 | ||
|
|
0c4183e8b8 | ||
|
|
50ae8432ea | ||
|
|
a699edbce6 | ||
|
|
e38f9abc9e | ||
|
|
7c2bf7263d | ||
|
|
34fbbc1d36 | ||
|
|
9bc07a3af0 | ||
|
|
63dde36864 | ||
|
|
fde3324171 | ||
|
|
59aafb8612 | ||
|
|
ad1ebae995 | ||
|
|
f4a8aa6c33 | ||
|
|
bc0f274d1c | ||
|
|
1c896c8ea1 | ||
|
|
ba761ba8ff | ||
|
|
bb3a0c6e0b | ||
|
|
8e77d9e0fa | ||
|
|
339f055c86 | ||
|
|
0592d01dc3 | ||
|
|
d7b76f909a | ||
|
|
ebed7f7b66 | ||
|
|
933dca770c | ||
|
|
693cf1794d | ||
|
|
efda314f4a | ||
|
|
c49deecea1 | ||
|
|
5da31b45d7 | ||
|
|
4bb29a57df | ||
|
|
9be533b7d4 | ||
|
|
35f0af38a7 | ||
|
|
b9ca796ede | ||
|
|
11082225e4 | ||
|
|
4de6eb91a8 | ||
|
|
60f215c278 | ||
|
|
a195098f6b | ||
|
|
f117ca04d8 | ||
|
|
8bc9ca9ace | ||
|
|
965ef501d4 | ||
|
|
153ca5e38f | ||
|
|
0effb2cc50 | ||
|
|
b62e5d53aa | ||
|
|
1c172ef5dc | ||
|
|
4cbbce6b48 | ||
|
|
108b3a2c8a | ||
|
|
25ccf0aad8 | ||
|
|
9ec93a2370 | ||
|
|
a096b998ad | ||
|
|
6ead459c74 | ||
|
|
45ec312a6e | ||
|
|
568cdbf232 | ||
|
|
638e8fff19 | ||
|
|
ad2d64d83c | ||
|
|
0ccde464c3 | ||
|
|
bdfdb53a44 | ||
|
|
842f7a91c4 | ||
|
|
6c10c0bae0 | ||
|
|
312f3d08ba | ||
|
|
273e7443b6 | ||
|
|
33cc6f7238 | ||
|
|
7ac926d65e | ||
|
|
1682e5e389 | ||
|
|
25388a3d11 | ||
|
|
aa7df8d81f | ||
|
|
162161eab5 | ||
|
|
c233f78bee | ||
|
|
5a76bd6a5f | ||
|
|
40bbc5ec66 | ||
|
|
1bb7de255b | ||
|
|
973b1baf94 | ||
|
|
ef4b00fd12 | ||
|
|
271876da60 | ||
|
|
5c4fc21c57 | ||
|
|
c8a88df157 | ||
|
|
d57231c9a3 | ||
|
|
281d1c54fe | ||
|
|
ea86920b92 | ||
|
|
a43803ce44 | ||
|
|
bf8b766096 | ||
|
|
44338c51c7 | ||
|
|
037dfa7b6b | ||
|
|
6647273ce9 | ||
|
|
071acb9122 | ||
|
|
ba5b846810 | ||
|
|
81be0938f7 | ||
|
|
b04e5b8846 | ||
|
|
a7df86edc6 | ||
|
|
8137829321 | ||
|
|
a1d280134e | ||
|
|
d01e942f09 | ||
|
|
e74945bcae | ||
|
|
8bff4379b9 | ||
|
|
23b9735206 | ||
|
|
002b15eeca | ||
|
|
e5857dbffe | ||
|
|
381e2639aa | ||
|
|
d4032b551d | ||
|
|
da846ef6db | ||
|
|
1fe99df431 | ||
|
|
c28669c4da | ||
|
|
9f60be7c73 | ||
|
|
29eefdda13 | ||
|
|
ec106b438a | ||
|
|
d7f9647ad8 | ||
|
|
f25e77d702 | ||
|
|
463c3a8161 | ||
|
|
63190648f4 | ||
|
|
aec70617e0 | ||
|
|
759c98774b | ||
|
|
24d7979773 | ||
|
|
56996937ab | ||
|
|
e9b0369f85 | ||
|
|
045dd42354 | ||
|
|
152ff008a3 | ||
|
|
d4f9058279 | ||
|
|
c40ce85201 | ||
|
|
c68e25cb8c | ||
|
|
95135e9903 | ||
|
|
9f0a9acc35 | ||
|
|
211f6c78ad | ||
|
|
47bbcca04c | ||
|
|
f964e8aa48 | ||
|
|
e16528e678 | ||
|
|
11238a2c00 | ||
|
|
1e2e6e19e3 | ||
|
|
a1c5b2a66c | ||
|
|
e648fd85b4 | ||
|
|
fb9d6fbc69 | ||
|
|
9c77d1b41f | ||
|
|
2641afc25c | ||
|
|
d785726c7f | ||
|
|
c33236e6da | ||
|
|
e0c562b83f | ||
|
|
04510c677e | ||
|
|
c4665148cf | ||
|
|
0a45f18d44 | ||
|
|
2e60bdd7e4 | ||
|
|
0925a3eb86 | ||
|
|
ae39a8d7d2 | ||
|
|
f70e6bf7d0 | ||
|
|
d96d3894b6 | ||
|
|
047ed419ae | ||
|
|
aea40d1b5a | ||
|
|
3dad7e20e6 | ||
|
|
166761b310 | ||
|
|
6f3ecad449 | ||
|
|
0d26c9bf64 | ||
|
|
de6b99f08a | ||
|
|
cfe5daad50 | ||
|
|
80b79ff73f | ||
|
|
67ca12cfaa | ||
|
|
1ad4d1b6db | ||
|
|
2e093de9b3 | ||
|
|
bd9411e978 | ||
|
|
272cf9d04a | ||
|
|
8363b99194 | ||
|
|
475e32ed3f | ||
|
|
8d89ffaa2b | ||
|
|
c125fbc596 | ||
|
|
d8d290d206 | ||
|
|
6044e83b8f | ||
|
|
970f6659fb |
@@ -1,18 +0,0 @@
|
|||||||
{
|
|
||||||
"env": {
|
|
||||||
"commonjs": true,
|
|
||||||
"es6": true,
|
|
||||||
"node": true
|
|
||||||
},
|
|
||||||
"extends": "eslint:recommended",
|
|
||||||
"globals": {
|
|
||||||
"Atomics": "readonly",
|
|
||||||
"SharedArrayBuffer": "readonly"
|
|
||||||
},
|
|
||||||
"parserOptions": {
|
|
||||||
"ecmaVersion": 2018,
|
|
||||||
"sourceType": "module"
|
|
||||||
},
|
|
||||||
"rules": {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
github: [eregon]
|
||||||
@@ -0,0 +1,50 @@
|
|||||||
|
name: Bug report
|
||||||
|
description: Create a report to help us improve
|
||||||
|
body:
|
||||||
|
- type: markdown
|
||||||
|
attributes:
|
||||||
|
value: Please note we will close your issue without comment if you do not fill out the requested information.
|
||||||
|
- type: checkboxes
|
||||||
|
attributes:
|
||||||
|
label: Ensure the following before filing this issue
|
||||||
|
options:
|
||||||
|
- label: |
|
||||||
|
I verified it reproduces with the latest version with `- uses: ruby/setup-ruby@v1` (see [Versioning policy](https://github.com/ruby/setup-ruby/blob/master/README.md#versioning))
|
||||||
|
required: true
|
||||||
|
- label: |
|
||||||
|
I tried to reproduce the issue locally by following the workflow steps (including all commands done by `ruby/setup-ruby`, except for `Downloading Ruby` & `Extracting Ruby`),
|
||||||
|
and it did not reproduce locally (if it does reproduce locally, it's not a ruby/setup-ruby issue)
|
||||||
|
required: true
|
||||||
|
# - label: |
|
||||||
|
# If the issue happens on JRuby or TruffleRuby, and does not happen on CRuby (please check), file an issue there instead. It's very unlikely ruby/setup-ruby is the cause.
|
||||||
|
# required: true
|
||||||
|
- type: dropdown
|
||||||
|
attributes:
|
||||||
|
label: Are you running on a GitHub-hosted runner or a self-hosted runner?
|
||||||
|
options:
|
||||||
|
- GitHub-hosted runner
|
||||||
|
- self-hosted runner
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
render: yaml
|
||||||
|
label: The workflow code or a link to the workflow file
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: input
|
||||||
|
attributes:
|
||||||
|
label: Link to the log of a failed workflow job, or to a gist with the output
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
render: shell
|
||||||
|
label: The command and output of the failing step
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Any other notes?
|
||||||
|
validations:
|
||||||
|
required: false
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
blank_issues_enabled: false
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
---
|
||||||
|
name: Other issue (not a bug)
|
||||||
|
about: Feature requests, etc
|
||||||
|
title: ''
|
||||||
|
labels: ''
|
||||||
|
assignees: ''
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
name: Update the v1 branch when a release is published
|
||||||
|
on:
|
||||||
|
release:
|
||||||
|
types: [published]
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
release:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
permissions:
|
||||||
|
contents: write # for git push
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
- run: git push origin HEAD:v1
|
||||||
+276
-72
@@ -3,115 +3,319 @@ on:
|
|||||||
pull_request:
|
pull_request:
|
||||||
push:
|
push:
|
||||||
branches-ignore:
|
branches-ignore:
|
||||||
- master
|
|
||||||
- v1
|
- v1
|
||||||
tags-ignore:
|
tags-ignore:
|
||||||
- '*'
|
- '*'
|
||||||
paths-ignore:
|
paths-ignore:
|
||||||
- README.md
|
- README.md
|
||||||
|
workflow_dispatch:
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
common:
|
test:
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
os: [ ubuntu-16.04, ubuntu-18.04, macos-latest, windows-latest ]
|
os: [ ubuntu-18.04, ubuntu-20.04, ubuntu-22.04, macos-10.15, macos-11, macos-12, windows-2019, windows-2022 ]
|
||||||
# Use various version syntaxes here for testing
|
ruby: [
|
||||||
ruby: [ 2.2, 2.3, .ruby-version, .tool-versions, ruby-head, jruby, jruby-head, truffleruby, truffleruby-head ]
|
'1.9', '2.0', '2.1', '2.2', '2.3', '2.4', '2.5', '2.6', '2.7', '3.0', '3.1', '3.2', ruby-head,
|
||||||
|
jruby, jruby-head,
|
||||||
|
truffleruby, truffleruby-head,
|
||||||
|
truffleruby+graalvm, truffleruby+graalvm-head
|
||||||
|
]
|
||||||
|
include:
|
||||||
|
- { os: windows-2019, ruby: mingw }
|
||||||
|
- { os: windows-2019, ruby: mswin }
|
||||||
|
- { os: windows-2022, ruby: mingw }
|
||||||
|
- { os: windows-2022, ruby: mswin }
|
||||||
|
- { os: windows-2022, ruby: ucrt }
|
||||||
exclude:
|
exclude:
|
||||||
- os: windows-latest
|
- { os: windows-2019, ruby: '1.9' }
|
||||||
ruby: truffleruby
|
- { os: windows-2019, ruby: debug }
|
||||||
- os: windows-latest
|
- { os: windows-2019, ruby: truffleruby }
|
||||||
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 }}
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v3
|
||||||
|
|
||||||
- uses: ./
|
- uses: ./
|
||||||
with:
|
with:
|
||||||
ruby-version: ${{ matrix.ruby }}
|
ruby-version: ${{ matrix.ruby }}
|
||||||
|
bundler-cache: true
|
||||||
- run: ruby -v
|
- run: ruby -v
|
||||||
|
- name: PATH
|
||||||
|
shell: pwsh
|
||||||
|
run: |
|
||||||
|
# Show PATH with Powershell
|
||||||
|
$f, $r = $env:PATH.split([IO.Path]::PathSeparator); $r
|
||||||
|
|
||||||
- name: build compiler
|
- name: build compiler
|
||||||
run: |
|
run: |
|
||||||
ruby -e "puts 'build compiler: ' + RbConfig::CONFIG.fetch('CC_VERSION_MESSAGE', 'unknown').lines.first"
|
ruby -e "puts 'build compiler: ' + RbConfig::CONFIG.fetch('CC_VERSION_MESSAGE', 'unknown').lines.first"
|
||||||
- name: ridk version (mingw)
|
- name: gcc and ridk version (mingw)
|
||||||
if: matrix.os == 'windows-latest'
|
if: startsWith(matrix.os, 'windows')
|
||||||
run: |
|
run: |
|
||||||
$abi, $plat = $(ruby -e "STDOUT.write RbConfig::CONFIG['ruby_version'] + ' ' + RUBY_PLATFORM").split(' ')
|
$abi, $plat = $(ruby -e "STDOUT.write RbConfig::CONFIG['ruby_version'] + ' ' + RUBY_PLATFORM").split(' ')
|
||||||
if (($abi -ge '2.4') -and $plat.Contains('mingw')) {
|
if ($plat.Contains('mingw')) {
|
||||||
ridk version
|
gcc --version
|
||||||
} else {
|
if ($abi -ge '2.4') {
|
||||||
echo 'ridk is unavailable'
|
ridk version
|
||||||
|
} else {
|
||||||
|
echo 'ridk is unavailable'
|
||||||
|
}
|
||||||
|
} elseif ($plat.Contains('mswin')) {
|
||||||
|
&"$env:VCPKG_INSTALLATION_ROOT\vcpkg" list
|
||||||
}
|
}
|
||||||
|
- name: RbConfig::CONFIG
|
||||||
|
run: ruby -rrbconfig -rpp -e 'pp RbConfig::CONFIG'
|
||||||
|
- name: RbConfig::MAKEFILE_CONFIG
|
||||||
|
run: ruby -rrbconfig -rpp -e 'pp RbConfig::MAKEFILE_CONFIG'
|
||||||
|
|
||||||
- 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 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
|
||||||
- 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
|
||||||
- run: bundle install
|
- run: bundle install
|
||||||
- run: bundle exec rake --version
|
- run: bundle exec rake --version
|
||||||
|
- run: bundle exec rake
|
||||||
|
|
||||||
specials:
|
# Ensure the same bundle commands work in bash on Windows
|
||||||
|
- name: bundle install (bash)
|
||||||
|
run: bundle install
|
||||||
|
shell: bash
|
||||||
|
if: startsWith(matrix.os, 'windows')
|
||||||
|
- name: bundle exec rake --version (bash)
|
||||||
|
run: bundle exec rake --version
|
||||||
|
shell: bash
|
||||||
|
if: startsWith(matrix.os, 'windows')
|
||||||
|
- name: bundle exec rake (bash)
|
||||||
|
run: bundle exec rake
|
||||||
|
shell: bash
|
||||||
|
if: startsWith(matrix.os, 'windows')
|
||||||
|
|
||||||
|
- name: Test `gem github:` in a Gemfile
|
||||||
|
run: bundle install
|
||||||
|
env:
|
||||||
|
BUNDLE_GEMFILE: ${{ github.workspace }}/gemfiles/gem_from_github.gemfile
|
||||||
|
|
||||||
|
- name: which ruby, bundle
|
||||||
|
shell: bash
|
||||||
|
run: which -a ruby bundle
|
||||||
|
- name: which rake
|
||||||
|
run: which -a rake
|
||||||
|
if: "!startsWith(matrix.os, 'windows')"
|
||||||
|
- name: where ruby, rake, bundle
|
||||||
|
if: startsWith(matrix.os, 'windows')
|
||||||
|
run: |
|
||||||
|
$ErrorActionPreference = 'Continue'
|
||||||
|
$where = 'ruby', 'rake', 'bundle'
|
||||||
|
foreach ($e in $where) {
|
||||||
|
$rslt = where.exe $e 2>&1 | Out-String
|
||||||
|
if ($rslt.contains($e)) { echo $rslt.Trim() }
|
||||||
|
else { echo "Can't find $e" }
|
||||||
|
echo ''
|
||||||
|
}
|
||||||
|
- name: bash test
|
||||||
|
shell: bash
|
||||||
|
run: echo ~ && bundle install
|
||||||
|
- name: Windows JRuby
|
||||||
|
if: startsWith(matrix.os, 'windows') && startsWith(matrix.ruby, 'jruby')
|
||||||
|
run: gem install sassc
|
||||||
|
|
||||||
|
testNoGemfile:
|
||||||
|
name: "Test with no Gemfile"
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
- run: rm Gemfile
|
||||||
|
- uses: ./
|
||||||
|
with:
|
||||||
|
ruby-version: '2.6'
|
||||||
|
- run: ruby -v
|
||||||
|
|
||||||
|
testLatestRubygemsVersion:
|
||||||
|
name: "Test rubygems: latest upgrades the default RubyGems version"
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
- 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: version upgrades RubyGems to that version if the default is older"
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
- uses: ./
|
||||||
|
with:
|
||||||
|
ruby-version: '2.6'
|
||||||
|
rubygems: 3.2.3
|
||||||
|
- run: gem --version | grep -F "3.2.3"
|
||||||
|
|
||||||
|
testFixedRubygemsVersionNoop:
|
||||||
|
name: "Test rubygems: version noops if the default is newer"
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
- uses: ./
|
||||||
|
with:
|
||||||
|
ruby-version: '3.1.0'
|
||||||
|
rubygems: 3.2.3
|
||||||
|
- run: gem --version | grep -F "3.3.3"
|
||||||
|
|
||||||
|
testUseBundlerFromRubyGemsUpdate:
|
||||||
|
name: "Test rubygems: version uses the Bundler installed by the rubygems update"
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
- uses: ./
|
||||||
|
with:
|
||||||
|
ruby-version: '3.1.0'
|
||||||
|
rubygems: 3.4.0
|
||||||
|
- run: gem --version | grep -F "3.4.0"
|
||||||
|
- run: bundle --version | grep -F "2.4.0"
|
||||||
|
|
||||||
|
testFixedBundlerVersionForOldRuby:
|
||||||
|
name: "Test bundler: 1.x for old Ruby"
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
- uses: ./
|
||||||
|
with:
|
||||||
|
ruby-version: '2.2'
|
||||||
|
bundler: 1.16.6
|
||||||
|
- run: bundle --version | grep -F "1.16.6" # And not 1.17.x from ~> 1
|
||||||
|
|
||||||
|
testMajorBundlerVersion:
|
||||||
|
name: "Test with a major Bundler version"
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
- uses: ./
|
||||||
|
with:
|
||||||
|
ruby-version: '2.6'
|
||||||
|
bundler: 2
|
||||||
|
- run: bundle --version | grep -P "Bundler version 2\.\d+\.\d+"
|
||||||
|
|
||||||
|
testMinorBundlerVersion:
|
||||||
|
name: "Test with a minor Bundler version"
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
- uses: ./
|
||||||
|
with:
|
||||||
|
ruby-version: '2.6'
|
||||||
|
bundler: 2.2
|
||||||
|
- run: bundle --version | grep -P "Bundler version 2\.2\.\d+"
|
||||||
|
|
||||||
|
testExactBundlerVersion:
|
||||||
|
name: "Test with an exact Bundler version"
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
- uses: ./
|
||||||
|
with:
|
||||||
|
ruby-version: '2.6'
|
||||||
|
bundler: 2.2.3
|
||||||
|
- run: bundle --version | grep -F "Bundler version 2.2.3"
|
||||||
|
|
||||||
|
testBundlerPre:
|
||||||
|
name: "Test with a Bundler pre/rc version"
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
- uses: ./
|
||||||
|
with:
|
||||||
|
ruby-version: '2.6'
|
||||||
|
bundler: 2.2.0.rc.2
|
||||||
|
- run: bundle --version | grep -F "Bundler version 2.2.0.rc.2"
|
||||||
|
|
||||||
|
testBundlerDev:
|
||||||
|
name: "Test BUNDLED WITH Bundler dev"
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
env:
|
||||||
|
BUNDLE_GEMFILE: ${{ github.workspace }}/gemfiles/bundler-dev.gemfile
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
- uses: ./
|
||||||
|
with:
|
||||||
|
ruby-version: ruby-head
|
||||||
|
bundler-cache: true
|
||||||
|
|
||||||
|
testDependencyOnBundler1:
|
||||||
|
name: "Test gemfile depending on Bundler 1"
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
env:
|
||||||
|
BUNDLE_GEMFILE: ${{ github.workspace }}/gemfiles/bundler1.gemfile
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
- uses: ./
|
||||||
|
with:
|
||||||
|
ruby-version: '2.7'
|
||||||
|
bundler: 1
|
||||||
|
bundler-cache: true
|
||||||
|
- run: bundle --version | grep -F "Bundler version 1."
|
||||||
|
|
||||||
|
testGemfileMatrix:
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
cfg:
|
gemfile: [ rails5, rails6 ]
|
||||||
- { ruby: rubinius, os: ubuntu-18.04 }
|
name: "Test with ${{ matrix.gemfile }} gemfile"
|
||||||
- { ruby: mingw , os: windows-latest }
|
runs-on: ubuntu-latest
|
||||||
- { ruby: mswin , os: windows-latest }
|
env:
|
||||||
name: ${{ matrix.cfg.os }} ${{ matrix.cfg.ruby }}
|
BUNDLE_GEMFILE: ${{ github.workspace }}/gemfiles/${{ matrix.gemfile }}.gemfile
|
||||||
runs-on: ${{ matrix.cfg.os }}
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v3
|
||||||
- uses: ./
|
- uses: ./
|
||||||
with:
|
with:
|
||||||
ruby-version: ${{ matrix.cfg.ruby }}
|
ruby-version: '2.6'
|
||||||
- run: ruby -v
|
bundler-cache: true
|
||||||
- name: build compiler
|
- run: bundle exec rails --version
|
||||||
run: |
|
|
||||||
ruby -e "puts 'build compiler: ' + RbConfig::CONFIG.fetch('CC_VERSION_MESSAGE', 'unknown').lines.first"
|
testTruffleRubyNokogiri:
|
||||||
- name: ridk version (mingw)
|
name: "Test installing a Gemfile with nokogiri on TruffleRuby"
|
||||||
if: matrix.cfg.os == 'windows-latest'
|
runs-on: ubuntu-latest
|
||||||
run: |
|
env:
|
||||||
$abi, $plat = $(ruby -e "STDOUT.write RbConfig::CONFIG['ruby_version'] + ' ' + RUBY_PLATFORM").split(' ')
|
BUNDLE_GEMFILE: ${{ github.workspace }}/gemfiles/nokogiri.gemfile
|
||||||
if (($abi -ge '2.4') -and $plat.Contains('mingw')) {
|
steps:
|
||||||
ridk version
|
- uses: actions/checkout@v3
|
||||||
} else {
|
- uses: ./
|
||||||
echo 'ridk is unavailable'
|
with:
|
||||||
}
|
ruby-version: truffleruby-head
|
||||||
- name: Subprocess test
|
bundler-cache: true
|
||||||
run: ruby test_subprocess.rb
|
- run: bundle list | grep nokogiri
|
||||||
- name: OpenSSL version
|
|
||||||
run: ruby -ropenssl -e 'puts OpenSSL::OPENSSL_LIBRARY_VERSION'
|
|
||||||
- name: OpenSSL test
|
|
||||||
run: ruby -ropen-uri -e 'puts open(%{https://rubygems.org/}) { |f| f.read(1024) }'
|
|
||||||
- name: C extension test
|
|
||||||
if: endsWith(matrix.cfg.ruby, 'mswin') == false
|
|
||||||
run: gem install json:2.2.0 --no-document
|
|
||||||
- name: C extension test (mswin cmd)
|
|
||||||
if: endsWith(matrix.cfg.ruby, 'mswin')
|
|
||||||
shell: cmd
|
|
||||||
run: |
|
|
||||||
call %VCVARS%
|
|
||||||
gem install json:2.2.0 --no-document
|
|
||||||
- name: C extension test (mswin ps1)
|
|
||||||
if: endsWith(matrix.cfg.ruby, 'mswin')
|
|
||||||
run: |
|
|
||||||
cmd.exe /c "$env:VCVARS && set" | Foreach-Object {
|
|
||||||
$p, $v = $_.split('=')
|
|
||||||
Set-Item -path env:$p -value $v
|
|
||||||
}
|
|
||||||
gem install json:2.2.0 --no-document
|
|
||||||
- run: bundle --version
|
|
||||||
- run: bundle install
|
|
||||||
- run: bundle exec rake --version
|
|
||||||
|
|
||||||
lint:
|
lint:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-20.04
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v3
|
||||||
- run: yarn install
|
- run: yarn install
|
||||||
- run: yarn run lint
|
- run: yarn run package
|
||||||
|
- name: Check generated files are up to date
|
||||||
|
run: git diff --exit-code
|
||||||
|
|||||||
+1
-1
@@ -1,2 +1,2 @@
|
|||||||
nodejs 12.0.0
|
nodejs 16.0.0
|
||||||
ruby 2.7.0
|
ruby 2.7.0
|
||||||
|
|||||||
@@ -0,0 +1,26 @@
|
|||||||
|
# Contributing
|
||||||
|
|
||||||
|
## Installing dependencies
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ yarn install
|
||||||
|
```
|
||||||
|
|
||||||
|
`npm` doesn't install the correct dependencies for `eslint` so we use `yarn`.
|
||||||
|
|
||||||
|
## Regenerating dist/index.js
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ yarn run package
|
||||||
|
```
|
||||||
|
|
||||||
|
It is recommended to add this as a `git` `pre-commit` hook:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ cp pre-commit .git/hooks/pre-commit
|
||||||
|
```
|
||||||
|
|
||||||
|
## Adding a new Ruby version
|
||||||
|
|
||||||
|
This is entirely automated now since [this issue](https://github.com/ruby/setup-ruby/issues/254).
|
||||||
|
If you do not see a new version more than 24 hours after it was released feel free to file an issue.
|
||||||
@@ -1,15 +1,13 @@
|
|||||||
# setup-ruby
|
# setup-ruby
|
||||||
|
|
||||||
Note: this action used to be at `eregon/use-ruby-action` and was moved to the `ruby` organization.
|
|
||||||
Please [update](https://github.com/ruby/setup-ruby/releases/tag/v1.13.0) if you are using `eregon/use-ruby-action`.
|
|
||||||
|
|
||||||
This action downloads a prebuilt ruby and adds it to the `PATH`.
|
This action downloads a prebuilt ruby and adds it to the `PATH`.
|
||||||
|
|
||||||
It is very efficient and takes about 5 seconds to download, extract and add the given Ruby to the `PATH`.
|
It is very efficient and takes about 5 seconds to download, extract and add the given Ruby to the `PATH`.
|
||||||
No extra packages need to be installed.
|
No extra packages need to be installed.
|
||||||
|
|
||||||
Compared to [actions/setup-ruby](https://github.com/actions/setup-ruby),
|
**Important:** Prefer `ruby/setup-ruby@v1`.
|
||||||
this actions supports many more versions and features.
|
If you pin to a commit or release, only the Ruby versions available at the time of the commit
|
||||||
|
will be available, and you will need to update it to use newer Ruby versions, see [Versioning](#versioning).
|
||||||
|
|
||||||
### Supported Versions
|
### Supported Versions
|
||||||
|
|
||||||
@@ -17,37 +15,46 @@ This action currently supports these versions of MRI, JRuby and TruffleRuby:
|
|||||||
|
|
||||||
| Interpreter | Versions |
|
| Interpreter | Versions |
|
||||||
| ----------- | -------- |
|
| ----------- | -------- |
|
||||||
| Ruby | 2.2, 2.3.0 - 2.3.8, 2.4.0 - 2.4.9, 2.5.0 - 2.5.7, 2.6.0 - 2.6.5, 2.7.0, head, mingw, mswin |
|
| `ruby` | 1.9.3, 2.0.0, 2.1.9, 2.2, all versions from 2.3.0 until 3.2.0, head, debug, mingw, mswin, ucrt |
|
||||||
| JRuby | 9.2.9.0 - 9.2.10.0, head |
|
| `jruby` | 9.1.17.0 - 9.4.0.0, head |
|
||||||
| TruffleRuby | 19.3.0 - 20.0.0, head |
|
| `truffleruby` | 19.3.0 - 22.3.0, head |
|
||||||
| Rubinius | 4.14 |
|
| `truffleruby+graalvm` | 21.2.0 - 22.3.0, head |
|
||||||
|
|
||||||
`mingw` and `mswin` are `ruby-head` builds using the MSYS2 and MSVC toolchains on Windows.
|
`ruby-debug` is the same as `ruby-head` but with assertions enabled (`-DRUBY_DEBUG=1`).
|
||||||
Note that Ruby ≤ 2.3 and the OpenSSL version it needs (1.0.2) are both end-of-life,
|
|
||||||
which means Ruby ≤ 2.3 is unmaintained and considered insecure.
|
Regarding Windows ruby master builds, `mingw` is a MSYS2/MinGW build, `head` & `ucrt` are MSYS2/UCRT64
|
||||||
On Windows, Ruby 2.4 uses OpenSSL 1.0.2, which is no longer maintained.
|
builds, and `mswin` is a MSVC/VS 2022 build.
|
||||||
Ruby 2.2 resolves to 2.2.6 on Windows (last build from RubyInstaller) and 2.2.10 otherwise.
|
|
||||||
|
Preview and RC versions of Ruby might be available too on Ubuntu and macOS (not on Windows).
|
||||||
|
However, it is recommended to test against `ruby-head` rather than previews,
|
||||||
|
as it provides more useful feedback for the Ruby core team and for upcoming changes.
|
||||||
|
|
||||||
|
Only release versions published by [RubyInstaller](https://rubyinstaller.org/downloads/archives/)
|
||||||
|
are available on Windows. Due to that, Ruby 2.2 resolves to 2.2.6 on Windows and 2.2.10
|
||||||
|
on other platforms. Ruby 2.3 on Windows only has builds for 2.3.0, 2.3.1 and 2.3.3.
|
||||||
|
|
||||||
|
Note that Ruby ≤ 2.4 and the OpenSSL version it needs (1.0.2) are both end-of-life,
|
||||||
|
which means Ruby ≤ 2.4 is unmaintained and considered insecure.
|
||||||
|
|
||||||
### Supported Platforms
|
### Supported Platforms
|
||||||
|
|
||||||
The action works for all [GitHub-hosted runners](https://help.github.com/en/actions/automating-your-workflow-with-github-actions/virtual-environments-for-github-hosted-runners).
|
The action works on these [GitHub-hosted runners](https://docs.github.com/en/actions/using-github-hosted-runners/about-github-hosted-runners#supported-runners-and-hardware-resources) images. Runner images not listed below are not supported yet. `$OS-latest` just alias to one of these images.
|
||||||
|
|
||||||
| Operating System | Versions |
|
| Operating System | Supported |
|
||||||
| ----------- | -------- |
|
| ---------------- | --------- |
|
||||||
| Ubuntu | `ubuntu-latest` (= `ubuntu-18.04`), `ubuntu-16.04` |
|
| Ubuntu | `ubuntu-18.04`, `ubuntu-20.04`, `ubuntu-22.04` |
|
||||||
| macOS | `macos-latest` |
|
| macOS | `macos-10.15`, `macos-11`, `macos-12` |
|
||||||
| Windows | `windows-latest` |
|
| Windows | `windows-2019`, `windows-2022` |
|
||||||
|
|
||||||
Rubinius is only available on `ubuntu-latest`.
|
|
||||||
|
|
||||||
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).
|
The `mingw`, `ucrt` 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
|
||||||
|
|
||||||
@@ -55,105 +62,215 @@ for Ubuntu and macOS and in [windows-versions.js](windows-versions.js) for Windo
|
|||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
name: My workflow
|
name: My workflow
|
||||||
on: [push]
|
on: [push, pull_request]
|
||||||
jobs:
|
jobs:
|
||||||
test:
|
test:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v3
|
||||||
- uses: ruby/setup-ruby@v1
|
- uses: ruby/setup-ruby@v1
|
||||||
with:
|
with:
|
||||||
ruby-version: 2.6
|
ruby-version: '3.0' # Not needed with a .ruby-version file
|
||||||
- run: ruby -v
|
bundler-cache: true # runs 'bundle install' and caches installed gems automatically
|
||||||
|
- run: bundle exec rake
|
||||||
```
|
```
|
||||||
|
|
||||||
### Matrix
|
### Matrix of Ruby Versions
|
||||||
|
|
||||||
This matrix tests all stable releases of MRI, JRuby and TruffleRuby on Ubuntu and macOS.
|
This matrix tests all stable releases and `head` versions of MRI, JRuby and TruffleRuby on Ubuntu and macOS.
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
name: My workflow
|
name: My workflow
|
||||||
on: [push]
|
on: [push, pull_request]
|
||||||
jobs:
|
jobs:
|
||||||
test:
|
test:
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
os: [ ubuntu-latest, macos-latest ]
|
os: [ubuntu-latest, macos-latest]
|
||||||
ruby: [ 2.4, 2.5, 2.6, 2.7, jruby, truffleruby ]
|
# Due to https://github.com/actions/runner/issues/849, we have to use quotes for '3.0'
|
||||||
|
ruby: ['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@v3
|
||||||
- uses: ruby/setup-ruby@v1
|
- uses: ruby/setup-ruby@v1
|
||||||
with:
|
with:
|
||||||
ruby-version: ${{ matrix.ruby }}
|
ruby-version: ${{ matrix.ruby }}
|
||||||
- run: ruby -v
|
bundler-cache: true # runs 'bundle install' and caches installed gems automatically
|
||||||
|
- run: bundle exec rake
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Matrix of Gemfiles
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
name: My workflow
|
||||||
|
on: [push, pull_request]
|
||||||
|
jobs:
|
||||||
|
test:
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
gemfile: [ rails5, rails6 ]
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
env: # $BUNDLE_GEMFILE must be set at the job level, so it is set for all steps
|
||||||
|
BUNDLE_GEMFILE: ${{ github.workspace }}/gemfiles/${{ matrix.gemfile }}.gemfile
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
- uses: ruby/setup-ruby@v1
|
||||||
|
with:
|
||||||
|
ruby-version: '3.0'
|
||||||
|
bundler-cache: true # runs 'bundle install' and caches installed gems automatically
|
||||||
|
- run: bundle exec rake
|
||||||
|
```
|
||||||
|
|
||||||
|
See the GitHub Actions documentation for more details about the
|
||||||
|
[workflow syntax](https://help.github.com/en/actions/reference/workflow-syntax-for-github-actions)
|
||||||
|
and the [condition and expression syntax](https://help.github.com/en/actions/reference/context-and-expression-syntax-for-github-actions).
|
||||||
|
|
||||||
### Supported Version Syntax
|
### Supported Version Syntax
|
||||||
|
|
||||||
* engine-version like `ruby-2.6.5` and `truffleruby-19.3.0`
|
* engine-version like `ruby-2.6.5` and `truffleruby-19.3.0`
|
||||||
* short version like `2.6`, automatically using the latest release matching that version (`2.6.5`)
|
* short version like `'2.6'`, automatically using the latest release matching that version (`2.6.10`)
|
||||||
* version only like `2.6.5`, assumes MRI for the engine
|
* version only like `'2.6.5'`, assumes MRI for the engine
|
||||||
* engine only like `truffleruby`, uses the latest stable release of that implementation
|
* engine only like `ruby` and `truffleruby`, uses the latest stable release of that implementation
|
||||||
* `.ruby-version` reads from the project's `.ruby-version` file
|
* `.ruby-version` reads from the project's `.ruby-version` file
|
||||||
* `.tool-versions` reads from the project's `.tool-versions` file
|
* `.tool-versions` reads from the project's `.tool-versions` file
|
||||||
* If the `ruby-version` input is not specified, `.ruby-version` is tried first, followed by `.tool-versions`
|
* If the `ruby-version` input is not specified, `.ruby-version` is tried first, followed by `.tool-versions`
|
||||||
|
|
||||||
|
### Working Directory
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
### 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
|
||||||
|
|
||||||
Currently, Bundler is guaranteed to be installed for all versions.
|
By default, Bundler is installed as follows:
|
||||||
If the Ruby ships with Bundler (Ruby >= 2.6), that version is used.
|
|
||||||
Otherwise (Ruby < 2.6), Bundler 1 is installed when that Ruby was built.
|
|
||||||
|
|
||||||
### Caching `bundle install`
|
* If there is a `Gemfile.lock` file (or `$BUNDLE_GEMFILE.lock` or `gems.locked`) with a `BUNDLED WITH` section,
|
||||||
|
that version of Bundler will be installed and used.
|
||||||
|
* If the Ruby ships with Bundler 2.2+ (as a default gem), that version is used.
|
||||||
|
* Otherwise, the latest compatible Bundler version is installed (Bundler 2 on Ruby >= 2.3, Bundler 1 on Ruby < 2.3).
|
||||||
|
|
||||||
You can cache the installed gems with these two steps:
|
This behavior can be customized, see [action.yml](action.yml) for more details about the `bundler` input.
|
||||||
|
|
||||||
|
### Caching `bundle install` automatically
|
||||||
|
|
||||||
|
This action provides a way to automatically run `bundle install` and cache the result:
|
||||||
```yaml
|
```yaml
|
||||||
- uses: actions/cache@v1
|
- uses: ruby/setup-ruby@v1
|
||||||
with:
|
with:
|
||||||
path: vendor/bundle
|
bundler-cache: true
|
||||||
key: bundle-use-ruby-${{ matrix.os }}-${{ matrix.ruby }}-${{ hashFiles('**/Gemfile.lock') }}
|
|
||||||
restore-keys: |
|
|
||||||
bundle-use-ruby-${{ matrix.os }}-${{ matrix.ruby }}-
|
|
||||||
- name: bundle install
|
|
||||||
run: |
|
|
||||||
bundle config path vendor/bundle
|
|
||||||
bundle install --jobs 4 --retry 3
|
|
||||||
```
|
```
|
||||||
|
|
||||||
When using a single OS, replace `${{ matrix.os }}` with the OS.
|
Note that any step doing `bundle install` (for the root `Gemfile`) or `gem install bundler` can be removed with `bundler-cache: true`.
|
||||||
When using a single job with a Ruby version, replace `${{ matrix.ruby }}` with the Ruby version.
|
|
||||||
When using `.ruby-version`, replace `${{ matrix.ruby }}` with `${{ hashFiles('.ruby-version') }}`.
|
|
||||||
When using `.tool-versions`, replace `${{ matrix.ruby }}` with `${{ hashFiles('.tool-versions') }}`.
|
|
||||||
|
|
||||||
This uses the [cache action](https://github.com/actions/cache).
|
This caching speeds up installing gems significantly and avoids too many requests to RubyGems.org.
|
||||||
The code above is a more complete version of the [Ruby - Bundler example](https://github.com/actions/cache/blob/master/examples.md#ruby---bundler).
|
It needs a `Gemfile` (or `$BUNDLE_GEMFILE` or `gems.rb`) under the [`working-directory`](#working-directory).
|
||||||
Make sure to include `use-ruby` in the `key` to avoid conflicting with previous caches.
|
If there is a `Gemfile.lock` (or `$BUNDLE_GEMFILE.lock` or `gems.locked`), `bundle config --local deployment true` is used.
|
||||||
|
|
||||||
|
To use a `Gemfile` which is not at the root or has a different name, set `BUNDLE_GEMFILE` in the `env` at the job level
|
||||||
|
as shown in the [example](#matrix-of-gemfiles).
|
||||||
|
|
||||||
|
#### bundle config
|
||||||
|
|
||||||
|
When using `bundler-cache: true` you might notice there is no good place to run `bundle config ...` commands.
|
||||||
|
These can be replaced by `BUNDLE_*` environment variables, which are also faster.
|
||||||
|
They should be set in the `env` at the job level as shown in the [example](#matrix-of-gemfiles).
|
||||||
|
To find the correct the environment variable name, see the [Bundler docs](https://bundler.io/man/bundle-config.1.html) or look at `.bundle/config` after running `bundle config --local KEY VALUE` locally.
|
||||||
|
You might need to `"`-quote the environment variable name in YAML if it has unusual characters like `/`.
|
||||||
|
|
||||||
|
To perform caching, this action will use `bundle config --local path $PWD/vendor/bundle`.
|
||||||
|
Therefore, the Bundler `path` should not be changed in your workflow for the cache to work (no `bundle config path`).
|
||||||
|
|
||||||
|
#### How it Works
|
||||||
|
|
||||||
|
When there is no lockfile, one is generated with `bundle lock`, which is the same as `bundle install` would do first before actually fetching any gem.
|
||||||
|
In other words, it works exactly like `bundle install`.
|
||||||
|
The hash of the generated lockfile is then used for caching, which is the only correct approach.
|
||||||
|
|
||||||
|
#### Dealing with a corrupted cache
|
||||||
|
|
||||||
|
In some rare scenarios (like using gems with C extensions whose functionality depends on libraries found on the system
|
||||||
|
at the time of the gem's build) it may be necessary to ignore contents of the cache and get and build all the gems anew.
|
||||||
|
In order to achieve this, set the `cache-version` option to any value other than `0` (or change it to a new unique value
|
||||||
|
if you have already used it before.)
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
- uses: ruby/setup-ruby@v1
|
||||||
|
with:
|
||||||
|
bundler-cache: true
|
||||||
|
cache-version: 1
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Caching `bundle install` manually
|
||||||
|
|
||||||
|
It is also possible to cache gems manually, but this is not recommended because it is verbose and *very difficult* to do correctly.
|
||||||
|
There are many concerns which means using `actions/cache` is never enough for caching gems (e.g., incomplete cache key, cleaning old gems when restoring from another key, correctly hashing the lockfile if not checked in, OS versions, ABI compatibility for `ruby-head`, etc).
|
||||||
|
So, please use `bundler-cache: true` instead and report any issue.
|
||||||
|
|
||||||
## Windows
|
## Windows
|
||||||
|
|
||||||
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.
|
||||||
* MSYS2 is prepended to the `PATH`, similar to what RubyInstaller2 does.
|
* For Ruby ≥ 2.4, MSYS2 is prepended to the `Path`, similar to what RubyInstaller2 does.
|
||||||
* JRuby on Windows has a known bug that `bundle exec rake` [fails](https://github.com/ruby/setup-ruby/issues/18).
|
* For Ruby < 2.4, the DevKit MSYS tools are installed and prepended to the `Path`.
|
||||||
|
* Use JRuby 9.2.20+ on Windows (older versions have [bugs](https://github.com/ruby/setup-ruby/issues/18#issuecomment-889072695)).
|
||||||
## Limitations
|
* JRuby on Windows has multiple issues ([jruby/jruby#7106](https://github.com/jruby/jruby/issues/7106), [jruby/jruby#7182](https://github.com/jruby/jruby/issues/7182)).
|
||||||
|
|
||||||
* This action currently only works with GitHub-hosted runners, not private runners.
|
|
||||||
|
|
||||||
## Versioning
|
## Versioning
|
||||||
|
|
||||||
|
It is highly recommended to use `ruby/setup-ruby@v1` for the version of this action.
|
||||||
|
This will provide the best experience by automatically getting bug fixes, new Ruby versions and new features.
|
||||||
|
|
||||||
|
If you instead choose a specific version (v1.2.3) or a commit sha, there will be no automatic bug fixes and
|
||||||
|
it will be your responsibility to update every time the action no longer works.
|
||||||
|
Make sure to always use the latest release before reporting an issue on GitHub.
|
||||||
|
|
||||||
This action follows semantic versioning with a moving `v1` branch.
|
This action follows semantic versioning with a moving `v1` branch.
|
||||||
This follows the [recommendations](https://github.com/actions/toolkit/blob/master/docs/action-versioning.md) of GitHub Actions.
|
This follows the [recommendations](https://github.com/actions/toolkit/blob/master/docs/action-versioning.md) of GitHub Actions.
|
||||||
|
|
||||||
|
## Using self-hosted runners
|
||||||
|
|
||||||
|
This action might work with [self-hosted runners](https://docs.github.com/en/actions/hosting-your-own-runners/about-self-hosted-runners)
|
||||||
|
if the [Runner Image](https://github.com/actions/runner-images) is very similar to the ones used by GitHub runners. Notably:
|
||||||
|
|
||||||
|
* Make sure to use the same operating system and version.
|
||||||
|
* Set the environment variable `ImageOS` on the runner to the corresponding value on GitHub-hosted runners (e.g. `ubuntu18`/`macos1015`/`win19`). This is necessary to detect the operating system and version.
|
||||||
|
* Make sure to use the same version of libssl.
|
||||||
|
* Make sure that the operating system has `libyaml-0` and [`libgmp`](https://stackoverflow.com/questions/26555902/ruby-v-dyld-library-not-loaded-usr-local-lib-libgmp-10-dylib) installed
|
||||||
|
* The default tool cache directory (`/opt/hostedtoolcache` on Linux, `/Users/runner/hostedtoolcache` on macOS,
|
||||||
|
`C:/hostedtoolcache/windows` on Windows) must be writable by the `runner` user.
|
||||||
|
This is necessary since the Ruby builds embed the install path when built and cannot be moved around.
|
||||||
|
* `/home/runner` must be writable by the `runner` user.
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
This action used to be at `eregon/use-ruby-action` and was moved to the `ruby` organization.
|
||||||
|
Please [update](https://github.com/ruby/setup-ruby/releases/tag/v1.13.0) if you are using `eregon/use-ruby-action`.
|
||||||
|
|
||||||
## Credits
|
## Credits
|
||||||
|
|
||||||
The current maintainer of this action is @eregon.
|
The current maintainer of this action is @eregon.
|
||||||
Most of the Windows logic is from https://github.com/MSP-Greg/actions-ruby by MSP-Greg.
|
Most of the Windows logic is based on work by MSP-Greg.
|
||||||
Many thanks to MSP-Greg and Lars Kanis for the help with Ruby Installer.
|
Many thanks to MSP-Greg and Lars Kanis for the help with Ruby Installer.
|
||||||
|
|||||||
+24
-3
@@ -6,12 +6,33 @@ branding:
|
|||||||
icon: download
|
icon: download
|
||||||
inputs:
|
inputs:
|
||||||
ruby-version:
|
ruby-version:
|
||||||
description: 'Engine and version to use, see the syntax in the README. Reads from .ruby-version 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
|
|
||||||
default: 'default'
|
default: 'default'
|
||||||
|
rubygems:
|
||||||
|
description: |
|
||||||
|
The version of RubyGems to use. Either 'default' (the 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.
|
||||||
|
bundler:
|
||||||
|
description: |
|
||||||
|
The version of Bundler to install. Either 'Gemfile.lock' (the default), 'default', 'latest', 'none', or a version number (e.g., 1, 2, 2.1, 2.1.4).
|
||||||
|
For 'Gemfile.lock', the version of the BUNDLED WITH section from the Gemfile.lock if it exists. If the file or section does not exist then the same as 'default'.
|
||||||
|
For 'default', if the Ruby ships with Bundler 2.2+ as a default gem, that version is used, otherwise the same as 'latest'.
|
||||||
|
For 'latest', the latest compatible Bundler version is installed (Bundler 2 on Ruby >= 2.3, Bundler 1 on Ruby < 2.3).
|
||||||
|
For 'none', nothing is done.
|
||||||
|
bundler-cache:
|
||||||
|
description: 'Run "bundle install", and cache the result automatically. Either true or false.'
|
||||||
|
default: 'false'
|
||||||
|
working-directory:
|
||||||
|
description: 'The working directory to use for resolving paths for .ruby-version, .tool-versions and Gemfile.lock.'
|
||||||
|
cache-version:
|
||||||
|
description: |
|
||||||
|
Arbitrary string that will be added to the cache key of the bundler cache. Set or change it if you need
|
||||||
|
to invalidate the cache.
|
||||||
outputs:
|
outputs:
|
||||||
ruby-prefix:
|
ruby-prefix:
|
||||||
description: 'The prefix of the installed ruby'
|
description: 'The prefix of the installed ruby'
|
||||||
runs:
|
runs:
|
||||||
using: 'node12'
|
using: 'node16'
|
||||||
main: 'dist/index.js'
|
main: 'dist/index.js'
|
||||||
|
|||||||
+256
@@ -0,0 +1,256 @@
|
|||||||
|
const fs = require('fs')
|
||||||
|
const path = require('path')
|
||||||
|
const core = require('@actions/core')
|
||||||
|
const exec = require('@actions/exec')
|
||||||
|
const cache = require('@actions/cache')
|
||||||
|
const common = require('./common')
|
||||||
|
|
||||||
|
export const DEFAULT_CACHE_VERSION = '0'
|
||||||
|
|
||||||
|
function isValidBundlerVersion(bundlerVersion) {
|
||||||
|
return /^\d+(?:\.\d+){0,2}/.test(bundlerVersion) && !bundlerVersion.endsWith('.dev')
|
||||||
|
}
|
||||||
|
|
||||||
|
// The returned gemfile is guaranteed to exist, the lockfile might not exist
|
||||||
|
export function detectGemfiles() {
|
||||||
|
const gemfilePath = process.env['BUNDLE_GEMFILE'] || 'Gemfile'
|
||||||
|
if (fs.existsSync(gemfilePath)) {
|
||||||
|
return [gemfilePath, `${gemfilePath}.lock`]
|
||||||
|
} else if (process.env['BUNDLE_GEMFILE']) {
|
||||||
|
throw new Error(`$BUNDLE_GEMFILE is set to ${gemfilePath} but does not exist`)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fs.existsSync("gems.rb")) {
|
||||||
|
return ["gems.rb", "gems.locked"]
|
||||||
|
}
|
||||||
|
|
||||||
|
return [null, null]
|
||||||
|
}
|
||||||
|
|
||||||
|
function readBundledWithFromGemfileLock(lockFile) {
|
||||||
|
if (lockFile !== null && fs.existsSync(lockFile)) {
|
||||||
|
const contents = fs.readFileSync(lockFile, 'utf8')
|
||||||
|
const lines = contents.split(/\r?\n/)
|
||||||
|
const bundledWithLine = lines.findIndex(line => /^BUNDLED WITH$/.test(line.trim()))
|
||||||
|
if (bundledWithLine !== -1) {
|
||||||
|
const nextLine = lines[bundledWithLine+1]
|
||||||
|
if (nextLine) {
|
||||||
|
const bundlerVersion = nextLine.trim()
|
||||||
|
if (isValidBundlerVersion(bundlerVersion)) {
|
||||||
|
console.log(`Using Bundler ${bundlerVersion} from ${lockFile} BUNDLED WITH ${bundlerVersion}`)
|
||||||
|
return bundlerVersion
|
||||||
|
} else {
|
||||||
|
console.log(`Could not parse BUNDLED WITH version as a valid Bundler release, ignoring it: ${bundlerVersion}`)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
|
||||||
|
async function afterLockFile(lockFile, platform, engine, rubyVersion) {
|
||||||
|
if (engine.startsWith('truffleruby') && common.floatVersion(rubyVersion) < 21.1 && platform.startsWith('ubuntu-')) {
|
||||||
|
const contents = fs.readFileSync(lockFile, 'utf8')
|
||||||
|
if (contents.includes('nokogiri')) {
|
||||||
|
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 }))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function installBundler(bundlerVersionInput, rubygemsInputSet, lockFile, platform, rubyPrefix, engine, rubyVersion) {
|
||||||
|
let bundlerVersion = bundlerVersionInput
|
||||||
|
|
||||||
|
if (rubygemsInputSet && (bundlerVersion === 'default' || bundlerVersion === 'Gemfile.lock')) {
|
||||||
|
console.log('Using the Bundler installed by updating RubyGems')
|
||||||
|
return 'unknown'
|
||||||
|
}
|
||||||
|
|
||||||
|
if (bundlerVersion === 'Gemfile.lock') {
|
||||||
|
let bundlerVersionFromGemfileLock = readBundledWithFromGemfileLock(lockFile)
|
||||||
|
|
||||||
|
if (bundlerVersionFromGemfileLock) {
|
||||||
|
bundlerVersion = bundlerVersionFromGemfileLock
|
||||||
|
} else {
|
||||||
|
bundlerVersion = 'default'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const floatVersion = common.floatVersion(rubyVersion)
|
||||||
|
|
||||||
|
if (bundlerVersion === 'default') {
|
||||||
|
if (common.isBundler2dot2Default(engine, rubyVersion)) {
|
||||||
|
if (common.windows && engine === 'ruby' && (common.isStableVersion(rubyVersion) || rubyVersion === 'head')) {
|
||||||
|
// https://github.com/ruby/setup-ruby/issues/371
|
||||||
|
console.log(`Installing latest Bundler for ${engine}-${rubyVersion} on Windows because bin/bundle does not work in bash otherwise`)
|
||||||
|
bundlerVersion = 'latest'
|
||||||
|
} else {
|
||||||
|
console.log(`Using Bundler 2 shipped with ${engine}-${rubyVersion}`)
|
||||||
|
return '2'
|
||||||
|
}
|
||||||
|
} else if (common.hasBundlerDefaultGem(engine, rubyVersion)) {
|
||||||
|
// Those Rubies have a old Bundler default gem < 2.2 which does not work well for `gem 'foo', github: 'foo/foo'`:
|
||||||
|
// https://github.com/ruby/setup-ruby/issues/358#issuecomment-1195899304
|
||||||
|
// Also, Ruby 2.6 would get Bundler 1 yet Ruby 2.3 - 2.5 get latest Bundler 2 which might be unexpected.
|
||||||
|
console.log(`Using latest Bundler for ${engine}-${rubyVersion} because the default Bundler gem is too old for that Ruby version`)
|
||||||
|
bundlerVersion = 'latest'
|
||||||
|
} else {
|
||||||
|
bundlerVersion = 'latest'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (bundlerVersion === 'latest') {
|
||||||
|
bundlerVersion = '2'
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isValidBundlerVersion(bundlerVersion)) {
|
||||||
|
// OK - input is a 1, 2, or 3 part version number
|
||||||
|
} else {
|
||||||
|
throw new Error(`Cannot parse bundler input: ${bundlerVersion}`)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Use Bundler 1 when we know Bundler 2 does not work
|
||||||
|
if (bundlerVersion.startsWith('2')) {
|
||||||
|
if (engine === 'ruby' && floatVersion <= 2.2) {
|
||||||
|
console.log('Bundler 2 requires Ruby 2.3+, using Bundler 1 on Ruby <= 2.2')
|
||||||
|
bundlerVersion = '1'
|
||||||
|
} 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')
|
||||||
|
bundlerVersion = '1'
|
||||||
|
} else if (engine === 'jruby' && rubyVersion.startsWith('9.1')) { // JRuby 9.1 targets Ruby 2.3, treat it the same
|
||||||
|
console.log('JRuby 9.1 has a bug with Bundler 2 (https://github.com/ruby/setup-ruby/issues/108), using Bundler 1 instead on JRuby 9.1')
|
||||||
|
bundlerVersion = '1'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const targetRubyVersion = common.targetRubyVersion(engine, rubyVersion)
|
||||||
|
// Use Bundler 2.3 when we use Ruby 2.3.2 - 2.5
|
||||||
|
// Use Bundler 2.4 when we use Ruby 2.6-2.7
|
||||||
|
if (bundlerVersion === '2') {
|
||||||
|
if (targetRubyVersion <= 2.5) { // < 2.3.2 already handled above
|
||||||
|
console.log('Ruby 2.3.2 - 2.5 only works with Bundler 2.3')
|
||||||
|
bundlerVersion = '2.3'
|
||||||
|
} else if (targetRubyVersion <= 2.7) {
|
||||||
|
console.log('Ruby 2.6-2.7 only works with Bundler 2.4')
|
||||||
|
bundlerVersion = '2.4'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const gem = path.join(rubyPrefix, 'bin', 'gem')
|
||||||
|
// Workaround for https://github.com/rubygems/rubygems/issues/5245
|
||||||
|
// and for https://github.com/oracle/truffleruby/issues/2780
|
||||||
|
const force = ((platform.startsWith('windows-') && engine === 'ruby' && floatVersion >= 3.1) || (engine === 'truffleruby')) ? ['--force'] : []
|
||||||
|
|
||||||
|
const versionParts = [...bundlerVersion.matchAll(/\d+/g)].length
|
||||||
|
const bundlerVersionConstraint = versionParts >= 3 ? bundlerVersion : `~> ${bundlerVersion}.0`
|
||||||
|
|
||||||
|
await exec.exec(gem, ['install', 'bundler', ...force, '-v', bundlerVersionConstraint])
|
||||||
|
|
||||||
|
if (bundlerVersion.startsWith('1') && common.isBundler2Default(engine, rubyVersion)) {
|
||||||
|
// If Bundler 1 is specified on Rubies which ship with Bundler 2,
|
||||||
|
// we need to specify which Bundler version to use explicitly until the lockfile exists.
|
||||||
|
// We actually set it globally for the case of bundler-cache: false with manual bundler install later.
|
||||||
|
console.log(`Setting BUNDLER_VERSION=${bundlerVersion} to ensure Bundler 1 is used`)
|
||||||
|
core.exportVariable('BUNDLER_VERSION', bundlerVersion)
|
||||||
|
}
|
||||||
|
|
||||||
|
return bundlerVersion
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function bundleInstall(gemfile, lockFile, platform, engine, rubyVersion, bundlerVersion, cacheVersion) {
|
||||||
|
if (gemfile === null) {
|
||||||
|
console.log('Could not determine gemfile path, skipping "bundle install" and caching')
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
// config
|
||||||
|
const cachePath = 'vendor/bundle'
|
||||||
|
// An absolute path, so it is reliably under $PWD/vendor/bundle, and not relative to the gemfile's directory
|
||||||
|
const bundleCachePath = path.join(process.cwd(), cachePath)
|
||||||
|
|
||||||
|
await exec.exec('bundle', ['config', '--local', 'path', bundleCachePath])
|
||||||
|
|
||||||
|
if (fs.existsSync(lockFile)) {
|
||||||
|
await exec.exec('bundle', ['config', '--local', 'deployment', 'true'])
|
||||||
|
} else {
|
||||||
|
// Generate the lockfile so we can use it to compute the cache key.
|
||||||
|
// This will also automatically pick up the latest gem versions compatible with the Gemfile.
|
||||||
|
await exec.exec('bundle', ['lock'])
|
||||||
|
}
|
||||||
|
|
||||||
|
await afterLockFile(lockFile, platform, engine, rubyVersion)
|
||||||
|
|
||||||
|
// cache key
|
||||||
|
const paths = [cachePath]
|
||||||
|
const baseKey = await computeBaseKey(platform, engine, rubyVersion, lockFile, cacheVersion)
|
||||||
|
const key = `${baseKey}-${await common.hashFile(lockFile)}`
|
||||||
|
// If only Gemfile.lock changes we can reuse part of the cache, and clean old gem versions below
|
||||||
|
const restoreKeys = [`${baseKey}-`]
|
||||||
|
console.log(`Cache key: ${key}`)
|
||||||
|
|
||||||
|
// restore cache & install
|
||||||
|
let cachedKey = null
|
||||||
|
try {
|
||||||
|
cachedKey = await cache.restoreCache(paths, key, restoreKeys)
|
||||||
|
} catch (error) {
|
||||||
|
if (error.name === cache.ValidationError.name) {
|
||||||
|
throw error;
|
||||||
|
} else {
|
||||||
|
core.info(`[warning] There was an error restoring the cache ${error.message}`)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cachedKey) {
|
||||||
|
console.log(`Found cache for key: ${cachedKey}`)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Always run 'bundle install' to list the gems
|
||||||
|
await exec.exec('bundle', ['install', '--jobs', '4'])
|
||||||
|
|
||||||
|
// @actions/cache only allows to save for non-existing keys
|
||||||
|
if (cachedKey !== key) {
|
||||||
|
if (cachedKey) { // existing cache but Gemfile.lock differs, clean old gems
|
||||||
|
await exec.exec('bundle', ['clean'])
|
||||||
|
}
|
||||||
|
|
||||||
|
// Error handling from https://github.com/actions/cache/blob/master/src/save.ts
|
||||||
|
console.log('Saving cache')
|
||||||
|
try {
|
||||||
|
await cache.saveCache(paths, key)
|
||||||
|
} catch (error) {
|
||||||
|
if (error.name === cache.ValidationError.name) {
|
||||||
|
throw error;
|
||||||
|
} else if (error.name === cache.ReserveCacheError.name) {
|
||||||
|
core.info(error.message);
|
||||||
|
} else {
|
||||||
|
core.info(`[warning]${error.message}`)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
async function computeBaseKey(platform, engine, version, lockFile, cacheVersion) {
|
||||||
|
const cacheVersionSuffix = DEFAULT_CACHE_VERSION === cacheVersion ? '' : `-cachever:${cacheVersion}`
|
||||||
|
let key = `setup-ruby-bundler-cache-v4-${platform}-${engine}-${version}${cacheVersionSuffix}`
|
||||||
|
|
||||||
|
if (common.isHeadVersion(version)) {
|
||||||
|
if (engine !== 'jruby') {
|
||||||
|
let print_abi = "print RbConfig::CONFIG['ruby_version']"
|
||||||
|
let abi = ''
|
||||||
|
await exec.exec('ruby', ['-e', print_abi], {
|
||||||
|
silent: true,
|
||||||
|
listeners: {
|
||||||
|
stdout: (data) => {
|
||||||
|
abi += data.toString();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
key += `-ABI-${abi}`
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
key += `-${lockFile}`
|
||||||
|
return key
|
||||||
|
}
|
||||||
@@ -0,0 +1,268 @@
|
|||||||
|
const os = require('os')
|
||||||
|
const path = require('path')
|
||||||
|
const fs = require('fs')
|
||||||
|
const util = require('util')
|
||||||
|
const stream = require('stream')
|
||||||
|
const crypto = require('crypto')
|
||||||
|
const core = require('@actions/core')
|
||||||
|
const { performance } = require('perf_hooks')
|
||||||
|
|
||||||
|
export const windows = (os.platform() === 'win32')
|
||||||
|
// Extract to SSD on Windows, see https://github.com/ruby/setup-ruby/pull/14
|
||||||
|
export const drive = (windows ? (process.env['GITHUB_WORKSPACE'] || 'C')[0] : undefined)
|
||||||
|
|
||||||
|
export function partition(string, separator) {
|
||||||
|
const i = string.indexOf(separator)
|
||||||
|
if (i === -1) {
|
||||||
|
throw new Error(`No separator ${separator} in string ${string}`)
|
||||||
|
}
|
||||||
|
return [string.slice(0, i), string.slice(i + separator.length, string.length)]
|
||||||
|
}
|
||||||
|
|
||||||
|
let inGroup = false
|
||||||
|
|
||||||
|
export async function measure(name, block) {
|
||||||
|
const body = async () => {
|
||||||
|
const start = performance.now()
|
||||||
|
try {
|
||||||
|
return await block()
|
||||||
|
} finally {
|
||||||
|
const end = performance.now()
|
||||||
|
const duration = (end - start) / 1000.0
|
||||||
|
console.log(`Took ${duration.toFixed(2).padStart(6)} seconds`)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (inGroup) {
|
||||||
|
// Nested groups are not yet supported on GitHub Actions
|
||||||
|
console.log(`> ${name}`)
|
||||||
|
return await body()
|
||||||
|
} else {
|
||||||
|
inGroup = true
|
||||||
|
try {
|
||||||
|
return await core.group(name, body)
|
||||||
|
} finally {
|
||||||
|
inGroup = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export function isHeadVersion(rubyVersion) {
|
||||||
|
return ['head', 'debug', 'mingw', 'mswin', 'ucrt'].includes(rubyVersion)
|
||||||
|
}
|
||||||
|
|
||||||
|
export function isStableVersion(rubyVersion) {
|
||||||
|
return /^\d+(\.\d+)*$/.test(rubyVersion)
|
||||||
|
}
|
||||||
|
|
||||||
|
export function hasBundlerDefaultGem(engine, rubyVersion) {
|
||||||
|
return isBundler1Default(engine, rubyVersion) || isBundler2Default(engine, rubyVersion)
|
||||||
|
}
|
||||||
|
|
||||||
|
export function isBundler1Default(engine, rubyVersion) {
|
||||||
|
if (engine === 'ruby') {
|
||||||
|
return floatVersion(rubyVersion) >= 2.6 && floatVersion(rubyVersion) < 2.7
|
||||||
|
} else if (engine.startsWith('truffleruby')) {
|
||||||
|
return floatVersion(rubyVersion) < 21.0
|
||||||
|
} else if (engine === 'jruby') {
|
||||||
|
return false
|
||||||
|
} else {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export function isBundler2Default(engine, rubyVersion) {
|
||||||
|
if (engine === 'ruby') {
|
||||||
|
return floatVersion(rubyVersion) >= 2.7
|
||||||
|
} else if (engine.startsWith('truffleruby')) {
|
||||||
|
return floatVersion(rubyVersion) >= 21.0
|
||||||
|
} else if (engine === 'jruby') {
|
||||||
|
return floatVersion(rubyVersion) >= 9.3
|
||||||
|
} else {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export function isBundler2dot2Default(engine, rubyVersion) {
|
||||||
|
if (engine === 'ruby') {
|
||||||
|
return floatVersion(rubyVersion) >= 3.0
|
||||||
|
} else if (engine.startsWith('truffleruby')) {
|
||||||
|
return floatVersion(rubyVersion) >= 22.0
|
||||||
|
} else if (engine === 'jruby') {
|
||||||
|
return floatVersion(rubyVersion) >= 9.3
|
||||||
|
} else {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export function targetRubyVersion(engine, rubyVersion) {
|
||||||
|
const version = floatVersion(rubyVersion)
|
||||||
|
if (engine === 'ruby') {
|
||||||
|
return version
|
||||||
|
} else if (engine === 'jruby') {
|
||||||
|
if (version === 9.1) {
|
||||||
|
return 2.3
|
||||||
|
} else if (version === 9.2) {
|
||||||
|
return 2.5
|
||||||
|
} else if (version === 9.3) {
|
||||||
|
return 2.6
|
||||||
|
}
|
||||||
|
} else if (engine.startsWith('truffleruby')) {
|
||||||
|
if (version < 21.0) {
|
||||||
|
return 2.6
|
||||||
|
} else if (version < 22.0) {
|
||||||
|
return 2.7
|
||||||
|
} else if (version < 23.0) {
|
||||||
|
return 3.0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 9.9 // unknown, assume recent
|
||||||
|
}
|
||||||
|
|
||||||
|
export function floatVersion(rubyVersion) {
|
||||||
|
const match = rubyVersion.match(/^\d+\.\d+/)
|
||||||
|
if (match) {
|
||||||
|
return parseFloat(match[0])
|
||||||
|
} else if (isHeadVersion(rubyVersion)) {
|
||||||
|
return 999.999
|
||||||
|
} else {
|
||||||
|
throw new Error(`Could not convert version ${rubyVersion} to a float`)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function hashFile(file) {
|
||||||
|
// See https://github.com/actions/runner/blob/master/src/Misc/expressionFunc/hashFiles/src/hashFiles.ts
|
||||||
|
const hash = crypto.createHash('sha256')
|
||||||
|
const pipeline = util.promisify(stream.pipeline)
|
||||||
|
await pipeline(fs.createReadStream(file), hash)
|
||||||
|
return hash.digest('hex')
|
||||||
|
}
|
||||||
|
|
||||||
|
function getImageOS() {
|
||||||
|
const imageOS = process.env['ImageOS']
|
||||||
|
if (!imageOS) {
|
||||||
|
throw new Error('The environment variable ImageOS must be set')
|
||||||
|
}
|
||||||
|
return imageOS
|
||||||
|
}
|
||||||
|
|
||||||
|
export const supportedPlatforms = [
|
||||||
|
'ubuntu-18.04',
|
||||||
|
'ubuntu-20.04',
|
||||||
|
'ubuntu-22.04',
|
||||||
|
'macos-10.15',
|
||||||
|
'macos-11',
|
||||||
|
'macos-12',
|
||||||
|
'windows-2019',
|
||||||
|
'windows-2022',
|
||||||
|
]
|
||||||
|
|
||||||
|
export function getVirtualEnvironmentName() {
|
||||||
|
const imageOS = getImageOS()
|
||||||
|
|
||||||
|
let match = imageOS.match(/^ubuntu(\d+)/) // e.g. ubuntu18
|
||||||
|
if (match) {
|
||||||
|
return `ubuntu-${match[1]}.04`
|
||||||
|
}
|
||||||
|
|
||||||
|
match = imageOS.match(/^macos(\d{2})(\d+)?/) // e.g. macos1015, macos11
|
||||||
|
if (match) {
|
||||||
|
if (match[2]) {
|
||||||
|
return `macos-${match[1]}.${match[2]}`
|
||||||
|
} else {
|
||||||
|
return `macos-${match[1]}`
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
match = imageOS.match(/^win(\d+)/) // e.g. win19
|
||||||
|
if (match) {
|
||||||
|
return `windows-20${match[1]}`
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new Error(`Unknown ImageOS ${imageOS}`)
|
||||||
|
}
|
||||||
|
|
||||||
|
export function shouldUseToolCache(engine, version) {
|
||||||
|
return engine === 'ruby' && !isHeadVersion(version)
|
||||||
|
}
|
||||||
|
|
||||||
|
function getPlatformToolCache(platform) {
|
||||||
|
// Hardcode paths rather than using $RUNNER_TOOL_CACHE because the prebuilt Rubies cannot be moved anyway
|
||||||
|
if (platform.startsWith('ubuntu-')) {
|
||||||
|
return '/opt/hostedtoolcache'
|
||||||
|
} else if (platform.startsWith('macos-')) {
|
||||||
|
return '/Users/runner/hostedtoolcache'
|
||||||
|
} else if (platform.startsWith('windows-')) {
|
||||||
|
return 'C:/hostedtoolcache/windows'
|
||||||
|
} else {
|
||||||
|
throw new Error('Unknown platform')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getToolCacheRubyPrefix(platform, version) {
|
||||||
|
const toolCache = getPlatformToolCache(platform)
|
||||||
|
return path.join(toolCache, 'Ruby', version, 'x64')
|
||||||
|
}
|
||||||
|
|
||||||
|
export function createToolCacheCompleteFile(toolCacheRubyPrefix) {
|
||||||
|
const completeFile = `${toolCacheRubyPrefix}.complete`
|
||||||
|
fs.writeFileSync(completeFile, '')
|
||||||
|
}
|
||||||
|
|
||||||
|
// convert windows path like C:\Users\runneradmin to /c/Users/runneradmin
|
||||||
|
export function win2nix(path) {
|
||||||
|
if (/^[A-Z]:/i.test(path)) {
|
||||||
|
// path starts with drive
|
||||||
|
path = `/${path[0].toLowerCase()}${partition(path, ':')[1]}`
|
||||||
|
}
|
||||||
|
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|vcruntime\d{3})-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))
|
||||||
|
|
||||||
|
core.startGroup(`Modifying ${envPath}`)
|
||||||
|
|
||||||
|
// First remove the conflicting path entries
|
||||||
|
if (cleanPath.length !== originalPath.length) {
|
||||||
|
console.log(`Entries removed from ${envPath} to avoid conflicts with default Ruby:`)
|
||||||
|
for (const entry of originalPath) {
|
||||||
|
if (!cleanPath.includes(entry)) {
|
||||||
|
console.log(` ${entry}`)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
core.exportVariable(envPath, cleanPath.join(path.delimiter))
|
||||||
|
}
|
||||||
|
|
||||||
|
// 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\\${msys2Type}\\bin`, 'C:\\msys64\\usr\\bin']
|
||||||
|
newPath = [...newPathEntries, ...msys2]
|
||||||
|
} else {
|
||||||
|
newPath = newPathEntries
|
||||||
|
}
|
||||||
|
console.log(`Entries added to ${envPath} to use selected Ruby:`)
|
||||||
|
for (const entry of newPath) {
|
||||||
|
console.log(` ${entry}`)
|
||||||
|
}
|
||||||
|
core.endGroup()
|
||||||
|
|
||||||
|
core.addPath(newPath.join(path.delimiter))
|
||||||
|
return msys2Type
|
||||||
|
}
|
||||||
+66616
-3521
File diff suppressed because one or more lines are too long
@@ -0,0 +1,3 @@
|
|||||||
|
source 'https://rubygems.org'
|
||||||
|
|
||||||
|
gem "path"
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
GEM
|
||||||
|
remote: https://rubygems.org/
|
||||||
|
specs:
|
||||||
|
path (2.0.1)
|
||||||
|
|
||||||
|
PLATFORMS
|
||||||
|
x86_64-linux
|
||||||
|
|
||||||
|
DEPENDENCIES
|
||||||
|
path
|
||||||
|
|
||||||
|
BUNDLED WITH
|
||||||
|
2.4.0.dev
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
source 'https://rubygems.org'
|
||||||
|
|
||||||
|
gem "bundler", "~> 1.0"
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
source "https://rubygems.org"
|
||||||
|
|
||||||
|
# Ruby < 2.3 only support Bundler 1, which no longer works with gem github:
|
||||||
|
if RUBY_VERSION >= '2.3'
|
||||||
|
unless Gem::Version.new(Bundler::VERSION) >= Gem::Version.new("2.2.0")
|
||||||
|
raise "Expected Bundler 2.2+ is used on Ruby >= 2.3"
|
||||||
|
end
|
||||||
|
|
||||||
|
# From https://github.com/ruby/setup-ruby/issues/358#issuecomment-1195899304
|
||||||
|
# Tests using github: and the repository uses a non-master default branch.
|
||||||
|
gem 'rack-test', github: 'rack/rack-test'
|
||||||
|
end
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
source "https://rubygems.org"
|
||||||
|
|
||||||
|
gem "nokogiri"
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
source "https://rubygems.org"
|
||||||
|
|
||||||
|
gem "rails", "~> 5.2.0"
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
source "https://rubygems.org"
|
||||||
|
|
||||||
|
gem "rails", "~> 6.0.0"
|
||||||
@@ -2,7 +2,8 @@ require 'net/http'
|
|||||||
require 'yaml'
|
require 'yaml'
|
||||||
require 'json'
|
require 'json'
|
||||||
|
|
||||||
min_version = '2.2.6'
|
min_requirements = ['~> 2.0.0', '~> 2.1.9', '>= 2.2.6'].map { |req| Gem::Requirement.new(req) }
|
||||||
|
|
||||||
url = 'https://raw.githubusercontent.com/oneclick/rubyinstaller.org-website/master/_data/downloads.yaml'
|
url = 'https://raw.githubusercontent.com/oneclick/rubyinstaller.org-website/master/_data/downloads.yaml'
|
||||||
entries = YAML.load(Net::HTTP.get(URI(url)), symbolize_names: true)
|
entries = YAML.load(Net::HTTP.get(URI(url)), symbolize_names: true)
|
||||||
|
|
||||||
@@ -17,9 +18,9 @@ versions = entries.select { |entry|
|
|||||||
end
|
end
|
||||||
[version, builds.first]
|
[version, builds.first]
|
||||||
}.sort_by { |version, entry|
|
}.sort_by { |version, entry|
|
||||||
version
|
Gem::Version.new(version)
|
||||||
}.select { |version, entry|
|
}.select { |version, entry|
|
||||||
Gem::Version.new(version) >= Gem::Version.new(min_version)
|
min_requirements.any? { |req| req.satisfied_by?(Gem::Version.new(version)) }
|
||||||
}.map { |version, entry|
|
}.map { |version, entry|
|
||||||
[version, entry[:href]]
|
[version, entry[:href]]
|
||||||
}.to_h
|
}.to_h
|
||||||
@@ -27,6 +28,6 @@ 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'
|
||||||
|
|
||||||
js = "export const versions = #{JSON.pretty_generate(versions)}\n"
|
File.binwrite 'windows-versions.json', "#{JSON.pretty_generate(versions)}\n"
|
||||||
File.write 'windows-versions.js', js
|
|
||||||
|
|||||||
@@ -1,29 +1,100 @@
|
|||||||
const os = require('os')
|
const os = require('os')
|
||||||
const fs = require('fs')
|
const fs = require('fs')
|
||||||
|
const path = require('path')
|
||||||
const core = require('@actions/core')
|
const core = require('@actions/core')
|
||||||
|
const exec = require('@actions/exec')
|
||||||
|
const common = require('./common')
|
||||||
|
const rubygems = require('./rubygems')
|
||||||
|
const bundler = require('./bundler')
|
||||||
|
|
||||||
async function run() {
|
const windows = common.windows
|
||||||
|
|
||||||
|
const inputDefaults = {
|
||||||
|
'ruby-version': 'default',
|
||||||
|
'rubygems': 'default',
|
||||||
|
'bundler': 'Gemfile.lock',
|
||||||
|
'bundler-cache': 'false',
|
||||||
|
'working-directory': '.',
|
||||||
|
'cache-version': bundler.DEFAULT_CACHE_VERSION,
|
||||||
|
}
|
||||||
|
|
||||||
|
// entry point when this action is run on its own
|
||||||
|
export async function run() {
|
||||||
try {
|
try {
|
||||||
const platform = getVirtualEnvironmentName()
|
await setupRuby()
|
||||||
const [engine, version] = parseRubyEngineAndVersion(core.getInput('ruby-version'))
|
|
||||||
|
|
||||||
let installer
|
|
||||||
if (platform === 'windows-latest' && engine !== 'jruby') {
|
|
||||||
installer = require('./windows')
|
|
||||||
} else {
|
|
||||||
installer = require('./ruby-builder')
|
|
||||||
}
|
|
||||||
|
|
||||||
const engineVersions = installer.getAvailableVersions(platform, engine)
|
|
||||||
const ruby = validateRubyEngineAndVersion(platform, engineVersions, engine, version)
|
|
||||||
|
|
||||||
const rubyPrefix = await installer.install(platform, ruby)
|
|
||||||
core.setOutput('ruby-prefix', rubyPrefix)
|
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
core.setFailed(error.message)
|
core.setFailed(error.stack)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// entry point when this action is run from other actions
|
||||||
|
export async function setupRuby(options = {}) {
|
||||||
|
const inputs = { ...options }
|
||||||
|
for (const key in inputDefaults) {
|
||||||
|
if (!Object.prototype.hasOwnProperty.call(inputs, key)) {
|
||||||
|
inputs[key] = core.getInput(key) || inputDefaults[key]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
process.chdir(inputs['working-directory'])
|
||||||
|
|
||||||
|
const platform = common.getVirtualEnvironmentName()
|
||||||
|
const [engine, parsedVersion] = parseRubyEngineAndVersion(inputs['ruby-version'])
|
||||||
|
|
||||||
|
let installer
|
||||||
|
if (platform.startsWith('windows-') && engine === 'ruby') {
|
||||||
|
installer = require('./windows')
|
||||||
|
} else {
|
||||||
|
installer = require('./ruby-builder')
|
||||||
|
}
|
||||||
|
|
||||||
|
const engineVersions = installer.getAvailableVersions(platform, engine)
|
||||||
|
const version = validateRubyEngineAndVersion(platform, engineVersions, engine, parsedVersion)
|
||||||
|
|
||||||
|
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)
|
||||||
|
|
||||||
|
await common.measure('Print Ruby version', async () =>
|
||||||
|
await exec.exec('ruby', ['--version']))
|
||||||
|
|
||||||
|
const rubygemsInputSet = inputs['rubygems'] !== 'default'
|
||||||
|
if (rubygemsInputSet) {
|
||||||
|
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
|
||||||
|
// before 'bundle install'. Installed dependencies may require additional
|
||||||
|
// libraries & headers, build tools, etc.
|
||||||
|
if (inputs['afterSetupPathHook'] instanceof Function) {
|
||||||
|
await inputs['afterSetupPathHook']({ platform, rubyPrefix, engine, version })
|
||||||
|
}
|
||||||
|
|
||||||
|
const [gemfile, lockFile] = bundler.detectGemfiles()
|
||||||
|
let bundlerVersion = 'unknown'
|
||||||
|
|
||||||
|
if (inputs['bundler'] !== 'none') {
|
||||||
|
bundlerVersion = await common.measure('Installing Bundler', async () =>
|
||||||
|
bundler.installBundler(inputs['bundler'], rubygemsInputSet, lockFile, platform, rubyPrefix, engine, version))
|
||||||
|
}
|
||||||
|
|
||||||
|
if (inputs['bundler-cache'] === 'true') {
|
||||||
|
await common.measure('bundle install', async () =>
|
||||||
|
bundler.bundleInstall(gemfile, lockFile, platform, engine, version, bundlerVersion, inputs['cache-version']))
|
||||||
|
}
|
||||||
|
|
||||||
|
core.setOutput('ruby-prefix', rubyPrefix)
|
||||||
|
}
|
||||||
|
|
||||||
function parseRubyEngineAndVersion(rubyVersion) {
|
function parseRubyEngineAndVersion(rubyVersion) {
|
||||||
if (rubyVersion === 'default') {
|
if (rubyVersion === 'default') {
|
||||||
if (fs.existsSync('.ruby-version')) {
|
if (fs.existsSync('.ruby-version')) {
|
||||||
@@ -40,66 +111,75 @@ 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.split(/\s+/, 2)[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+|head|mingw|mswin)/)) { // 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
|
||||||
engine = rubyVersion
|
engine = rubyVersion
|
||||||
version = '' // Let the logic below find the version
|
version = '' // Let the logic in validateRubyEngineAndVersion() find the version
|
||||||
} else { // engine-X.Y.Z
|
} else { // engine-X.Y.Z
|
||||||
[engine, version] = rubyVersion.split('-', 2)
|
[engine, version] = common.partition(rubyVersion, '-')
|
||||||
}
|
}
|
||||||
|
|
||||||
return [engine, version]
|
return [engine, version]
|
||||||
}
|
}
|
||||||
|
|
||||||
function validateRubyEngineAndVersion(platform, engineVersions, engine, version) {
|
function validateRubyEngineAndVersion(platform, engineVersions, engine, parsedVersion) {
|
||||||
if (!engineVersions) {
|
if (!engineVersions) {
|
||||||
throw new Error(`Unknown engine ${engine} on ${platform}`)
|
throw new Error(`Unknown engine ${engine} on ${platform}`)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!engineVersions.includes(version)) {
|
let version = parsedVersion
|
||||||
|
if (!engineVersions.includes(parsedVersion)) {
|
||||||
const latestToFirstVersion = engineVersions.slice().reverse()
|
const latestToFirstVersion = engineVersions.slice().reverse()
|
||||||
const found = latestToFirstVersion.find(v => v !== 'head' && v.startsWith(version))
|
// Try to match stable versions first, so an empty version (engine-only) matches the latest stable version
|
||||||
|
let found = latestToFirstVersion.find(v => common.isStableVersion(v) && v.startsWith(parsedVersion))
|
||||||
|
if (!found) {
|
||||||
|
// Exclude head versions, they must be exact matches
|
||||||
|
found = latestToFirstVersion.find(v => !common.isHeadVersion(v) && v.startsWith(parsedVersion))
|
||||||
|
}
|
||||||
|
|
||||||
if (found) {
|
if (found) {
|
||||||
version = found
|
version = found
|
||||||
} else {
|
} else {
|
||||||
throw new Error(`Unknown version ${version} for ${engine} on ${platform}
|
throw new Error(`Unknown version ${parsedVersion} for ${engine} on ${platform}
|
||||||
available versions for ${engine} on ${platform}: ${engineVersions.join(', ')}
|
available versions for ${engine} on ${platform}: ${engineVersions.join(', ')}
|
||||||
File an issue at https://github.com/ruby/setup-ruby/issues if would like support for a new version`)
|
Make sure you use the latest version of the action with - uses: ruby/setup-ruby@v1`)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return engine + '-' + version
|
return version
|
||||||
}
|
}
|
||||||
|
|
||||||
function getVirtualEnvironmentName() {
|
function createGemRC(engine, version) {
|
||||||
const platform = os.platform()
|
const gemrc = path.join(os.homedir(), '.gemrc')
|
||||||
if (platform === 'linux') {
|
if (!fs.existsSync(gemrc)) {
|
||||||
return `ubuntu-${findUbuntuVersion()}`
|
if (engine === 'ruby' && common.floatVersion(version) < 2.0) {
|
||||||
} else if (platform === 'darwin') {
|
fs.writeFileSync(gemrc, `install: --no-rdoc --no-ri${os.EOL}update: --no-rdoc --no-ri${os.EOL}`)
|
||||||
return 'macos-latest'
|
} else {
|
||||||
} else if (platform === 'win32') {
|
fs.writeFileSync(gemrc, `gem: --no-document${os.EOL}`)
|
||||||
return 'windows-latest'
|
}
|
||||||
} else {
|
|
||||||
throw new Error(`Unknown platform ${platform}`)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function findUbuntuVersion() {
|
// sets up ENV variables
|
||||||
const lsb_release = fs.readFileSync('/etc/lsb-release', 'utf8')
|
// currently only used on Windows runners
|
||||||
const match = lsb_release.match(/^DISTRIB_RELEASE=(\d+\.\d+)$/m)
|
function envPreInstall() {
|
||||||
if (match) {
|
const ENV = process.env
|
||||||
return match[1]
|
if (windows) {
|
||||||
} else {
|
// puts normal Ruby temp folder on SSD
|
||||||
throw new Error('Could not find Ubuntu version')
|
core.exportVariable('TMPDIR', ENV['RUNNER_TEMP'])
|
||||||
|
// bash - sets home to match native windows, normally C:\Users\<user name>
|
||||||
|
core.exportVariable('HOME', ENV['HOMEDRIVE'] + ENV['HOMEPATH'])
|
||||||
|
// bash - needed to maintain Path from Windows
|
||||||
|
core.exportVariable('MSYS2_PATH_TYPE', 'inherit')
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
run()
|
if (__filename.endsWith('index.js')) { run() }
|
||||||
|
|||||||
@@ -0,0 +1,65 @@
|
|||||||
|
versions = ARGV.fetch(0).split(',').map(&:strip)
|
||||||
|
versions.each do |engine_version|
|
||||||
|
engine_input, version = engine_version.split('-', 2)
|
||||||
|
|
||||||
|
if engine_input == 'windows'
|
||||||
|
require_relative 'generate-windows-versions'
|
||||||
|
exit
|
||||||
|
end
|
||||||
|
|
||||||
|
MATCH = case engine_input
|
||||||
|
when 'ruby', 'jruby'
|
||||||
|
/^\d+\.\d+\./
|
||||||
|
when 'truffleruby'
|
||||||
|
/^\d+\./
|
||||||
|
end
|
||||||
|
|
||||||
|
raise unless version[MATCH]
|
||||||
|
|
||||||
|
engines = [engine_input]
|
||||||
|
engines << 'truffleruby+graalvm' if engine_input == 'truffleruby'
|
||||||
|
|
||||||
|
engines.each do |engine|
|
||||||
|
puts engine
|
||||||
|
|
||||||
|
# Update ruby-builder-versions.json
|
||||||
|
file = "#{__dir__}/ruby-builder-versions.json"
|
||||||
|
lines = File.readlines(file, chomp: true)
|
||||||
|
|
||||||
|
from = lines.index { |line| line.include?(%{"#{engine}": [}) }
|
||||||
|
raise "Could not find start of #{engine}" unless from
|
||||||
|
to = from
|
||||||
|
to += 1 until lines[to].include?(']')
|
||||||
|
|
||||||
|
from += 1 # [
|
||||||
|
to -= 2 # head, ]
|
||||||
|
|
||||||
|
puts lines[from..to]
|
||||||
|
|
||||||
|
release_line = lines[from..to].find { |line|
|
||||||
|
v = line[/"([^"]+)"/, 1] and v[MATCH] == version[MATCH]
|
||||||
|
}
|
||||||
|
|
||||||
|
if release_line
|
||||||
|
append = " #{version.inspect},"
|
||||||
|
release_line << append unless release_line.end_with?(append)
|
||||||
|
else
|
||||||
|
lines.insert to+1, " #{version.inspect},"
|
||||||
|
end
|
||||||
|
|
||||||
|
File.write(file, lines.join("\n") + "\n")
|
||||||
|
|
||||||
|
# Update README.md
|
||||||
|
file = "#{__dir__}/README.md"
|
||||||
|
lines = File.readlines(file)
|
||||||
|
engine_line = lines.find { |line| line.start_with?("| `#{engine}`") }
|
||||||
|
engine_line.sub!(/(.+ (?:-|until)) (\d+(?:\.\d+)+(?:-\w+)?)/) do
|
||||||
|
if Gem::Version.new(version) > Gem::Version.new($2)
|
||||||
|
"#{$1} #{version}"
|
||||||
|
else
|
||||||
|
$&
|
||||||
|
end
|
||||||
|
end
|
||||||
|
File.write(file, lines.join)
|
||||||
|
end
|
||||||
|
end
|
||||||
+7
-7
@@ -4,7 +4,6 @@
|
|||||||
"description": "Download a prebuilt Ruby and add it to the PATH in 5 seconds",
|
"description": "Download a prebuilt Ruby and add it to the PATH in 5 seconds",
|
||||||
"main": "index.js",
|
"main": "index.js",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"lint": "eslint *.js",
|
|
||||||
"package": "ncc build index.js -o dist"
|
"package": "ncc build index.js -o dist"
|
||||||
},
|
},
|
||||||
"repository": {
|
"repository": {
|
||||||
@@ -23,13 +22,14 @@
|
|||||||
},
|
},
|
||||||
"homepage": "https://github.com/ruby/setup-ruby",
|
"homepage": "https://github.com/ruby/setup-ruby",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@actions/core": "^1.1.1",
|
"@actions/cache": "^3",
|
||||||
"@actions/exec": "^1.0.1",
|
"@actions/core": "^1.10.0",
|
||||||
"@actions/io": "^1.0.1",
|
"@actions/exec": "^1.1.1",
|
||||||
"@actions/tool-cache": "^1.1.2"
|
"@actions/io": "^1.1.2",
|
||||||
|
"@actions/tool-cache": "^2",
|
||||||
|
"semver": "^7.3.7"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@zeit/ncc": "^0.20.5",
|
"@vercel/ncc": "^0.33.4"
|
||||||
"eslint": "^6.3.0"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Executable
+8
@@ -0,0 +1,8 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
set -e
|
||||||
|
|
||||||
|
if [ "$(dirname "$0")" != ".git/hooks" ] || git diff --cached --name-only | grep -E '.(js|json)$|yarn.lock'; then
|
||||||
|
yarn install
|
||||||
|
yarn run package
|
||||||
|
exec git add dist/index.js
|
||||||
|
fi
|
||||||
@@ -1,30 +0,0 @@
|
|||||||
export function getVersions(platform) {
|
|
||||||
const versions = {
|
|
||||||
"ruby": [
|
|
||||||
"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.5.0", "2.5.1", "2.5.2", "2.5.3", "2.5.4", "2.5.5", "2.5.6", "2.5.7",
|
|
||||||
"2.6.0", "2.6.1", "2.6.2", "2.6.3", "2.6.4", "2.6.5",
|
|
||||||
"2.7.0",
|
|
||||||
"head"
|
|
||||||
],
|
|
||||||
"jruby": [
|
|
||||||
"9.2.9.0", "9.2.10.0",
|
|
||||||
"head"
|
|
||||||
],
|
|
||||||
"truffleruby": [
|
|
||||||
"19.3.0", "19.3.1",
|
|
||||||
"20.0.0",
|
|
||||||
"head"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
if (platform === 'ubuntu-18.04') {
|
|
||||||
versions['rubinius'] = [
|
|
||||||
"4.14"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
return versions
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
{
|
||||||
|
"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.6.10",
|
||||||
|
"2.7.0", "2.7.1", "2.7.2", "2.7.3", "2.7.4", "2.7.5", "2.7.6", "2.7.7",
|
||||||
|
"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.0.4", "3.0.5",
|
||||||
|
"3.1.0-preview1", "3.1.0", "3.1.1", "3.1.2", "3.1.3",
|
||||||
|
"3.2.0-preview1", "3.2.0-preview2", "3.2.0-preview3", "3.2.0-rc1", "3.2.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.2.21.0",
|
||||||
|
"9.3.0.0", "9.3.1.0", "9.3.2.0", "9.3.3.0", "9.3.4.0", "9.3.6.0", "9.3.7.0", "9.3.8.0", "9.3.9.0",
|
||||||
|
"9.4.0.0",
|
||||||
|
"head"
|
||||||
|
],
|
||||||
|
"truffleruby": [
|
||||||
|
"19.3.0", "19.3.1",
|
||||||
|
"20.0.0", "20.1.0", "20.2.0", "20.3.0",
|
||||||
|
"21.0.0", "21.1.0", "21.2.0", "21.2.0.1", "21.3.0",
|
||||||
|
"22.0.0.2", "22.1.0", "22.2.0", "22.3.0",
|
||||||
|
"head"
|
||||||
|
],
|
||||||
|
"truffleruby+graalvm": [
|
||||||
|
"21.2.0", "21.3.0",
|
||||||
|
"22.0.0.2", "22.1.0", "22.2.0", "22.3.0",
|
||||||
|
"head"
|
||||||
|
]
|
||||||
|
}
|
||||||
+93
-36
@@ -1,60 +1,117 @@
|
|||||||
const os = require('os')
|
const os = require('os')
|
||||||
|
const fs = require('fs')
|
||||||
const path = require('path')
|
const path = require('path')
|
||||||
const core = require('@actions/core')
|
|
||||||
const exec = require('@actions/exec')
|
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 rubyBuilderVersions = require('./ruby-builder-versions')
|
const rubyBuilderVersions = require('./ruby-builder-versions')
|
||||||
|
|
||||||
const builderReleaseTag = 'builds-no-warn'
|
const builderReleaseTag = 'toolcache'
|
||||||
const releasesURL = 'https://github.com/ruby/ruby-builder/releases'
|
const releasesURL = 'https://github.com/ruby/ruby-builder/releases'
|
||||||
|
|
||||||
|
const windows = common.windows
|
||||||
|
|
||||||
export function getAvailableVersions(platform, engine) {
|
export function getAvailableVersions(platform, engine) {
|
||||||
return rubyBuilderVersions.getVersions(platform)[engine]
|
if (!common.supportedPlatforms.includes(platform)) {
|
||||||
|
throw new Error(`Unsupported platform ${platform}`)
|
||||||
|
}
|
||||||
|
|
||||||
|
return rubyBuilderVersions[engine]
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function install(platform, ruby) {
|
export async function install(platform, engine, version) {
|
||||||
const rubyPrefix = await downloadAndExtract(platform, ruby)
|
let rubyPrefix, inToolCache
|
||||||
|
if (common.shouldUseToolCache(engine, version)) {
|
||||||
if (platform === 'windows-latest') {
|
inToolCache = tc.find('Ruby', version)
|
||||||
require('./windows').setupPath(undefined, rubyPrefix)
|
if (inToolCache) {
|
||||||
|
rubyPrefix = inToolCache
|
||||||
|
} else {
|
||||||
|
rubyPrefix = common.getToolCacheRubyPrefix(platform, version)
|
||||||
|
}
|
||||||
|
} else if (windows) {
|
||||||
|
rubyPrefix = path.join(`${common.drive}:`, `${engine}-${version}`)
|
||||||
} else {
|
} else {
|
||||||
core.addPath(path.join(rubyPrefix, 'bin'))
|
rubyPrefix = path.join(os.homedir(), '.rubies', `${engine}-${version}`)
|
||||||
if (ruby.startsWith('rubinius')) {
|
}
|
||||||
core.addPath(path.join(rubyPrefix, 'gems', 'bin'))
|
|
||||||
|
// Set the PATH now, so the MSYS2 'tar' is in Path on Windows
|
||||||
|
common.setupPath([path.join(rubyPrefix, 'bin')])
|
||||||
|
|
||||||
|
if (!inToolCache) {
|
||||||
|
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, ruby) {
|
async function preparePrefix(rubyPrefix) {
|
||||||
const rubiesDir = path.join(os.homedir(), '.rubies')
|
const parentDir = path.dirname(rubyPrefix)
|
||||||
await io.mkdirP(rubiesDir)
|
|
||||||
|
|
||||||
const url = await getDownloadURL(platform, ruby)
|
await io.rmRF(rubyPrefix)
|
||||||
console.log(url)
|
if (!(fs.existsSync(parentDir) && fs.statSync(parentDir).isDirectory())) {
|
||||||
|
await io.mkdirP(parentDir)
|
||||||
const downloadPath = await tc.downloadTool(url)
|
|
||||||
if (platform.startsWith('windows')) {
|
|
||||||
let args = [ '-xz', '-C', rubiesDir, '-f', downloadPath ]
|
|
||||||
await exec.exec('C:\\Windows\\system32\\tar.exe', args)
|
|
||||||
} else {
|
|
||||||
await tc.extractTar(downloadPath, rubiesDir)
|
|
||||||
}
|
|
||||||
|
|
||||||
return path.join(rubiesDir, ruby)
|
|
||||||
}
|
|
||||||
|
|
||||||
function getDownloadURL(platform, ruby) {
|
|
||||||
if (ruby.endsWith('-head')) {
|
|
||||||
return getLatestHeadBuildURL(platform, ruby)
|
|
||||||
} else {
|
|
||||||
return `${releasesURL}/download/${builderReleaseTag}/${ruby}-${platform}.tar.gz`
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function getLatestHeadBuildURL(platform, ruby) {
|
async function installWithRubyBuild(engine, version, rubyPrefix) {
|
||||||
const engine = ruby.split('-')[0]
|
const tmp = process.env['RUNNER_TEMP'] || os.tmpdir()
|
||||||
return `https://github.com/ruby/${engine}-dev-builder/releases/latest/download/${engine}-head-${platform}.tar.gz`
|
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 url = getDownloadURL(platform, engine, version)
|
||||||
|
console.log(url)
|
||||||
|
return await tc.downloadTool(url)
|
||||||
|
})
|
||||||
|
|
||||||
|
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)])
|
||||||
|
} else {
|
||||||
|
await exec.exec('tar', ['-xz', '-C', parentDir, '-f', downloadPath])
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
if (common.shouldUseToolCache(engine, version)) {
|
||||||
|
common.createToolCacheCompleteFile(rubyPrefix)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function getDownloadURL(platform, engine, version) {
|
||||||
|
let builderPlatform = platform
|
||||||
|
if (platform.startsWith('windows-')) {
|
||||||
|
builderPlatform = 'windows-latest'
|
||||||
|
} else if (platform.startsWith('macos-')) {
|
||||||
|
builderPlatform = 'macos-latest'
|
||||||
|
}
|
||||||
|
|
||||||
|
if (common.isHeadVersion(version)) {
|
||||||
|
return getLatestHeadBuildURL(builderPlatform, engine, version)
|
||||||
|
} else {
|
||||||
|
return `${releasesURL}/download/${builderReleaseTag}/${engine}-${version}-${builderPlatform}.tar.gz`
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function getLatestHeadBuildURL(platform, engine, version) {
|
||||||
|
return `https://github.com/ruby/${engine}-dev-builder/releases/latest/download/${engine}-${version}-${platform}.tar.gz`
|
||||||
}
|
}
|
||||||
|
|||||||
+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
|
||||||
|
}
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
require 'json'
|
||||||
|
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/] }
|
||||||
|
|
||||||
|
(1..7).each do |minor|
|
||||||
|
p by_minor["2.#{minor}"].map { |v| "ruby-#{v}" }
|
||||||
|
end
|
||||||
|
|
||||||
|
puts
|
||||||
|
p (versions[:truffleruby] - %w[head]).map { |v| "truffleruby-#{v}" }
|
||||||
|
|
||||||
|
puts
|
||||||
|
p (versions[:jruby] - %w[head]).map { |v| "jruby-#{v}" }
|
||||||
|
|
||||||
|
(versions[:jruby] - %w[head]).each do |v|
|
||||||
|
puts "- { os: windows-latest, jruby-version: #{v}, ruby: jruby-#{v} }"
|
||||||
|
end
|
||||||
@@ -1,30 +0,0 @@
|
|||||||
export const versions = {
|
|
||||||
"2.2.6": "https://dl.bintray.com/oneclick/rubyinstaller/ruby-2.2.6-x64-mingw32.7z",
|
|
||||||
"2.3.0": "https://dl.bintray.com/oneclick/rubyinstaller/ruby-2.3.0-x64-mingw32.7z",
|
|
||||||
"2.3.1": "https://dl.bintray.com/oneclick/rubyinstaller/ruby-2.3.1-x64-mingw32.7z",
|
|
||||||
"2.3.3": "https://dl.bintray.com/oneclick/rubyinstaller/ruby-2.3.3-x64-mingw32.7z",
|
|
||||||
"2.4.1": "https://github.com/oneclick/rubyinstaller2/releases/download/2.4.1-2/rubyinstaller-2.4.1-2-x64.7z",
|
|
||||||
"2.4.2": "https://github.com/oneclick/rubyinstaller2/releases/download/rubyinstaller-2.4.2-2/rubyinstaller-2.4.2-2-x64.7z",
|
|
||||||
"2.4.3": "https://github.com/oneclick/rubyinstaller2/releases/download/rubyinstaller-2.4.3-2/rubyinstaller-2.4.3-2-x64.7z",
|
|
||||||
"2.4.4": "https://github.com/oneclick/rubyinstaller2/releases/download/rubyinstaller-2.4.4-2/rubyinstaller-2.4.4-2-x64.7z",
|
|
||||||
"2.4.5": "https://github.com/oneclick/rubyinstaller2/releases/download/rubyinstaller-2.4.5-1/rubyinstaller-2.4.5-1-x64.7z",
|
|
||||||
"2.4.6": "https://github.com/oneclick/rubyinstaller2/releases/download/RubyInstaller-2.4.6-1/rubyinstaller-2.4.6-1-x64.7z",
|
|
||||||
"2.4.7": "https://github.com/oneclick/rubyinstaller2/releases/download/RubyInstaller-2.4.7-1/rubyinstaller-2.4.7-1-x64.7z",
|
|
||||||
"2.4.9": "https://github.com/oneclick/rubyinstaller2/releases/download/RubyInstaller-2.4.9-1/rubyinstaller-2.4.9-1-x64.7z",
|
|
||||||
"2.5.0": "https://github.com/oneclick/rubyinstaller2/releases/download/rubyinstaller-2.5.0-2/rubyinstaller-2.5.0-2-x64.7z",
|
|
||||||
"2.5.1": "https://github.com/oneclick/rubyinstaller2/releases/download/rubyinstaller-2.5.1-2/rubyinstaller-2.5.1-2-x64.7z",
|
|
||||||
"2.5.3": "https://github.com/oneclick/rubyinstaller2/releases/download/rubyinstaller-2.5.3-1/rubyinstaller-2.5.3-1-x64.7z",
|
|
||||||
"2.5.5": "https://github.com/oneclick/rubyinstaller2/releases/download/RubyInstaller-2.5.5-1/rubyinstaller-2.5.5-1-x64.7z",
|
|
||||||
"2.5.6": "https://github.com/oneclick/rubyinstaller2/releases/download/RubyInstaller-2.5.6-1/rubyinstaller-2.5.6-1-x64.7z",
|
|
||||||
"2.5.7": "https://github.com/oneclick/rubyinstaller2/releases/download/RubyInstaller-2.5.7-1/rubyinstaller-2.5.7-1-x64.7z",
|
|
||||||
"2.6.0": "https://github.com/oneclick/rubyinstaller2/releases/download/RubyInstaller-2.6.0-1/rubyinstaller-2.6.0-1-x64.7z",
|
|
||||||
"2.6.1": "https://github.com/oneclick/rubyinstaller2/releases/download/RubyInstaller-2.6.1-1/rubyinstaller-2.6.1-1-x64.7z",
|
|
||||||
"2.6.2": "https://github.com/oneclick/rubyinstaller2/releases/download/RubyInstaller-2.6.2-1/rubyinstaller-2.6.2-1-x64.7z",
|
|
||||||
"2.6.3": "https://github.com/oneclick/rubyinstaller2/releases/download/RubyInstaller-2.6.3-1/rubyinstaller-2.6.3-1-x64.7z",
|
|
||||||
"2.6.4": "https://github.com/oneclick/rubyinstaller2/releases/download/RubyInstaller-2.6.4-1/rubyinstaller-2.6.4-1-x64.7z",
|
|
||||||
"2.6.5": "https://github.com/oneclick/rubyinstaller2/releases/download/RubyInstaller-2.6.5-1/rubyinstaller-2.6.5-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",
|
|
||||||
"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"
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,59 @@
|
|||||||
|
{
|
||||||
|
"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.2.6": "https://github.com/oneclick/rubyinstaller/releases/download/ruby-2.2.6/ruby-2.2.6-x64-mingw32.7z",
|
||||||
|
"2.3.0": "https://github.com/oneclick/rubyinstaller/releases/download/ruby-2.3.0/ruby-2.3.0-x64-mingw32.7z",
|
||||||
|
"2.3.1": "https://github.com/oneclick/rubyinstaller/releases/download/ruby-2.3.1/ruby-2.3.1-x64-mingw32.7z",
|
||||||
|
"2.3.3": "https://github.com/oneclick/rubyinstaller/releases/download/ruby-2.3.3/ruby-2.3.3-x64-mingw32.7z",
|
||||||
|
"2.4.1": "https://github.com/oneclick/rubyinstaller2/releases/download/2.4.1-2/rubyinstaller-2.4.1-2-x64.7z",
|
||||||
|
"2.4.2": "https://github.com/oneclick/rubyinstaller2/releases/download/rubyinstaller-2.4.2-2/rubyinstaller-2.4.2-2-x64.7z",
|
||||||
|
"2.4.3": "https://github.com/oneclick/rubyinstaller2/releases/download/rubyinstaller-2.4.3-2/rubyinstaller-2.4.3-2-x64.7z",
|
||||||
|
"2.4.4": "https://github.com/oneclick/rubyinstaller2/releases/download/rubyinstaller-2.4.4-2/rubyinstaller-2.4.4-2-x64.7z",
|
||||||
|
"2.4.5": "https://github.com/oneclick/rubyinstaller2/releases/download/rubyinstaller-2.4.5-1/rubyinstaller-2.4.5-1-x64.7z",
|
||||||
|
"2.4.6": "https://github.com/oneclick/rubyinstaller2/releases/download/RubyInstaller-2.4.6-1/rubyinstaller-2.4.6-1-x64.7z",
|
||||||
|
"2.4.7": "https://github.com/oneclick/rubyinstaller2/releases/download/RubyInstaller-2.4.7-1/rubyinstaller-2.4.7-1-x64.7z",
|
||||||
|
"2.4.9": "https://github.com/oneclick/rubyinstaller2/releases/download/RubyInstaller-2.4.9-1/rubyinstaller-2.4.9-1-x64.7z",
|
||||||
|
"2.4.10": "https://github.com/oneclick/rubyinstaller2/releases/download/RubyInstaller-2.4.10-1/rubyinstaller-2.4.10-1-x64.7z",
|
||||||
|
"2.5.0": "https://github.com/oneclick/rubyinstaller2/releases/download/rubyinstaller-2.5.0-2/rubyinstaller-2.5.0-2-x64.7z",
|
||||||
|
"2.5.1": "https://github.com/oneclick/rubyinstaller2/releases/download/rubyinstaller-2.5.1-2/rubyinstaller-2.5.1-2-x64.7z",
|
||||||
|
"2.5.3": "https://github.com/oneclick/rubyinstaller2/releases/download/rubyinstaller-2.5.3-1/rubyinstaller-2.5.3-1-x64.7z",
|
||||||
|
"2.5.5": "https://github.com/oneclick/rubyinstaller2/releases/download/RubyInstaller-2.5.5-1/rubyinstaller-2.5.5-1-x64.7z",
|
||||||
|
"2.5.6": "https://github.com/oneclick/rubyinstaller2/releases/download/RubyInstaller-2.5.6-1/rubyinstaller-2.5.6-1-x64.7z",
|
||||||
|
"2.5.7": "https://github.com/oneclick/rubyinstaller2/releases/download/RubyInstaller-2.5.7-1/rubyinstaller-2.5.7-1-x64.7z",
|
||||||
|
"2.5.8": "https://github.com/oneclick/rubyinstaller2/releases/download/RubyInstaller-2.5.8-2/rubyinstaller-2.5.8-2-x64.7z",
|
||||||
|
"2.5.9": "https://github.com/oneclick/rubyinstaller2/releases/download/RubyInstaller-2.5.9-1/rubyinstaller-2.5.9-1-x64.7z",
|
||||||
|
"2.6.0": "https://github.com/oneclick/rubyinstaller2/releases/download/RubyInstaller-2.6.0-1/rubyinstaller-2.6.0-1-x64.7z",
|
||||||
|
"2.6.1": "https://github.com/oneclick/rubyinstaller2/releases/download/RubyInstaller-2.6.1-1/rubyinstaller-2.6.1-1-x64.7z",
|
||||||
|
"2.6.2": "https://github.com/oneclick/rubyinstaller2/releases/download/RubyInstaller-2.6.2-1/rubyinstaller-2.6.2-1-x64.7z",
|
||||||
|
"2.6.3": "https://github.com/oneclick/rubyinstaller2/releases/download/RubyInstaller-2.6.3-1/rubyinstaller-2.6.3-1-x64.7z",
|
||||||
|
"2.6.4": "https://github.com/oneclick/rubyinstaller2/releases/download/RubyInstaller-2.6.4-1/rubyinstaller-2.6.4-1-x64.7z",
|
||||||
|
"2.6.5": "https://github.com/oneclick/rubyinstaller2/releases/download/RubyInstaller-2.6.5-1/rubyinstaller-2.6.5-1-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.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.6.10": "https://github.com/oneclick/rubyinstaller2/releases/download/RubyInstaller-2.6.10-1/rubyinstaller-2.6.10-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",
|
||||||
|
"2.7.6": "https://github.com/oneclick/rubyinstaller2/releases/download/RubyInstaller-2.7.6-1/rubyinstaller-2.7.6-1-x64.7z",
|
||||||
|
"2.7.7": "https://github.com/oneclick/rubyinstaller2/releases/download/RubyInstaller-2.7.7-1/rubyinstaller-2.7.7-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.0.4": "https://github.com/oneclick/rubyinstaller2/releases/download/RubyInstaller-3.0.4-1/rubyinstaller-3.0.4-1-x64.7z",
|
||||||
|
"3.0.5": "https://github.com/oneclick/rubyinstaller2/releases/download/RubyInstaller-3.0.5-1/rubyinstaller-3.0.5-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",
|
||||||
|
"3.1.1": "https://github.com/oneclick/rubyinstaller2/releases/download/RubyInstaller-3.1.1-1/rubyinstaller-3.1.1-1-x64.7z",
|
||||||
|
"3.1.2": "https://github.com/oneclick/rubyinstaller2/releases/download/RubyInstaller-3.1.2-1/rubyinstaller-3.1.2-1-x64.7z",
|
||||||
|
"3.1.3": "https://github.com/oneclick/rubyinstaller2/releases/download/RubyInstaller-3.1.3-1/rubyinstaller-3.1.3-1-x64.7z",
|
||||||
|
"3.2.0": "https://github.com/oneclick/rubyinstaller2/releases/download/RubyInstaller-3.2.0-1/rubyinstaller-3.2.0-1-x64.7z",
|
||||||
|
"head": "https://github.com/oneclick/rubyinstaller2/releases/download/rubyinstaller-head/rubyinstaller-head-x64.7z",
|
||||||
|
"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",
|
||||||
|
"ucrt": "https://github.com/MSP-Greg/ruby-loco/releases/download/ruby-master/ruby-ucrt.7z"
|
||||||
|
}
|
||||||
+261
-65
@@ -1,13 +1,39 @@
|
|||||||
// Most of this logic is from
|
// 7z arguments
|
||||||
// https://github.com/MSP-Greg/actions-ruby/blob/master/lib/main.js
|
// -aoa overwrite existing, -bd disable progress indicator
|
||||||
|
|
||||||
|
// OpenSSL version detection is needed in installGCCTools and installJRubyTools
|
||||||
|
|
||||||
const fs = require('fs')
|
const fs = require('fs')
|
||||||
|
const path = require('path')
|
||||||
|
const cp = require('child_process')
|
||||||
const core = require('@actions/core')
|
const core = require('@actions/core')
|
||||||
const exec = require('@actions/exec')
|
const exec = require('@actions/exec')
|
||||||
|
const io = require('@actions/io')
|
||||||
const tc = require('@actions/tool-cache')
|
const tc = require('@actions/tool-cache')
|
||||||
const rubyInstallerVersions = require('./windows-versions').versions
|
const common = require('./common')
|
||||||
|
const rubyInstallerVersions = require('./windows-versions.json')
|
||||||
|
|
||||||
|
const drive = common.drive
|
||||||
|
|
||||||
|
const msys2GCCReleaseURI = 'https://github.com/ruby/setup-msys2-gcc/releases/download'
|
||||||
|
|
||||||
|
const msys2BasePath = process.env['GHCUP_MSYS2']
|
||||||
|
const vcPkgBasePath = process.env['VCPKG_INSTALLATION_ROOT']
|
||||||
|
|
||||||
|
// needed for Ruby 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 (MSYS1), used with 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) {
|
export function getAvailableVersions(platform, engine) {
|
||||||
|
if (!common.supportedPlatforms.includes(platform)) {
|
||||||
|
throw new Error(`Unsupported platform ${platform}`)
|
||||||
|
}
|
||||||
|
|
||||||
if (engine === 'ruby') {
|
if (engine === 'ruby') {
|
||||||
return Object.keys(rubyInstallerVersions)
|
return Object.keys(rubyInstallerVersions)
|
||||||
} else {
|
} else {
|
||||||
@@ -15,97 +41,267 @@ export function getAvailableVersions(platform, engine) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function install(platform, ruby) {
|
export async function install(platform, engine, version) {
|
||||||
const version = ruby.split('-', 2)[1]
|
|
||||||
const url = rubyInstallerVersions[version]
|
const url = rubyInstallerVersions[version]
|
||||||
console.log(url)
|
|
||||||
|
// 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')
|
throw new Error(`URL should end in .7z: ${url}`)
|
||||||
}
|
}
|
||||||
const base = url.slice(url.lastIndexOf('/') + 1, url.length - '.7z'.length)
|
const base = url.slice(url.lastIndexOf('/') + 1, url.length - '.7z'.length)
|
||||||
|
|
||||||
// Extract to SSD, see https://github.com/ruby/setup-ruby/pull/14
|
let rubyPrefix, inToolCache
|
||||||
const drive = (process.env['GITHUB_WORKSPACE'] || 'C')[0]
|
if (common.shouldUseToolCache(engine, version)) {
|
||||||
|
inToolCache = tc.find('Ruby', version)
|
||||||
const downloadPath = await tc.downloadTool(url)
|
if (inToolCache) {
|
||||||
await exec.exec('7z', ['x', downloadPath, `-xr!${base}\\share\\doc`, `-o${drive}:\\`], { silent: true })
|
rubyPrefix = inToolCache
|
||||||
const rubyPrefix = `${drive}:\\${base}`
|
} else {
|
||||||
|
rubyPrefix = common.getToolCacheRubyPrefix(platform, version)
|
||||||
const [hostedRuby, msys2] = await linkMSYS2()
|
}
|
||||||
setupPath((ruby === 'ruby-mswin' ? null : msys2), rubyPrefix)
|
} else {
|
||||||
|
rubyPrefix = `${drive}:\\${base}`
|
||||||
if (version.startsWith('2.2') || version.startsWith('2.3')) {
|
|
||||||
core.exportVariable('SSL_CERT_FILE', `${hostedRuby}\\ssl\\cert.pem`)
|
|
||||||
} else if (version === 'mswin') {
|
|
||||||
setupMSWin(hostedRuby)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!fs.existsSync(`${rubyPrefix}\\bin\\bundle.cmd`)) {
|
let toolchainPaths = (version === 'mswin') ? await setupMSWin() : await setupMingw(version)
|
||||||
await exec.exec(`${rubyPrefix}\\bin\\gem install bundler -v "~> 1" --no-document`)
|
|
||||||
|
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, version)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (version === 'mswin') {
|
||||||
|
await installVCPkg()
|
||||||
|
}
|
||||||
|
|
||||||
|
const ridk = `${rubyPrefix}\\bin\\ridk.cmd`
|
||||||
|
if (fs.existsSync(ridk)) {
|
||||||
|
await common.measure('Adding ridk env variables', async () => addRidkEnv(ridk))
|
||||||
}
|
}
|
||||||
|
|
||||||
return rubyPrefix
|
return rubyPrefix
|
||||||
}
|
}
|
||||||
|
|
||||||
function setupMSWin(hostedRuby) {
|
// Actions windows-2022 image does not contain any mingw or ucrt build tools. Install tools for it,
|
||||||
// All standard MSVC OpenSSL builds use C:\Program Files\Common Files\SSL
|
// and also install ucrt tools on earlier versions, which have msys2 and mingw tools preinstalled.
|
||||||
const certsDir = 'C:\\Program Files\\Common Files\\SSL\\certs'
|
async function installGCCTools(type, version) {
|
||||||
|
// 2022-Dec ruby/msys2-gcc-pkgs now uses a suffix to delineate different archive versions.
|
||||||
|
// At present, the only use is to indicate the included OpenSSL version.
|
||||||
|
// With no suffix, archives include OpenSSL 1.1.1, with a '-3.0' suffix, they include
|
||||||
|
// OpenSSL 3.0.x.
|
||||||
|
// Currently, OpenSSL 3 is used in Ruby 3.2 & 'head', both use a custom RubyInstaller2 package.
|
||||||
|
let suffix = ''
|
||||||
|
if ((version === 'head') || (!common.isHeadVersion(version) && common.floatVersion(version) >= 3.2)) {
|
||||||
|
suffix = '-3.0'
|
||||||
|
}
|
||||||
|
const downloadPath = await common.measure(`Downloading ${type}${suffix} build tools`, async () => {
|
||||||
|
let url = `${msys2GCCReleaseURI}/msys2-gcc-pkgs/${type}${suffix}.7z`
|
||||||
|
console.log(url)
|
||||||
|
return await tc.downloadTool(url)
|
||||||
|
})
|
||||||
|
|
||||||
|
await common.measure(`Extracting ${type}${suffix} build tools`, async () =>
|
||||||
|
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 = `${msys2GCCReleaseURI}/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.rmSync(`${msys2BasePath}\\var\\lib\\pacman\\local`, { recursive: true, force: true })
|
||||||
|
|
||||||
|
await common.measure(`Extracting msys2 build tools`, async () =>
|
||||||
|
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()
|
||||||
|
// Will need to add OpenSSL version detection when JRuby uses OpenSSL 3.0 ?
|
||||||
|
await installGCCTools('mingw64', '2.7')
|
||||||
|
}
|
||||||
|
|
||||||
|
// Install vcpkg files needed to build mswin Ruby
|
||||||
|
async function installVCPkg() {
|
||||||
|
const downloadPath = await common.measure(`Downloading mswin vcpkg packages`, async () => {
|
||||||
|
let url = `${msys2GCCReleaseURI}/msys2-gcc-pkgs/mswin.7z`
|
||||||
|
console.log(url)
|
||||||
|
return await tc.downloadTool(url)
|
||||||
|
})
|
||||||
|
|
||||||
|
await common.measure(`Extracting mswin vcpkg packages`, async () =>
|
||||||
|
exec.exec('7z', ['x', downloadPath, '-aoa', '-bd', `-o${vcPkgBasePath}`], { silent: true }))
|
||||||
|
}
|
||||||
|
|
||||||
|
async function downloadAndExtract(engine, version, url, base, rubyPrefix) {
|
||||||
|
const parentDir = path.dirname(rubyPrefix)
|
||||||
|
|
||||||
|
const downloadPath = await common.measure('Downloading Ruby', async () => {
|
||||||
|
console.log(url)
|
||||||
|
return await tc.downloadTool(url)
|
||||||
|
})
|
||||||
|
|
||||||
|
await common.measure('Extracting Ruby', async () =>
|
||||||
|
// -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)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (common.shouldUseToolCache(engine, version)) {
|
||||||
|
common.createToolCacheCompleteFile(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 MSYS1', async () => installMSYS1(version))
|
||||||
|
return msysPathEntries
|
||||||
|
} else {
|
||||||
|
return []
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 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${msys1}`], { silent: true })
|
||||||
|
|
||||||
|
// below are set in the old devkit.rb file ?
|
||||||
|
core.exportVariable('RI_DEVKIT', msys1)
|
||||||
|
core.exportVariable('CC' , 'gcc')
|
||||||
|
core.exportVariable('CXX', 'g++')
|
||||||
|
core.exportVariable('CPP', 'cpp')
|
||||||
|
core.info(`Installed RubyInstaller DevKit for Ruby ${version}`)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function setupMSWin() {
|
||||||
|
core.exportVariable('MAKE', 'nmake.exe')
|
||||||
|
|
||||||
|
// Pre-installed OpenSSL use C:\Program Files\Common Files\SSL
|
||||||
|
let certsDir = 'C:\\Program Files\\Common Files\\SSL\\certs'
|
||||||
if (!fs.existsSync(certsDir)) {
|
if (!fs.existsSync(certsDir)) {
|
||||||
fs.mkdirSync(certsDir)
|
fs.mkdirSync(certsDir, { recursive: true })
|
||||||
}
|
}
|
||||||
|
|
||||||
// Copy cert.pem from hosted Ruby
|
// cert.pem location is hard-coded by OpenSSL msvc builds
|
||||||
const cert = 'C:\\Program Files\\Common Files\\SSL\\cert.pem'
|
let cert = 'C:\\Program Files\\Common Files\\SSL\\cert.pem'
|
||||||
if (!fs.existsSync(cert)) {
|
if (!fs.existsSync(cert)) {
|
||||||
const hostedCert = `${hostedRuby}\\ssl\\cert.pem`
|
fs.copyFileSync(certFile, cert)
|
||||||
fs.copyFileSync(hostedCert, cert)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add a convenience VCVARS environment variable to ease setting up MSVC
|
// vcpkg openssl uses packages\openssl_x64-windows\certs
|
||||||
// This assumes a single Visual Studio version being available in the windows-latest image
|
certsDir = `${vcPkgBasePath}\\packages\\openssl_x64-windows\\certs`
|
||||||
core.exportVariable('VCVARS', '"C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Enterprise\\VC\\Auxiliary\\Build\\vcvars64.bat"')
|
if (!fs.existsSync(certsDir)) {
|
||||||
|
fs.mkdirSync(certsDir, { recursive: true })
|
||||||
|
}
|
||||||
|
|
||||||
|
// vcpkg openssl uses packages\openssl_x64-windows\cert.pem
|
||||||
|
cert = `${vcPkgBasePath}\\packages\\openssl_x64-windows\\cert.pem`
|
||||||
|
fs.copyFileSync(certFile, cert)
|
||||||
|
|
||||||
|
return await common.measure('Setting up MSVC environment', async () => addVCVARSEnv())
|
||||||
}
|
}
|
||||||
|
|
||||||
async function linkMSYS2() {
|
/* Sets MSVC environment for use in Actions
|
||||||
const toolCacheVersions = tc.findAllVersions('Ruby')
|
* allows steps to run without running vcvars*.bat, also for PowerShell
|
||||||
toolCacheVersions.sort()
|
* adds a convenience VCVARS environment variable
|
||||||
if (toolCacheVersions.length === 0) {
|
* this assumes a single Visual Studio version being available in the Windows images */
|
||||||
throw new Error('Could not find MSYS2 in the toolcache')
|
export function addVCVARSEnv() {
|
||||||
|
let cmd = 'vswhere -latest -property installationPath'
|
||||||
|
let vcVars = `${cp.execSync(cmd).toString().trim()}\\VC\\Auxiliary\\Build\\vcvars64.bat`
|
||||||
|
|
||||||
|
if (!fs.existsSync(vcVars)) {
|
||||||
|
throw new Error(`Missing vcVars file: ${vcVars}`)
|
||||||
}
|
}
|
||||||
const latestVersion = toolCacheVersions.slice(-1)[0]
|
core.exportVariable('VCVARS', vcVars)
|
||||||
const latestHostedRuby = tc.find('Ruby', latestVersion)
|
|
||||||
|
|
||||||
const hostedMSYS2 = `${latestHostedRuby}\\msys64`
|
cmd = `cmd.exe /c ""${vcVars}" && set"`
|
||||||
const msys2 = 'C:\\msys64'
|
|
||||||
if (!fs.existsSync(msys2)) {
|
|
||||||
await exec.exec(`cmd /c mklink /D ${msys2} ${hostedMSYS2}`)
|
|
||||||
}
|
|
||||||
return [latestHostedRuby, msys2]
|
|
||||||
}
|
|
||||||
|
|
||||||
export function setupPath(msys2, rubyPrefix) {
|
let newEnv = new Map()
|
||||||
const originalPath = process.env['PATH'].split(';')
|
let newSet = cp.execSync(cmd).toString().trim().split(/\r?\n/)
|
||||||
let path = originalPath.slice()
|
newSet = newSet.filter(line => /\S=\S/.test(line))
|
||||||
|
newSet.forEach(s => {
|
||||||
|
let [k,v] = common.partition(s, '=')
|
||||||
|
newEnv.set(k,v)
|
||||||
|
})
|
||||||
|
|
||||||
// Remove default Ruby in PATH
|
let newPathEntries = undefined
|
||||||
path = path.filter(e => !e.match(/\bRuby\b/))
|
for (let [k, v] of newEnv) {
|
||||||
|
if (process.env[k] !== v) {
|
||||||
|
if (/^Path$/i.test(k)) {
|
||||||
|
const newPathStr = v.replace(`${path.delimiter}${process.env['Path']}`, '')
|
||||||
|
newPathEntries = newPathStr.split(path.delimiter)
|
||||||
|
} else {
|
||||||
|
core.exportVariable(k, v)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return newPathEntries
|
||||||
|
}
|
||||||
|
|
||||||
if (msys2) {
|
// ssl files cause issues with non RI2 Rubies (<2.4) and ruby/ruby's CI from build folder due to dll resolution
|
||||||
// Add MSYS2 in PATH
|
function renameSystem32Dlls() {
|
||||||
path.unshift(`${msys2}\\mingw64\\bin`, `${msys2}\\usr\\bin`)
|
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}_`))
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Add the downloaded Ruby in PATH
|
// Sets MSYS2 ENV variables set from running `ridk enable`
|
||||||
path.unshift(`${rubyPrefix}\\bin`)
|
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)
|
||||||
|
})
|
||||||
|
|
||||||
console.log("Entries removed from PATH to avoid conflicts with Ruby:")
|
for (let [k, v] of newEnv) {
|
||||||
for (const entry of originalPath) {
|
if (process.env[k] !== v) {
|
||||||
if (!path.includes(entry)) {
|
if (!/^Path$/i.test(k)) {
|
||||||
console.log(entry)
|
console.log(`${k}=${v}`)
|
||||||
|
core.exportVariable(k, v)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const newPath = path.join(';')
|
|
||||||
core.exportVariable('PATH', newPath)
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user