mirror of
https://github.com/ruby/setup-ruby.git
synced 2026-09-13 22:44:20 +02:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f2f42b7848 | ||
|
|
5547c873c2 | ||
|
|
d781c1b4ed | ||
|
|
8711a86ab6 | ||
|
|
ef45abe478 | ||
|
|
8388f20e6a | ||
|
|
2654679fe7 | ||
|
|
1287d2b408 | ||
|
|
84b14e9e47 | ||
|
|
28c4deda89 | ||
|
|
fbaef13682 | ||
|
|
f72249c5c9 | ||
|
|
87b48937c9 | ||
|
|
fd2daeae79 | ||
|
|
1d542747a7 | ||
|
|
7a6302104f | ||
|
|
8e51ba9a0a | ||
|
|
868b3f0884 | ||
|
|
4a9ddd6f33 | ||
|
|
bfefad842b | ||
|
|
540484a3c0 | ||
|
|
401c19e14f | ||
|
|
2a18b06812 | ||
|
|
2e3487c00e | ||
|
|
6825c765eb | ||
|
|
9a9fe58c47 | ||
|
|
a2bbe5b1b2 | ||
|
|
46ca53beb3 | ||
|
|
217c988b8c | ||
|
|
c6d4d2ab97 | ||
|
|
8c27ea3449 | ||
|
|
7d3497fd78 | ||
|
|
98aefb3c83 | ||
|
|
7bae1d00b5 | ||
|
|
4d521eadc8 | ||
|
|
1d9686e3ef | ||
|
|
bea2fb915c | ||
|
|
f269373437 | ||
|
|
784fcda67f | ||
|
|
f6e05710ec | ||
|
|
207a39969b | ||
|
|
086ffb1a20 | ||
|
|
27ceac8081 | ||
|
|
aac0c64812 | ||
|
|
727fd4feab | ||
|
|
79c01b8847 | ||
|
|
c04af2bb72 | ||
|
|
17f5c914a0 | ||
|
|
5496baa6db | ||
|
|
0ec4904dc7 | ||
|
|
f321cf5a4d | ||
|
|
6af8267b44 | ||
|
|
a6b46b8a08 | ||
|
|
52753b7da8 | ||
|
|
a6e6f86333 | ||
|
|
bc2ba926aa | ||
|
|
371544706a | ||
|
|
50ba3386b0 | ||
|
|
161cd54b69 | ||
|
|
2a9a743e19 | ||
|
|
3a77c29278 | ||
|
|
382d786c8a | ||
|
|
97e35c5302 | ||
|
|
1d0e911f61 | ||
|
|
c48bc1e88d | ||
|
|
713e0f1ab5 | ||
|
|
af43264f2b | ||
|
|
3251c5c21b | ||
|
|
21a479f2d7 | ||
|
|
3783f195e2 | ||
|
|
ff740bc00a | ||
|
|
78c01b705f | ||
|
|
d5fb7a202f | ||
|
|
0cde4689ba | ||
|
|
a56d16ef33 | ||
|
|
12dfa2bb47 | ||
|
|
68b705993a | ||
|
|
d046db60e3 | ||
|
|
d4138ebc47 | ||
|
|
049eae0450 | ||
|
|
ff22bbb25f | ||
|
|
943103cae7 | ||
|
|
7dc18ff0ca | ||
|
|
00a1085dff | ||
|
|
868b8c0873 | ||
|
|
4f20bb7102 | ||
|
|
6615b4b8a0 | ||
|
|
82dd21cb95 | ||
|
|
cacc9f1c0b | ||
|
|
1198b07430 | ||
|
|
70da3bbf44 | ||
|
|
6bd3d993c6 | ||
|
|
5f19ec79ce | ||
|
|
d4526a5553 | ||
|
|
e9d41d6cc1 | ||
|
|
22fdc77bf4 | ||
|
|
98f8f7e659 | ||
|
|
56dbe84af1 | ||
|
|
e8677f0f39 | ||
|
|
7f2d473c10 | ||
|
|
bd03e04863 | ||
|
|
9c6c84224a | ||
|
|
5daca16544 | ||
|
|
558057564b | ||
|
|
432702e864 | ||
|
|
b203567269 | ||
|
|
c6e5aea595 | ||
|
|
360dc864d5 | ||
|
|
251b9047a8 | ||
|
|
961f85197f | ||
|
|
28f930222f | ||
|
|
df99e806d4 | ||
|
|
ff4c96868c | ||
|
|
b256bd96bb | ||
|
|
af848b40be | ||
|
|
8575951200 | ||
|
|
036ef458dd | ||
|
|
552f83fe52 | ||
|
|
54a18e26db | ||
|
|
cd48c8e227 | ||
|
|
a05e47355e | ||
|
|
eba3a0f992 | ||
|
|
679e23d4a3 | ||
|
|
9f4cc09ff9 | ||
|
|
4d745286b4 | ||
|
|
5cfe23c062 | ||
|
|
f887fb3d0e | ||
|
|
b1c3bf6751 | ||
|
|
d37167af45 | ||
|
|
52b8784594 | ||
|
|
9aede54d98 | ||
|
|
24a61db157 | ||
|
|
5311f05890 | ||
|
|
cb3f1e45ed | ||
|
|
4f1c6a74a7 | ||
|
|
b252db7f27 | ||
|
|
250fcd6a74 | ||
|
|
bc1dd263b6 | ||
|
|
8a45918450 | ||
|
|
92a3389c13 | ||
|
|
7d546f4868 | ||
|
|
4e64415f09 | ||
|
|
d2b39ad0b5 | ||
|
|
e939497f6f | ||
|
|
6cecb48364 | ||
|
|
4d88f85d08 | ||
|
|
55283cc231 | ||
|
|
904f3fef85 | ||
|
|
ec02537da5 | ||
|
|
089557fc38 | ||
|
|
e6689b4deb | ||
|
|
9669f3ee51 | ||
|
|
31a7f6d628 | ||
|
|
59b5745c73 | ||
|
|
d03a71de6e | ||
|
|
ddde3938f5 | ||
|
|
5a73aa9f67 | ||
|
|
d01c52ad8b | ||
|
|
377a94bc68 | ||
|
|
66dc012cc3 | ||
|
|
2789f85824 | ||
|
|
fbb865d04d | ||
|
|
96ac949ea0 | ||
|
|
92aece5fc9 | ||
|
|
db791aad7b | ||
|
|
d3c9825d67 | ||
|
|
f60ef1e808 | ||
|
|
bc4e585e26 | ||
|
|
2cf593d66b | ||
|
|
a26e1fb6b3 | ||
|
|
4d060a10e6 | ||
|
|
77fe3b48b7 | ||
|
|
8df78e5576 | ||
|
|
b8e62b879e | ||
|
|
d60780f6b6 | ||
|
|
8aa012b56d | ||
|
|
628be4e0e4 | ||
|
|
ee26e27437 | ||
|
|
93287a1fa8 | ||
|
|
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 | ||
|
|
01b616c294 | ||
|
|
f010ae485f | ||
|
|
739b731933 | ||
|
|
0cbcadc627 | ||
|
|
91a6c780c4 | ||
|
|
dbcdcf481d | ||
|
|
d2b72024f1 | ||
|
|
78fd200603 | ||
|
|
ca7fe3d91f | ||
|
|
de68645eec | ||
|
|
20324f7e34 | ||
|
|
7f508b5101 | ||
|
|
94fe02071e | ||
|
|
d81cbeb0ce | ||
|
|
06ab568b6a | ||
|
|
d186982201 | ||
|
|
d649a291c3 | ||
|
|
cdeaf534b7 | ||
|
|
3197025b07 | ||
|
|
28def02321 | ||
|
|
3d6280ad19 | ||
|
|
980126329a | ||
|
|
4f28d1c82e | ||
|
|
53b22d2360 | ||
|
|
55dff253ca | ||
|
|
e15ecc8aaa | ||
|
|
71f024b642 | ||
|
|
30011b6444 | ||
|
|
f422c055c3 | ||
|
|
a01ba37375 | ||
|
|
fdfc519f55 | ||
|
|
480f78f4b6 | ||
|
|
48efd73814 | ||
|
|
5478747ea7 | ||
|
|
8a173f1bc2 | ||
|
|
48481806ad | ||
|
|
623e527949 | ||
|
|
c933cecfdc | ||
|
|
7c15ff8590 | ||
|
|
58366f2203 | ||
|
|
f5483241db | ||
|
|
0331c8b821 | ||
|
|
818f4eeb16 | ||
|
|
052cbd8ee4 | ||
|
|
001fd1b7c7 | ||
|
|
4d7199dbd0 | ||
|
|
5dd450999e | ||
|
|
3551d3fbd4 | ||
|
|
07160f610f | ||
|
|
0449254cae | ||
|
|
689f94552b | ||
|
|
db2d09d84c | ||
|
|
8b354c238c | ||
|
|
7f4c88c00b | ||
|
|
dbac26120b | ||
|
|
0f26fedc26 | ||
|
|
7da380d64e | ||
|
|
5f2df8a190 | ||
|
|
4ff821c778 | ||
|
|
34fa48c067 | ||
|
|
a66a46f031 | ||
|
|
537d9f67b4 | ||
|
|
69599c886c | ||
|
|
247acff66d | ||
|
|
7978ff1579 | ||
|
|
30cd88adf9 | ||
|
|
7005fbe92a | ||
|
|
026be4409b | ||
|
|
0ed24c9d6c | ||
|
|
9dab9b8155 | ||
|
|
69709d16de | ||
|
|
ae627f04d2 | ||
|
|
eb85b2a580 | ||
|
|
61efe96192 | ||
|
|
7b9c95cc8e | ||
|
|
74ac24dec4 | ||
|
|
b01832a197 |
@@ -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,43 @@
|
|||||||
|
name: Bug report
|
||||||
|
description: Create a report to help us improve
|
||||||
|
body:
|
||||||
|
- type: markdown
|
||||||
|
attributes:
|
||||||
|
value: |
|
||||||
|
First, take some time to think whether this is really an issue of ruby/setup-ruby and whether it is fixable in this action.
|
||||||
|
This action basically just downloads a prebuilt Ruby and adds it to `PATH`, so it is unlikely the bug is in this action.
|
||||||
|
Give some thoughts whether it could be an issue in your workflow, in the gems you use, in GitHub Actions, in Ruby, RubyGems, Bundler, etc.
|
||||||
|
This is NOT the place to ask help about your workflow failing (ask that on [GitHub Community](https://github.com/orgs/community/discussions/categories/actions) or [Discussions](https://github.com/ruby/setup-ruby/discussions) instead), it is only to report issues about ruby/setup-ruby.
|
||||||
|
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: input
|
||||||
|
attributes:
|
||||||
|
label: Link to the failed workflow job (must be a public workflow job, so the necessary information is available)
|
||||||
|
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,6 @@
|
|||||||
|
version: 2
|
||||||
|
updates:
|
||||||
|
- package-ecosystem: 'github-actions'
|
||||||
|
directory: '/'
|
||||||
|
schedule:
|
||||||
|
interval: 'weekly'
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
name: Create a Release
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
permissions:
|
||||||
|
contents: write # for creating release
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
release:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
env:
|
||||||
|
GH_TOKEN: ${{ github.token }}
|
||||||
|
GH_REPO: ${{ github.repository }}
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
- uses: ./
|
||||||
|
with:
|
||||||
|
ruby-version: '3.3'
|
||||||
|
- run: ruby release.rb
|
||||||
|
# The same as the update-v1-branch.yml workflow.
|
||||||
|
# That workflow is not triggered by the release created above because of
|
||||||
|
# https://docs.github.com/en/actions/security-guides/automatic-token-authentication#using-the-github_token-in-a-workflow
|
||||||
|
- run: git push origin HEAD:v1
|
||||||
+376
-25
@@ -1,41 +1,392 @@
|
|||||||
name: Test this action
|
name: Test this action
|
||||||
on: [push]
|
on:
|
||||||
|
pull_request:
|
||||||
|
push:
|
||||||
|
branches-ignore:
|
||||||
|
- v1
|
||||||
|
tags-ignore:
|
||||||
|
- '*'
|
||||||
|
paths-ignore:
|
||||||
|
- README.md
|
||||||
|
workflow_dispatch:
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
test:
|
test:
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
os: [ ubuntu-16.04, ubuntu-18.04, macos-latest, windows-latest ]
|
os: [ ubuntu-20.04, ubuntu-22.04, ubuntu-24.04, ubuntu-22.04-arm, ubuntu-24.04-arm, macos-13, macos-14, macos-15, windows-2019, windows-2022, windows-2025 ]
|
||||||
# Use various version syntaxes here for testing
|
ruby: [
|
||||||
ruby: [ .ruby-version, 2.3, ruby-2.4, 2.5, ruby-2.6.5, 2.7.0, jruby, truffleruby ]
|
'1.9', '2.0', '2.1', '2.2', '2.3', '2.4', '2.5', '2.6', '2.7', '3.0', '3.1', '3.2', '3.3', '3.4', 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 }
|
||||||
|
- { os: windows-2025, ruby: mingw }
|
||||||
|
- { os: windows-2025, ruby: mswin }
|
||||||
|
- { os: windows-2025, ruby: ucrt }
|
||||||
|
- { os: ubuntu-24.04, ruby: asan }
|
||||||
exclude:
|
exclude:
|
||||||
- os: windows-latest
|
# https://github.com/ruby/setup-ruby/issues/496
|
||||||
ruby: 2.3
|
- { os: ubuntu-22.04, ruby: '2.2' }
|
||||||
- os: windows-latest
|
- { os: ubuntu-24.04, ruby: '1.9' }
|
||||||
ruby: jruby
|
- { os: ubuntu-24.04, ruby: '2.2' }
|
||||||
- os: windows-latest
|
# These old Rubies fail to compile on macOS arm64
|
||||||
ruby: truffleruby
|
- { os: macos-14, ruby: '1.9' }
|
||||||
|
- { os: macos-14, ruby: '2.0' }
|
||||||
|
- { os: macos-14, ruby: '2.1' }
|
||||||
|
- { os: macos-14, ruby: '2.2' }
|
||||||
|
- { os: macos-14, ruby: '2.3' }
|
||||||
|
- { os: macos-14, ruby: '2.4' }
|
||||||
|
- { os: macos-14, ruby: '2.5' }
|
||||||
|
- { os: macos-15, ruby: '1.9' }
|
||||||
|
- { os: macos-15, ruby: '2.0' }
|
||||||
|
- { os: macos-15, ruby: '2.1' }
|
||||||
|
- { os: macos-15, ruby: '2.2' }
|
||||||
|
- { os: macos-15, ruby: '2.3' }
|
||||||
|
- { os: macos-15, ruby: '2.4' }
|
||||||
|
- { os: macos-15, ruby: '2.5' }
|
||||||
|
# These old Rubies fail to compile or segfault on Linux arm64
|
||||||
|
- { os: ubuntu-22.04-arm, ruby: '1.9' }
|
||||||
|
- { os: ubuntu-22.04-arm, ruby: '2.0' }
|
||||||
|
- { os: ubuntu-22.04-arm, ruby: '2.1' }
|
||||||
|
- { os: ubuntu-22.04-arm, ruby: '2.2' }
|
||||||
|
- { os: ubuntu-24.04-arm, ruby: '1.9' }
|
||||||
|
- { os: ubuntu-24.04-arm, ruby: '2.0' }
|
||||||
|
- { os: ubuntu-24.04-arm, ruby: '2.1' }
|
||||||
|
- { os: ubuntu-24.04-arm, ruby: '2.2' }
|
||||||
|
# Windows (note: previews are not available on Windows)
|
||||||
|
- { os: windows-2019, ruby: '1.9' }
|
||||||
|
- { os: windows-2022, ruby: '1.9' }
|
||||||
|
- { os: windows-2025, ruby: '1.9' }
|
||||||
|
- { os: windows-2019, ruby: debug }
|
||||||
|
- { os: windows-2022, ruby: debug }
|
||||||
|
- { os: windows-2025, ruby: debug }
|
||||||
|
- { os: windows-2019, ruby: truffleruby }
|
||||||
|
- { os: windows-2022, ruby: truffleruby }
|
||||||
|
- { os: windows-2025, ruby: truffleruby }
|
||||||
|
- { os: windows-2019, ruby: truffleruby-head }
|
||||||
|
- { os: windows-2022, ruby: truffleruby-head }
|
||||||
|
- { os: windows-2025, ruby: truffleruby-head }
|
||||||
|
- { os: windows-2019, ruby: truffleruby+graalvm }
|
||||||
|
- { os: windows-2022, ruby: truffleruby+graalvm }
|
||||||
|
- { os: windows-2025, ruby: truffleruby+graalvm }
|
||||||
|
- { os: windows-2019, ruby: truffleruby+graalvm-head }
|
||||||
|
- { os: windows-2022, ruby: truffleruby+graalvm-head }
|
||||||
|
- { os: windows-2025, ruby: truffleruby+graalvm-head }
|
||||||
|
|
||||||
|
name: ${{ matrix.os }} ${{ matrix.ruby }}
|
||||||
runs-on: ${{ matrix.os }}
|
runs-on: ${{ matrix.os }}
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
- uses: ./
|
- uses: ./
|
||||||
with:
|
with:
|
||||||
ruby-version: ${{ matrix.ruby }}
|
ruby-version: ${{ matrix.ruby }}
|
||||||
- run: ruby --version
|
bundler-cache: true
|
||||||
- run: ridk version
|
- run: ruby -v
|
||||||
if: matrix.os == 'windows-latest'
|
- name: PATH
|
||||||
- name: OpenSSL test
|
shell: pwsh
|
||||||
run: ruby -ropen-uri -e 'puts open(%{https://rubygems.org/}) { |f| f.read(2014) }'
|
run: |
|
||||||
- name: C extension test
|
# Show PATH with Powershell
|
||||||
run: gem install json --no-document
|
$f, $r = $env:PATH.split([IO.Path]::PathSeparator); $r
|
||||||
- name: Check that Bundler is installed
|
|
||||||
run: bundle --version
|
|
||||||
- name: Check that Bundler works
|
|
||||||
run: bundle install
|
|
||||||
|
|
||||||
lint:
|
- name: build compiler
|
||||||
|
run: |
|
||||||
|
ruby -e "puts 'build compiler: ' + RbConfig::CONFIG.fetch('CC_VERSION_MESSAGE', 'unknown').lines.first"
|
||||||
|
- name: gcc and ridk version (mingw)
|
||||||
|
if: startsWith(matrix.os, 'windows')
|
||||||
|
run: |
|
||||||
|
$abi, $plat = $(ruby -e "STDOUT.write RbConfig::CONFIG['ruby_version'] + ' ' + RUBY_PLATFORM").split(' ')
|
||||||
|
if ($plat.Contains('mingw')) {
|
||||||
|
gcc --version
|
||||||
|
if ($abi -ge '2.4') {
|
||||||
|
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
|
||||||
|
run: ruby test_subprocess.rb
|
||||||
|
- 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'
|
||||||
|
if: matrix.ruby != '1.9'
|
||||||
|
- name: OpenSSL test
|
||||||
|
run: ruby -ropen-uri -e 'puts URI.send(:open, %{https://rubygems.org/}) { |f| f.read(1024) }'
|
||||||
|
|
||||||
|
- run: gem env
|
||||||
|
- name: C extension test
|
||||||
|
run: gem install json -v 2.2.0
|
||||||
|
- 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 exec rake --version
|
||||||
|
- run: bundle exec rake
|
||||||
|
|
||||||
|
# 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
|
||||||
|
shell: bash
|
||||||
|
run: which -a ruby
|
||||||
|
- name: which bundle
|
||||||
|
shell: bash
|
||||||
|
run: which -a bundle
|
||||||
|
# https://github.com/ruby/setup-ruby/issues/658
|
||||||
|
if: "matrix.ruby != 'mingw' && matrix.ruby != 'mswin' && matrix.ruby != 'ucrt'"
|
||||||
|
- 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
|
||||||
|
# Should be startsWith(matrix.ruby, 'jruby') but broken on jruby-head: https://github.com/jruby/jruby/issues/8623
|
||||||
|
if: startsWith(matrix.os, 'windows') && matrix.ruby == 'jruby'
|
||||||
|
run: gem install sassc
|
||||||
|
|
||||||
|
testNoGemfile:
|
||||||
|
name: "Test with no Gemfile"
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v4
|
||||||
|
- run: rm Gemfile
|
||||||
|
- uses: ./
|
||||||
|
with:
|
||||||
|
ruby-version: '2.6'
|
||||||
|
- run: ruby -v
|
||||||
|
|
||||||
|
testLatestRubygemsVersion:
|
||||||
|
name: "Test rubygems: latest on ${{ matrix.ruby }}"
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
include:
|
||||||
|
- { ruby: '3.2', expected_rubygems_version: '3.6.1' }
|
||||||
|
- { ruby: '3.0', expected_rubygems_version: '3.5.23' }
|
||||||
|
- { ruby: '2.7', expected_rubygems_version: '3.4.22' }
|
||||||
|
- { ruby: '2.6', expected_rubygems_version: '3.4.22' }
|
||||||
|
- { ruby: '2.5', expected_rubygems_version: '3.3.27' }
|
||||||
|
- { ruby: '2.3', expected_rubygems_version: '3.3.27' }
|
||||||
|
- { ruby: '2.0', expected_rubygems_version: '2.7.11' }
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
- uses: ./
|
||||||
|
with:
|
||||||
|
ruby-version: ${{ matrix.ruby }}
|
||||||
|
rubygems: latest
|
||||||
|
- run: ruby -e 'puts Gem::VERSION; exit(Gem.rubygems_version >= Gem::Version.new("${{ matrix.expected_rubygems_version }}"))'
|
||||||
|
|
||||||
|
testFixedRubygemsVersionUpgrades:
|
||||||
|
name: "Test rubygems: version upgrades RubyGems to that version if the default is older"
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
- 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@v4
|
||||||
|
- 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@v4
|
||||||
|
- 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-20.04
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
- 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@v4
|
||||||
|
- 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@v4
|
||||||
|
- 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@v4
|
||||||
|
- 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@v4
|
||||||
|
- 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@v4
|
||||||
|
- 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@v4
|
||||||
|
- uses: ./
|
||||||
|
with:
|
||||||
|
ruby-version: '2.7'
|
||||||
|
bundler: 1
|
||||||
|
bundler-cache: true
|
||||||
|
- run: bundle --version | grep -F "Bundler version 1."
|
||||||
|
|
||||||
|
testGemfileMatrix:
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
gemfile: [ rails5, rails6 ]
|
||||||
|
name: "Test with ${{ matrix.gemfile }} gemfile"
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
env:
|
||||||
|
BUNDLE_GEMFILE: ${{ github.workspace }}/gemfiles/${{ matrix.gemfile }}.gemfile
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
- uses: ./
|
||||||
|
with:
|
||||||
|
ruby-version: '2.6'
|
||||||
|
bundler-cache: true
|
||||||
|
- run: bundle exec rails --version
|
||||||
|
env:
|
||||||
|
RUBYOPT: '-rlogger' # Rails 6 is missing a require 'logger' in active_support/logger_thread_safe_level.rb
|
||||||
|
|
||||||
|
testTruffleRubyNokogiri:
|
||||||
|
name: "Test installing a Gemfile with nokogiri on TruffleRuby"
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
env:
|
||||||
|
BUNDLE_GEMFILE: ${{ github.workspace }}/gemfiles/nokogiri.gemfile
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
- uses: ./
|
||||||
|
with:
|
||||||
|
ruby-version: truffleruby-head
|
||||||
|
bundler-cache: true
|
||||||
|
- run: bundle list | grep nokogiri
|
||||||
|
|
||||||
|
testWindowsToolchain:
|
||||||
|
name: "Test windows-toolchain: none"
|
||||||
|
runs-on: windows-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
- uses: ./
|
||||||
|
with:
|
||||||
|
ruby-version: '2.7'
|
||||||
|
windows-toolchain: none
|
||||||
|
bundler: none
|
||||||
|
- name: C:/msys64/mingw64/bin/gcc.exe not installed
|
||||||
|
run: ruby -e "abort if File.exist?('C:/msys64/mingw64/bin/gcc.exe')"
|
||||||
|
|
||||||
|
lint:
|
||||||
|
runs-on: ubuntu-20.04
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
- 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
|
||||||
|
|||||||
@@ -0,0 +1,15 @@
|
|||||||
|
name: Update the v1 branch when a release is published manually
|
||||||
|
on:
|
||||||
|
release:
|
||||||
|
types: [published]
|
||||||
|
permissions:
|
||||||
|
contents: write # for git push
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
update_branch:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
- run: git push origin HEAD:v1
|
||||||
@@ -1 +0,0 @@
|
|||||||
ruby-2.6.5
|
|
||||||
@@ -0,0 +1,30 @@
|
|||||||
|
# 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.
|
||||||
|
|
||||||
|
## Release
|
||||||
|
|
||||||
|
Maintainers can create a release automatically by running [this workflow](https://github.com/ruby/setup-ruby/actions/workflows/release.yml).
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
# Used for testing
|
# Used for testing
|
||||||
source 'https://rubygems.org'
|
source 'https://rubygems.org'
|
||||||
|
|
||||||
|
gem "rake"
|
||||||
gem "path"
|
gem "path"
|
||||||
gem "json"
|
gem "json", "2.2.0"
|
||||||
|
|||||||
@@ -1,40 +1,64 @@
|
|||||||
# use-ruby
|
# setup-ruby
|
||||||
|
|
||||||
This action downloads a prebuilt ruby and adds it to `$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 `$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.
|
||||||
|
|
||||||
|
**Important:** Prefer `ruby/setup-ruby@v1`.
|
||||||
|
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
|
||||||
|
|
||||||
This action currently supports these versions of MRI, JRuby and TruffleRuby:
|
This action currently supports these versions of MRI, JRuby and TruffleRuby:
|
||||||
|
|
||||||
| Interpreter | Versions |
|
| Interpreter | Versions |
|
||||||
| ----------- | -------- |
|
| ----------- | -------- |
|
||||||
| Ruby | 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 |
|
| `ruby` | 1.9.3, 2.0.0, 2.1.9, 2.2, all versions from 2.3.0 until 3.4.1, head, debug, mingw, mswin, ucrt |
|
||||||
| JRuby | 9.2.9.0 |
|
| `jruby` | 9.1.17.0 - 9.4.12.0, head |
|
||||||
| TruffleRuby | 19.3.0, 19.3.1 |
|
| `truffleruby` | 19.3.0 - 24.1.2, head |
|
||||||
|
| `truffleruby+graalvm` | 21.2.0 - 24.1.2, head |
|
||||||
|
|
||||||
The recommended way to refer to these versions is:
|
`ruby-debug` is the same as `ruby-head` but with assertions enabled (`-DRUBY_DEBUG=1`).
|
||||||
`2.3`, `2.4`, `2.5`, `2.6`, `2.7`, `jruby`, `truffleruby`.
|
|
||||||
That way, the latest compatible release is used, which contains the most bug fixes.
|
|
||||||
|
|
||||||
See https://github.com/eregon/ruby-install-builder/blob/metadata/versions.json
|
`ruby-asan` is the same as `ruby-head` but with AddressSanitizer (ASan) enabled, helpful for finding memory issues in native extensions.
|
||||||
for the always up-to-date list of available Ruby versions.
|
Native extensions are automatically compiled with AddressSanitizer when using `ruby-asan`.
|
||||||
|
`ruby-asan` is currently only available on `ubuntu-24.04`.
|
||||||
|
|
||||||
Note that Ruby 2.3 and the OpenSSL version it needs (1.0.2) are both end-of-life,
|
Regarding Windows ruby master builds, `mingw` is a MSYS2/MinGW build, `head` & `ucrt` are MSYS2/UCRT64
|
||||||
which means Ruby 2.3 is unmaintained and considered insecure.
|
builds, and `mswin` is a MSVC/VS 2022 build.
|
||||||
On Windows, Ruby 2.4 uses OpenSSL 1.0.2, which is no longer maintained.
|
|
||||||
|
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:
|
The action works on these [GitHub-hosted runners](https://docs.github.com/en/actions/using-github-hosted-runners/about-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.
|
||||||
`ubuntu-16.04`, `ubuntu-18.04`, `macos-latest` and `windows-latest`.
|
|
||||||
|
|
||||||
Ruby 2.3, JRuby and TruffleRuby are not yet supported on `windows-latest`.
|
| Operating System | Supported |
|
||||||
|
| ---------------- | --------- |
|
||||||
|
| Ubuntu | `ubuntu-20.04`, `ubuntu-22.04`, `ubuntu-24.04`, `ubuntu-22.04-arm`, `ubuntu-24.04-arm` |
|
||||||
|
| macOS | `macos-13` and newer versions |
|
||||||
|
| Windows | `windows-2019`, `windows-2022` |
|
||||||
|
|
||||||
The prebuilt rubies are generated by https://github.com/eregon/ruby-install-builder
|
The prebuilt releases are generated by [ruby-builder](https://github.com/ruby/ruby-builder)
|
||||||
and on Windows by https://github.com/oneclick/rubyinstaller2.
|
and on Windows by [RubyInstaller2](https://github.com/oneclick/rubyinstaller2).
|
||||||
|
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),
|
||||||
|
`jruby-head` is generated by [jruby-dev-builder](https://github.com/ruby/jruby-dev-builder),
|
||||||
|
`truffleruby-head` and `truffleruby+graalvm-head` are 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.json](ruby-builder-versions.json) for Ubuntu and macOS
|
||||||
|
(although some combinations are not available, see [the full list](https://github.com/ruby/ruby-builder/releases/tag/toolcache))
|
||||||
|
and in [windows-versions.json](windows-versions.json) for Windows.
|
||||||
|
|
||||||
## Usage
|
## Usage
|
||||||
|
|
||||||
@@ -42,83 +66,219 @@ and on Windows by https://github.com/oneclick/rubyinstaller2.
|
|||||||
|
|
||||||
```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@v4
|
||||||
- uses: eregon/use-ruby-action@master
|
- uses: ruby/setup-ruby@v1
|
||||||
with:
|
with:
|
||||||
ruby-version: 2.6
|
ruby-version: '3.3' # Not needed with a .ruby-version, .tool-versions or mise.toml
|
||||||
- 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', '3.2', '3.3', head, jruby, jruby-head, truffleruby, truffleruby-head]
|
||||||
runs-on: ${{ matrix.os }}
|
runs-on: ${{ matrix.os }}
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v4
|
||||||
- uses: eregon/use-ruby-action@master
|
- 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@v4
|
||||||
|
- uses: ruby/setup-ruby@v1
|
||||||
|
with:
|
||||||
|
ruby-version: '3.3'
|
||||||
|
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` (also the default value) 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
|
||||||
|
* `mise.toml` reads from the project's `mise.toml` file
|
||||||
|
* If the `ruby-version` input is not specified, `.ruby-version` is tried first, followed by `.tool-versions`, followed by `mise.toml`
|
||||||
|
|
||||||
|
### Working Directory
|
||||||
|
|
||||||
|
The `working-directory` input can be set to resolve `.ruby-version`, `.tool-versions`, `mise.toml` 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 job with a Ruby version, replace `${{ matrix.ruby }}` with the Ruby version.
|
Note that any step doing `bundle install` (for the root `Gemfile`) or `gem install bundler` can be removed with `bundler-cache: true`.
|
||||||
When using `.ruby-version`, replace `${{ matrix.ruby }}` with `${{ hashFiles('.ruby-version') }}`.
|
|
||||||
|
|
||||||
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 - Gem example](https://github.com/actions/cache/blob/master/examples.md#ruby---gem).
|
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.
|
||||||
|
|
||||||
## Limitations
|
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).
|
||||||
|
|
||||||
* This action currently only works with GitHub-hosted runners, not private runners.
|
#### 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
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
* 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).
|
||||||
|
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.
|
||||||
|
* For Ruby ≥ 2.4, MSYS2 is prepended to the `Path`, similar to what RubyInstaller2 does.
|
||||||
|
* 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)).
|
||||||
|
* 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)).
|
||||||
|
* When compiling extension code, note that the packages required to build Ruby are included when using Windows 2022, but that Windows 2019 does not include all of them, and may require installing package(s). This can be done with [setup-ruby-pkgs](https://github.com/ruby/setup-ruby-pkgs) or via MSYS2's pacman. These packages may be required when installing or updating Ruby std-lib extension gems.
|
||||||
|
|
||||||
|
## 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 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.
|
||||||
|
* 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, you will need to install Ruby in the runner tool cache as shown by the action when it detects that case
|
||||||
|
(run it so it will show you where to install Ruby).
|
||||||
|
You could of course also not use this action and e.g. use Ruby from a system package or use a Docker image instead.
|
||||||
|
|
||||||
|
See also the [`self-hosted:` input](action.yml).
|
||||||
|
You can set it to `true` if you want to use custom-built Rubies in your self-hosted toolcache instead of prebuild Rubies.
|
||||||
|
|
||||||
|
## 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
|
||||||
|
|
||||||
Most of the Windows logic is from https://github.com/MSP-Greg/actions-ruby by MSP-Greg.
|
The current maintainer of this action is @eregon.
|
||||||
|
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.
|
||||||
|
|||||||
+41
-4
@@ -1,16 +1,53 @@
|
|||||||
name: 'Setup Ruby, JRuby and TruffleRuby'
|
name: 'Setup Ruby, JRuby and TruffleRuby'
|
||||||
description: 'Download a prebuilt Ruby and add it to $PATH in 5 seconds'
|
description: 'Download a prebuilt Ruby and add it to the PATH in 5 seconds'
|
||||||
author: 'Benoit Daloze'
|
author: 'Benoit Daloze'
|
||||||
branding:
|
branding:
|
||||||
color: red
|
color: red
|
||||||
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, .tool-versions or mise.toml if unset.'
|
||||||
default: '.ruby-version'
|
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 compatible RubyGems version.
|
||||||
|
Ruby head/master builds will not be updated.
|
||||||
|
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, mise.toml 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.
|
||||||
|
self-hosted:
|
||||||
|
description: |
|
||||||
|
Consider the runner as a self-hosted runner, which means not using prebuilt Ruby binaries which only work
|
||||||
|
on GitHub-hosted runners or self-hosted runners with a very similar image to the ones used by GitHub runners.
|
||||||
|
The default is to detect this automatically based on the OS, OS version and architecture.
|
||||||
|
windows-toolchain:
|
||||||
|
description: |
|
||||||
|
This input allows to override the default toolchain setup on Windows.
|
||||||
|
The default setting ('default') installs a toolchain based on the selected Ruby.
|
||||||
|
Specifically, it installs MSYS2 if not already there and installs mingw/ucrt/mswin build tools and packages.
|
||||||
|
It also sets environment variables using 'ridk' or 'vcvars64.bat' based on the selected Ruby.
|
||||||
|
At present, the only other setting than 'default' is 'none', which only adds Ruby to PATH.
|
||||||
|
No build tools or packages are installed, nor are any ENV setting changed to activate them.
|
||||||
|
|
||||||
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: 'node20'
|
||||||
main: 'dist/index.js'
|
main: 'dist/index.js'
|
||||||
|
|||||||
+264
@@ -0,0 +1,264 @@
|
|||||||
|
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(engine, 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])
|
||||||
|
|
||||||
|
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
|
||||||
|
}
|
||||||
|
|
||||||
|
let envOptions = {}
|
||||||
|
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.
|
||||||
|
console.log(`Setting BUNDLER_VERSION=${bundlerVersion} for "bundle config|lock" commands below to ensure Bundler 1 is used`)
|
||||||
|
envOptions = { env: { ...process.env, BUNDLER_VERSION: bundlerVersion } }
|
||||||
|
}
|
||||||
|
|
||||||
|
// 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], envOptions)
|
||||||
|
|
||||||
|
if (fs.existsSync(lockFile)) {
|
||||||
|
await exec.exec('bundle', ['config', '--local', 'deployment', 'true'], envOptions)
|
||||||
|
} 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'], envOptions)
|
||||||
|
}
|
||||||
|
|
||||||
|
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 {
|
||||||
|
// .slice() to workaround https://github.com/actions/toolkit/issues/1377
|
||||||
|
cachedKey = await cache.restoreCache(paths.slice(), 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 cwd = process.cwd()
|
||||||
|
const bundleWith = process.env['BUNDLE_WITH'] || ''
|
||||||
|
const bundleWithout = process.env['BUNDLE_WITHOUT'] || ''
|
||||||
|
const bundleOnly = process.env['BUNDLE_ONLY'] || ''
|
||||||
|
let key = `setup-ruby-bundler-cache-v6-${common.getOSNameVersionArch()}-${engine}-${version}-wd-${cwd}-with-${bundleWith}-without-${bundleWithout}-only-${bundleOnly}`
|
||||||
|
|
||||||
|
if (cacheVersion !== DEFAULT_CACHE_VERSION) {
|
||||||
|
key += `-v-${cacheVersion}`
|
||||||
|
}
|
||||||
|
|
||||||
|
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,398 @@
|
|||||||
|
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 tc = require('@actions/tool-cache')
|
||||||
|
const { performance } = require('perf_hooks')
|
||||||
|
const linuxOSInfo = require('linux-os-info')
|
||||||
|
|
||||||
|
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 const inputs = {
|
||||||
|
selfHosted: 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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Same as mesaure() but without the group, and no time shown on error
|
||||||
|
export async function time(name, block) {
|
||||||
|
console.log(`> ${name}`)
|
||||||
|
const start = performance.now()
|
||||||
|
const value = await block()
|
||||||
|
const end = performance.now()
|
||||||
|
|
||||||
|
const duration = (end - start) / 1000.0
|
||||||
|
console.log(`Took ${duration.toFixed(2).padStart(6)} seconds`)
|
||||||
|
return value
|
||||||
|
}
|
||||||
|
|
||||||
|
export function isHeadVersion(rubyVersion) {
|
||||||
|
return ['head', 'debug', 'mingw', 'mswin', 'ucrt', 'asan'].includes(rubyVersion)
|
||||||
|
}
|
||||||
|
|
||||||
|
export function isStableVersion(engine, rubyVersion) {
|
||||||
|
if (engine.startsWith('truffleruby')) {
|
||||||
|
return /^\d+(\.\d+)*(-preview\d+)?$/.test(rubyVersion)
|
||||||
|
} else {
|
||||||
|
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')
|
||||||
|
}
|
||||||
|
|
||||||
|
// macos is not listed explicitly, see below
|
||||||
|
const GitHubHostedPlatforms = [
|
||||||
|
'ubuntu-20.04-x64',
|
||||||
|
'ubuntu-22.04-x64',
|
||||||
|
'ubuntu-22.04-arm64',
|
||||||
|
'ubuntu-24.04-x64',
|
||||||
|
'ubuntu-24.04-arm64',
|
||||||
|
'windows-2019-x64',
|
||||||
|
'windows-2022-x64',
|
||||||
|
'windows-2025-x64',
|
||||||
|
]
|
||||||
|
|
||||||
|
// Precisely: whether we have builds for that platform and there are GitHub-hosted runners to test it
|
||||||
|
function isSupportedPlatform() {
|
||||||
|
const platform = getOSName()
|
||||||
|
switch (platform) {
|
||||||
|
case 'ubuntu':
|
||||||
|
return GitHubHostedPlatforms.includes(getOSNameVersionArch())
|
||||||
|
case 'macos':
|
||||||
|
// See https://github.com/ruby/ruby-builder/blob/master/README.md#naming
|
||||||
|
// 13 on arm64 because of old macos-arm-oss runners
|
||||||
|
return (os.arch() === 'x64' && parseInt(getOSVersion()) >= 13) ||
|
||||||
|
(os.arch() === 'arm64' && parseInt(getOSVersion()) >= 13)
|
||||||
|
case 'windows':
|
||||||
|
return GitHubHostedPlatforms.includes(getOSNameVersionArch())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Actually a self-hosted runner for which the OS and OS version does not correspond to a GitHub-hosted runner image,
|
||||||
|
export function isSelfHostedRunner() {
|
||||||
|
if (inputs.selfHosted === undefined) {
|
||||||
|
throw new Error('inputs.selfHosted should have been already set')
|
||||||
|
}
|
||||||
|
|
||||||
|
return inputs.selfHosted === 'true' || !isSupportedPlatform()
|
||||||
|
}
|
||||||
|
|
||||||
|
export function selfHostedRunnerReason() {
|
||||||
|
if (inputs.selfHosted === 'true') {
|
||||||
|
return 'the self-hosted input was set'
|
||||||
|
} else if (!isSupportedPlatform()) {
|
||||||
|
return 'the platform does not match a GitHub-hosted runner image (or that image is deprecated and no longer supported)'
|
||||||
|
} else {
|
||||||
|
return 'unknown reason'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let osName = undefined
|
||||||
|
let osVersion = undefined
|
||||||
|
|
||||||
|
export function getOSName() {
|
||||||
|
if (osName !== undefined) {
|
||||||
|
return osName
|
||||||
|
}
|
||||||
|
|
||||||
|
const platform = os.platform()
|
||||||
|
if (platform === 'linux') {
|
||||||
|
const info = linuxOSInfo({mode: 'sync'})
|
||||||
|
osName = info.id
|
||||||
|
} else if (platform === 'darwin') {
|
||||||
|
osName = 'macos'
|
||||||
|
} else if (platform === 'win32') {
|
||||||
|
osName = 'windows'
|
||||||
|
} else {
|
||||||
|
throw new Error(`Unknown platform ${platform}`)
|
||||||
|
}
|
||||||
|
|
||||||
|
return osName
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getOSVersion() {
|
||||||
|
if (osVersion !== undefined) {
|
||||||
|
return osVersion
|
||||||
|
}
|
||||||
|
|
||||||
|
const platform = os.platform()
|
||||||
|
if (platform === 'linux') {
|
||||||
|
const info = linuxOSInfo({mode: 'sync'})
|
||||||
|
osVersion = info.version_id
|
||||||
|
} else if (platform === 'darwin') {
|
||||||
|
// See https://github.com/sindresorhus/macos-release/blob/main/index.js
|
||||||
|
const darwinVersion = parseInt(os.release().match(/^\d+/)[0])
|
||||||
|
osVersion = `${darwinVersion - 9}`
|
||||||
|
} else if (platform === 'win32') {
|
||||||
|
osVersion = findWindowsVersion()
|
||||||
|
} else {
|
||||||
|
throw new Error(`Unknown platform ${platform}`)
|
||||||
|
}
|
||||||
|
|
||||||
|
return osVersion
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getOSNameVersion() {
|
||||||
|
return `${getOSName()}-${getOSVersion()}`
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getOSNameVersionArch() {
|
||||||
|
return `${getOSName()}-${getOSVersion()}-${os.arch()}`
|
||||||
|
}
|
||||||
|
|
||||||
|
function findWindowsVersion() {
|
||||||
|
const version = os.version()
|
||||||
|
const match = version.match(/^Windows Server (\d+) Datacenter/)
|
||||||
|
if (match) {
|
||||||
|
return match[1]
|
||||||
|
} else {
|
||||||
|
throw new Error('Could not find Windows version')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export function shouldUseToolCache(engine, version) {
|
||||||
|
return (engine === 'ruby' && !isHeadVersion(version)) || isSelfHostedRunner()
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getToolCachePath() {
|
||||||
|
if (isSelfHostedRunner()) {
|
||||||
|
return getRunnerToolCache()
|
||||||
|
} else {
|
||||||
|
// Rubies prebuilt by this action embed this path rather than using $RUNNER_TOOL_CACHE
|
||||||
|
// so use that path if not isSelfHostedRunner()
|
||||||
|
return getDefaultToolCachePath()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getRunnerToolCache() {
|
||||||
|
const runnerToolCache = process.env['RUNNER_TOOL_CACHE']
|
||||||
|
if (!runnerToolCache) {
|
||||||
|
throw new Error('$RUNNER_TOOL_CACHE must be set')
|
||||||
|
}
|
||||||
|
return runnerToolCache
|
||||||
|
}
|
||||||
|
|
||||||
|
// Rubies prebuilt by this action embed this path rather than using $RUNNER_TOOL_CACHE
|
||||||
|
function getDefaultToolCachePath() {
|
||||||
|
const platform = getOSName()
|
||||||
|
switch (platform) {
|
||||||
|
case 'ubuntu':
|
||||||
|
return '/opt/hostedtoolcache'
|
||||||
|
case 'macos':
|
||||||
|
return '/Users/runner/hostedtoolcache'
|
||||||
|
case 'windows':
|
||||||
|
return 'C:\\hostedtoolcache\\windows'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// tc.find() but using RUNNER_TOOL_CACHE=getToolCachePath()
|
||||||
|
export function toolCacheFind(engine, version) {
|
||||||
|
const originalToolCache = getToolCachePath()
|
||||||
|
process.env['RUNNER_TOOL_CACHE'] = getToolCachePath()
|
||||||
|
try {
|
||||||
|
return tc.find(engineToToolCacheName(engine), version)
|
||||||
|
} finally {
|
||||||
|
process.env['RUNNER_TOOL_CACHE'] = originalToolCache
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function engineToToolCacheName(engine) {
|
||||||
|
return {
|
||||||
|
ruby: 'Ruby',
|
||||||
|
jruby: 'JRuby',
|
||||||
|
truffleruby: 'TruffleRuby',
|
||||||
|
"truffleruby+graalvm": 'TruffleRubyGraalVM'
|
||||||
|
}[engine]
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getToolCacheRubyPrefix(platform, engine, version) {
|
||||||
|
const toolCache = getToolCachePath()
|
||||||
|
return path.join(toolCache, engineToToolCacheName(engine), version, os.arch())
|
||||||
|
}
|
||||||
|
|
||||||
|
export function toolCacheCompleteFile(toolCacheRubyPrefix) {
|
||||||
|
return `${toolCacheRubyPrefix}.complete`
|
||||||
|
}
|
||||||
|
|
||||||
|
export function createToolCacheCompleteFile(toolCacheRubyPrefix) {
|
||||||
|
fs.writeFileSync(toolCacheCompleteFile(toolCacheRubyPrefix), '')
|
||||||
|
}
|
||||||
|
|
||||||
|
// 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
|
||||||
|
const windowsToolchain = core.getInput('windows-toolchain')
|
||||||
|
if (windows && windowsToolchain !== 'none') {
|
||||||
|
// 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
|
||||||
|
}
|
||||||
+72656
-6513
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"
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
require 'net/http'
|
||||||
|
require 'yaml'
|
||||||
|
require 'json'
|
||||||
|
|
||||||
|
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'
|
||||||
|
entries = YAML.load(Net::HTTP.get(URI(url)), symbolize_names: true)
|
||||||
|
|
||||||
|
versions = entries.select { |entry|
|
||||||
|
entry[:filetype] == 'rubyinstaller7z' and
|
||||||
|
entry[:name].include?('(x64)')
|
||||||
|
}.group_by { |entry|
|
||||||
|
entry[:name][/Ruby (\d+\.\d+\.\d+)/, 1]
|
||||||
|
}.map { |version, builds|
|
||||||
|
unless builds.sort_by { |build| build[:name] } == builds.reverse
|
||||||
|
raise "not sorted as expected for #{version}"
|
||||||
|
end
|
||||||
|
[version, builds.first]
|
||||||
|
}.sort_by { |version, entry|
|
||||||
|
Gem::Version.new(version)
|
||||||
|
}.select { |version, entry|
|
||||||
|
min_requirements.any? { |req| req.satisfied_by?(Gem::Version.new(version)) }
|
||||||
|
}.map { |version, entry|
|
||||||
|
[version, entry[:href]]
|
||||||
|
}.to_h
|
||||||
|
|
||||||
|
versions['head'] = 'https://github.com/oneclick/rubyinstaller2/releases/download/rubyinstaller-head/rubyinstaller-head-x64.7z'
|
||||||
|
versions['mingw'] = 'https://github.com/MSP-Greg/ruby-loco/releases/download/ruby-master/ruby-mingw.7z'
|
||||||
|
versions['mswin'] = 'https://github.com/MSP-Greg/ruby-loco/releases/download/ruby-master/ruby-mswin.7z'
|
||||||
|
versions['ucrt'] = 'https://github.com/MSP-Greg/ruby-loco/releases/download/ruby-master/ruby-ucrt.7z'
|
||||||
|
|
||||||
|
File.binwrite 'windows-versions.json', "#{JSON.pretty_generate(versions)}\n"
|
||||||
@@ -1,116 +1,232 @@
|
|||||||
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 io = require('@actions/io')
|
const exec = require('@actions/exec')
|
||||||
const tc = require('@actions/tool-cache')
|
const common = require('./common')
|
||||||
const axios = require('axios')
|
const rubygems = require('./rubygems')
|
||||||
const windows = require('./windows')
|
const bundler = require('./bundler')
|
||||||
|
|
||||||
const releasesURL = 'https://github.com/eregon/ruby-install-builder/releases'
|
const windows = common.windows
|
||||||
const metadataURL = 'https://raw.githubusercontent.com/eregon/ruby-install-builder/metadata'
|
|
||||||
|
|
||||||
async function run() {
|
const inputDefaults = {
|
||||||
|
'ruby-version': 'default',
|
||||||
|
'rubygems': 'default',
|
||||||
|
'bundler': 'Gemfile.lock',
|
||||||
|
'bundler-cache': 'false',
|
||||||
|
'working-directory': '.',
|
||||||
|
'cache-version': bundler.DEFAULT_CACHE_VERSION,
|
||||||
|
'self-hosted': 'false',
|
||||||
|
'windows-toolchain': 'default',
|
||||||
|
}
|
||||||
|
|
||||||
|
// entry point when this action is run on its own
|
||||||
|
export async function run() {
|
||||||
try {
|
try {
|
||||||
const platform = getVirtualEnvironmentName()
|
await setupRuby()
|
||||||
const ruby = await getRubyEngineAndVersion(core.getInput('ruby-version'))
|
|
||||||
|
|
||||||
let rubyPrefix
|
|
||||||
if (platform === 'windows-latest') {
|
|
||||||
rubyPrefix = await windows.downloadExtractAndSetPATH(ruby)
|
|
||||||
} else {
|
|
||||||
if (ruby.startsWith('jruby')) {
|
|
||||||
// Workaround for https://github.com/actions/virtual-environments/issues/242
|
|
||||||
core.exportVariable('CLASSPATH', '')
|
|
||||||
}
|
|
||||||
rubyPrefix = await downloadAndExtract(platform, ruby)
|
|
||||||
core.addPath(`${rubyPrefix}/bin`)
|
|
||||||
}
|
|
||||||
core.setOutput('ruby-prefix', rubyPrefix)
|
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
core.setFailed(error.message)
|
if (/\bprocess\b.+\bfailed\b/.test(error.message)) {
|
||||||
|
core.setFailed(error.message)
|
||||||
|
} else {
|
||||||
|
core.setFailed(error.stack)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
// Explicit process.exit() to not wait hanging promises,
|
||||||
|
// see https://github.com/ruby/setup-ruby/issues/543
|
||||||
|
process.exit()
|
||||||
}
|
}
|
||||||
|
|
||||||
async function downloadAndExtract(platform, ruby) {
|
// entry point when this action is run from other actions
|
||||||
const rubiesDir = `${process.env.HOME}/.rubies`
|
export async function setupRuby(options = {}) {
|
||||||
await io.mkdirP(rubiesDir)
|
const inputs = { ...options }
|
||||||
|
for (const key in inputDefaults) {
|
||||||
|
if (!Object.prototype.hasOwnProperty.call(inputs, key)) {
|
||||||
|
inputs[key] = core.getInput(key) || inputDefaults[key]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
common.inputs.selfHosted = inputs['self-hosted']
|
||||||
|
|
||||||
const tag = await getLatestReleaseTag()
|
process.chdir(inputs['working-directory'])
|
||||||
const url = `${releasesURL}/download/${tag}/${ruby}-${platform}.tar.gz`
|
|
||||||
console.log(url)
|
|
||||||
|
|
||||||
const downloadPath = await tc.downloadTool(url)
|
const platform = common.getOSNameVersion()
|
||||||
await tc.extractTar(downloadPath, rubiesDir)
|
const [engine, parsedVersion] = parseRubyEngineAndVersion(inputs['ruby-version'])
|
||||||
|
|
||||||
return `${rubiesDir}/${ruby}`
|
let installer
|
||||||
|
if (platform.startsWith('windows-') && engine === 'ruby' && !common.isSelfHostedRunner()) {
|
||||||
|
installer = require('./windows')
|
||||||
|
} else {
|
||||||
|
installer = require('./ruby-builder')
|
||||||
|
}
|
||||||
|
|
||||||
|
let version
|
||||||
|
if (common.isSelfHostedRunner()) {
|
||||||
|
// The list of available Rubies in the hostedtoolcache is unrelated to getAvailableVersions()
|
||||||
|
version = parsedVersion
|
||||||
|
} else {
|
||||||
|
const engineVersions = installer.getAvailableVersions(platform, engine)
|
||||||
|
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, platform, engine, version))
|
||||||
|
}
|
||||||
|
|
||||||
|
// 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.time('bundle install', async () =>
|
||||||
|
bundler.bundleInstall(gemfile, lockFile, platform, engine, version, bundlerVersion, inputs['cache-version']))
|
||||||
|
}
|
||||||
|
|
||||||
|
core.setOutput('ruby-prefix', rubyPrefix)
|
||||||
}
|
}
|
||||||
|
|
||||||
async function getLatestReleaseTag() {
|
function parseRubyEngineAndVersion(rubyVersion) {
|
||||||
const response = await axios.get(`${metadataURL}/latest_release.tag`)
|
if (rubyVersion === 'default') {
|
||||||
return response.data.trim()
|
if (fs.existsSync('.ruby-version')) {
|
||||||
}
|
rubyVersion = '.ruby-version'
|
||||||
|
} else if (fs.existsSync('.tool-versions')) {
|
||||||
|
rubyVersion = '.tool-versions'
|
||||||
|
} else if (fs.existsSync('mise.toml')) {
|
||||||
|
rubyVersion = 'mise.toml'
|
||||||
|
} else {
|
||||||
|
throw new Error('input ruby-version needs to be specified if no .ruby-version or .tool-versions file exists')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
async function getRubyEngineAndVersion(rubyVersion) {
|
|
||||||
if (rubyVersion === '.ruby-version') { // Read from .ruby-version
|
if (rubyVersion === '.ruby-version') { // Read from .ruby-version
|
||||||
rubyVersion = fs.readFileSync('.ruby-version', 'utf8').trim()
|
rubyVersion = fs.readFileSync('.ruby-version', 'utf8').trim()
|
||||||
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
|
||||||
|
const toolVersions = fs.readFileSync('.tool-versions', 'utf8').trim()
|
||||||
|
const rubyLine = toolVersions.split(/\r?\n/).filter(e => /^ruby\s/.test(e))[0]
|
||||||
|
rubyVersion = rubyLine.match(/^ruby\s+(.+)$/)[1]
|
||||||
|
console.log(`Using ${rubyVersion} as input from file .tool-versions`)
|
||||||
|
} else if (rubyVersion === 'mise.toml') { // Read from mise.toml
|
||||||
|
const toolVersions = fs.readFileSync('mise.toml', 'utf8').trim()
|
||||||
|
const rubyLine = toolVersions.split(/\r?\n/).filter(e => /^ruby\s*=\s*/.test(e))[0]
|
||||||
|
rubyVersion = rubyLine.match(/^ruby\s*=\s*['"](.+)['"]$/)[1]
|
||||||
|
console.log(`Using ${rubyVersion} as input from file mise.toml`)
|
||||||
}
|
}
|
||||||
|
|
||||||
let engine, version
|
let engine, version
|
||||||
if (rubyVersion.match(/^\d+/)) { // 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, '-')
|
||||||
}
|
}
|
||||||
|
|
||||||
const response = await axios.get(`${metadataURL}/versions.json`)
|
return [engine, version]
|
||||||
const stableVersions = response.data
|
}
|
||||||
const engineVersions = stableVersions[engine]
|
|
||||||
|
function validateRubyEngineAndVersion(platform, engineVersions, engine, parsedVersion) {
|
||||||
if (!engineVersions) {
|
if (!engineVersions) {
|
||||||
throw new Error(`Unknown engine ${engine} (input: ${rubyVersion})`)
|
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.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(engine, 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}
|
throw new Error(`Unknown version ${parsedVersion} for ${engine} on ${platform}
|
||||||
input: ${rubyVersion}
|
Available versions for ${engine} on ${platform}: ${engineVersions.join(', ')}
|
||||||
available versions for ${engine}: ${engineVersions.join(', ')}
|
Make sure you use the latest version of the action with - uses: ruby/setup-ruby@v1`)
|
||||||
File an issue at https://github.com/eregon/ruby-install-builder/issues if would like support for a new version`)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return engine + '-' + version
|
// Well known version-platform combinations which do not work:
|
||||||
|
if (engine === 'ruby' && platform.startsWith('macos') && os.arch() === 'arm64' && common.floatVersion(version) < 2.6) {
|
||||||
|
throw new Error(`CRuby < 2.6 does not support macos-arm64.
|
||||||
|
Either use a newer Ruby version or use a macOS image running on amd64, e.g., macos-13.
|
||||||
|
Note that GitHub changed the meaning of macos-latest from macos-12 (amd64) to macos-14 (arm64):
|
||||||
|
https://github.blog/changelog/2024-04-01-macos-14-sonoma-is-generally-available-and-the-latest-macos-runner-image/
|
||||||
|
|
||||||
|
If you are using a matrix of Ruby versions, a good solution is to run only < 2.6 on amd64, like so:
|
||||||
|
matrix:
|
||||||
|
ruby: ['2.4', '2.5', '2.6', '2.7', '3.0', '3.1', '3.2', '3.3']
|
||||||
|
os: [ ubuntu-latest, macos-latest ]
|
||||||
|
# CRuby < 2.6 does not support macos-arm64, so test those on amd64 instead
|
||||||
|
exclude:
|
||||||
|
- { os: macos-latest, ruby: '2.4' }
|
||||||
|
- { os: macos-latest, ruby: '2.5' }
|
||||||
|
include:
|
||||||
|
- { os: macos-13, ruby: '2.4' }
|
||||||
|
- { os: macos-13, ruby: '2.5' }
|
||||||
|
|
||||||
|
But of course you should consider dropping support for these long-EOL Rubies, which cannot even be built on recent macOS machines.`)
|
||||||
|
} else if (engine === 'truffleruby' && platform.startsWith('windows')) {
|
||||||
|
throw new Error('TruffleRuby does not currently support Windows.')
|
||||||
|
}
|
||||||
|
|
||||||
|
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,62 @@
|
|||||||
|
versions = ARGV.fetch(0).split(',').map(&:strip)
|
||||||
|
p versions
|
||||||
|
|
||||||
|
versions.each do |engine_version|
|
||||||
|
puts engine_version
|
||||||
|
engine, version = engine_version.split('-', 2)
|
||||||
|
p [engine, version]
|
||||||
|
|
||||||
|
if engine == 'windows'
|
||||||
|
require_relative 'generate-windows-versions'
|
||||||
|
exit
|
||||||
|
end
|
||||||
|
|
||||||
|
match = case engine
|
||||||
|
when 'ruby', 'jruby'
|
||||||
|
/^\d+\.\d+\./
|
||||||
|
when 'truffleruby', 'truffleruby+graalvm'
|
||||||
|
/^\d+\./
|
||||||
|
end
|
||||||
|
|
||||||
|
raise engine_version unless version[match]
|
||||||
|
|
||||||
|
# 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
|
||||||
+13
-12
@@ -1,15 +1,14 @@
|
|||||||
{
|
{
|
||||||
"name": "use-ruby-action",
|
"name": "setup-ruby",
|
||||||
"version": "0.1.0",
|
"version": "0.1.0",
|
||||||
"description": "Download a prebuilt ruby and add it to $PATH",
|
"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": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "git+https://github.com/eregon/use-ruby-action.git"
|
"url": "git+https://github.com/ruby/setup-ruby.git"
|
||||||
},
|
},
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"GitHub",
|
"GitHub",
|
||||||
@@ -19,17 +18,19 @@
|
|||||||
"author": "Benoit Daloze",
|
"author": "Benoit Daloze",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"bugs": {
|
"bugs": {
|
||||||
"url": "https://github.com/eregon/use-ruby-action/issues"
|
"url": "https://github.com/ruby/setup-ruby/issues"
|
||||||
},
|
},
|
||||||
"homepage": "https://github.com/eregon/use-ruby-action",
|
"homepage": "https://github.com/ruby/setup-ruby",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@actions/core": "^1.1.1",
|
"@actions/cache": "^4.0.0",
|
||||||
"@actions/io": "^1.0.1",
|
"@actions/core": "^1.11.1",
|
||||||
"@actions/tool-cache": "^1.1.2",
|
"@actions/exec": "^1.1.1",
|
||||||
"axios": "^0.19.0"
|
"@actions/io": "^1.1.2",
|
||||||
|
"@actions/tool-cache": "^2",
|
||||||
|
"linux-os-info": "^2.0.0",
|
||||||
|
"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
|
||||||
+17
@@ -0,0 +1,17 @@
|
|||||||
|
require 'json'
|
||||||
|
|
||||||
|
def run(command_line)
|
||||||
|
puts "$ #{command_line}"
|
||||||
|
output = `#{command_line}`
|
||||||
|
puts output
|
||||||
|
raise $?.inspect unless $?.success?
|
||||||
|
output
|
||||||
|
end
|
||||||
|
|
||||||
|
latest_release_tag = run 'gh release view --json tagName'
|
||||||
|
latest_release_tag = JSON.load(latest_release_tag).fetch('tagName')
|
||||||
|
|
||||||
|
raise latest_release_tag unless latest_release_tag =~ /\Av(\d+).(\d+).(\d+)\z/
|
||||||
|
tag = "v#{$1}.#{Integer($2)+1}.0"
|
||||||
|
|
||||||
|
run "gh release create --generate-notes --latest #{tag}"
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
{
|
||||||
|
"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", "2.7.8",
|
||||||
|
"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.0.6", "3.0.7",
|
||||||
|
"3.1.0-preview1", "3.1.0", "3.1.1", "3.1.2", "3.1.3", "3.1.4", "3.1.5", "3.1.6",
|
||||||
|
"3.2.0-preview1", "3.2.0-preview2", "3.2.0-preview3", "3.2.0-rc1", "3.2.0", "3.2.1", "3.2.2", "3.2.3", "3.2.4", "3.2.5", "3.2.6", "3.2.7",
|
||||||
|
"3.3.0-preview1", "3.3.0-preview2", "3.3.0-preview3", "3.3.0-rc1", "3.3.0", "3.3.1", "3.3.2", "3.3.3", "3.3.4", "3.3.5", "3.3.6", "3.3.7",
|
||||||
|
"3.4.0-preview1", "3.4.0-preview2", "3.4.0-rc1", "3.4.0", "3.4.1",
|
||||||
|
"head", "debug", "asan"
|
||||||
|
],
|
||||||
|
"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.3.10.0", "9.3.11.0", "9.3.13.0", "9.3.14.0", "9.3.15.0",
|
||||||
|
"9.4.0.0", "9.4.1.0", "9.4.2.0", "9.4.3.0", "9.4.4.0", "9.4.5.0", "9.4.6.0", "9.4.7.0", "9.4.8.0", "9.4.9.0", "9.4.10.0", "9.4.11.0", "9.4.12.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", "22.3.1",
|
||||||
|
"23.0.0-preview1", "23.0.0", "23.1.0", "23.1.1", "23.1.2",
|
||||||
|
"24.0.0", "24.0.1", "24.0.2", "24.1.0", "24.1.1", "24.1.2",
|
||||||
|
"head"
|
||||||
|
],
|
||||||
|
"truffleruby+graalvm": [
|
||||||
|
"21.2.0", "21.3.0",
|
||||||
|
"22.0.0.2", "22.1.0", "22.2.0", "22.3.0", "22.3.1",
|
||||||
|
"23.0.0-preview1", "23.0.0", "23.1.0", "23.1.1", "23.1.2",
|
||||||
|
"24.0.0", "24.0.1", "24.0.2", "24.1.0", "24.1.1", "24.1.2",
|
||||||
|
"head"
|
||||||
|
]
|
||||||
|
}
|
||||||
+128
@@ -0,0 +1,128 @@
|
|||||||
|
const os = require('os')
|
||||||
|
const fs = require('fs')
|
||||||
|
const path = require('path')
|
||||||
|
const core = require('@actions/core')
|
||||||
|
const exec = require('@actions/exec')
|
||||||
|
const io = require('@actions/io')
|
||||||
|
const tc = require('@actions/tool-cache')
|
||||||
|
const common = require('./common')
|
||||||
|
const rubyBuilderVersions = require('./ruby-builder-versions')
|
||||||
|
|
||||||
|
const builderReleaseTag = 'toolcache'
|
||||||
|
const releasesURL = 'https://github.com/ruby/ruby-builder/releases'
|
||||||
|
|
||||||
|
const windows = common.windows
|
||||||
|
|
||||||
|
export function getAvailableVersions(platform, engine) {
|
||||||
|
return rubyBuilderVersions[engine]
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function install(platform, engine, version) {
|
||||||
|
let rubyPrefix, inToolCache
|
||||||
|
if (common.shouldUseToolCache(engine, version)) {
|
||||||
|
inToolCache = common.toolCacheFind(engine, version)
|
||||||
|
if (inToolCache) {
|
||||||
|
rubyPrefix = inToolCache
|
||||||
|
} else {
|
||||||
|
const toolCacheRubyPrefix = common.getToolCacheRubyPrefix(platform, engine, version)
|
||||||
|
if (common.isSelfHostedRunner()) {
|
||||||
|
const rubyBuildDefinition = engine === 'ruby' ? version : `${engine}-${version}`
|
||||||
|
core.error(
|
||||||
|
`The current runner (${common.getOSNameVersionArch()}) was detected as self-hosted because ${common.selfHostedRunnerReason()}.\n` +
|
||||||
|
`In such a case, you should install Ruby in the $RUNNER_TOOL_CACHE yourself, for example using https://github.com/rbenv/ruby-build\n` +
|
||||||
|
`You can take inspiration from this workflow for more details: https://github.com/ruby/ruby-builder/blob/master/.github/workflows/build.yml\n` +
|
||||||
|
`$ ruby-build ${rubyBuildDefinition} ${toolCacheRubyPrefix}\n` +
|
||||||
|
`Once that completes successfully, mark it as complete with:\n` +
|
||||||
|
`$ touch ${common.toolCacheCompleteFile(toolCacheRubyPrefix)}\n` +
|
||||||
|
`It is your responsibility to ensure installing Ruby like that is not done in parallel.\n`)
|
||||||
|
process.exit(1)
|
||||||
|
} else {
|
||||||
|
rubyPrefix = toolCacheRubyPrefix
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (windows) {
|
||||||
|
rubyPrefix = path.join(`${common.drive}:`, `${engine}-${version}`)
|
||||||
|
} else {
|
||||||
|
rubyPrefix = path.join(os.homedir(), '.rubies', `${engine}-${version}`)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set the PATH now, so the MSYS2 'tar' is in Path on Windows
|
||||||
|
common.setupPath([path.join(rubyPrefix, 'bin')])
|
||||||
|
|
||||||
|
if (!inToolCache) {
|
||||||
|
await io.mkdirP(rubyPrefix)
|
||||||
|
await downloadAndExtract(platform, engine, version, rubyPrefix)
|
||||||
|
}
|
||||||
|
|
||||||
|
return rubyPrefix
|
||||||
|
}
|
||||||
|
|
||||||
|
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)
|
||||||
|
try {
|
||||||
|
return await tc.downloadTool(url)
|
||||||
|
} catch (error) {
|
||||||
|
if (error.message.includes('404')) {
|
||||||
|
throw new Error(`Unavailable version ${version} for ${engine} on ${platform}
|
||||||
|
You can request it at https://github.com/ruby/setup-ruby/issues
|
||||||
|
Cause: ${error.message}`)
|
||||||
|
} else {
|
||||||
|
throw error
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
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 = null
|
||||||
|
if (platform.startsWith('windows-') && os.arch() === 'x64') {
|
||||||
|
builderPlatform = 'windows-latest'
|
||||||
|
} else if (platform.startsWith('macos-')) {
|
||||||
|
if (os.arch() === 'x64') {
|
||||||
|
builderPlatform = 'macos-latest'
|
||||||
|
} else if (os.arch() === 'arm64') {
|
||||||
|
builderPlatform = 'macos-13-arm64'
|
||||||
|
}
|
||||||
|
} else if (platform.startsWith('ubuntu-')) {
|
||||||
|
if (os.arch() === 'x64') {
|
||||||
|
builderPlatform = platform
|
||||||
|
} else if (os.arch() === 'arm64') {
|
||||||
|
builderPlatform = `${platform}-arm64`
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (builderPlatform === null) {
|
||||||
|
throw new Error(`Unknown download URL for platform ${platform}`)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (common.isHeadVersion(version)) {
|
||||||
|
return getLatestHeadBuildURL(builderPlatform, engine, version)
|
||||||
|
} else {
|
||||||
|
return `${releasesURL}/download/${builderReleaseTag}/${engine}-${version}-${builderPlatform}.tar.gz`
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function getLatestHeadBuildURL(platform, engine, version) {
|
||||||
|
var repo = `${engine}-dev-builder`
|
||||||
|
if (engine === 'truffleruby+graalvm') {
|
||||||
|
repo = 'truffleruby-dev-builder'
|
||||||
|
}
|
||||||
|
return `https://github.com/ruby/${repo}/releases/latest/download/${engine}-${version}-${platform}.tar.gz`
|
||||||
|
}
|
||||||
+60
@@ -0,0 +1,60 @@
|
|||||||
|
const common = require('./common')
|
||||||
|
const path = require('path')
|
||||||
|
const exec = require('@actions/exec')
|
||||||
|
const semver = require('semver')
|
||||||
|
|
||||||
|
export async function rubygemsUpdate(rubygemsVersionInput, rubyPrefix, platform, engine, rubyVersion) {
|
||||||
|
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 rubygemsLatest(gem, platform, engine, rubyVersion)
|
||||||
|
} 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
|
||||||
|
}
|
||||||
|
|
||||||
|
// Older RubyGems versions do not account for 'required_ruby_version' when
|
||||||
|
// running 'gem update --system', so we have to force a compatible version of
|
||||||
|
// rubygems-update. See https://github.com/ruby/setup-ruby/pull/551 and
|
||||||
|
// https://github.com/rubygems/rubygems/issues/7329
|
||||||
|
async function rubygemsLatest(gem, platform, engine, rubyVersion) {
|
||||||
|
if (engine === 'ruby') {
|
||||||
|
const floatVersion = common.floatVersion(rubyVersion)
|
||||||
|
if (common.isHeadVersion(rubyVersion)) {
|
||||||
|
console.log('Ruby master builds use included RubyGems')
|
||||||
|
} else if (floatVersion >= 3.1) {
|
||||||
|
await exec.exec(gem, ['update', '--system'])
|
||||||
|
} else if (floatVersion >= 3.0) {
|
||||||
|
await exec.exec(gem, ['update', '--system', '3.5.23'])
|
||||||
|
} else if (floatVersion >= 2.6) {
|
||||||
|
await exec.exec(gem, ['update', '--system', '3.4.22'])
|
||||||
|
} else if (floatVersion >= 2.3) {
|
||||||
|
await exec.exec(gem, ['update', '--system', '3.3.27'])
|
||||||
|
} else if (floatVersion >= 1.9) {
|
||||||
|
await exec.exec(`${gem} install rubygems-update -v 2.7.11 --no-document`)
|
||||||
|
await exec.exec('update_rubygems')
|
||||||
|
} else {
|
||||||
|
console.log(`Cannot update RubyGems for Ruby version ${rubyVersion}`)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// non MRI Rubies (TruffleRuby and JRuby)
|
||||||
|
await exec.exec(gem, ['update', '--system'])
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
require 'rbconfig'
|
||||||
|
require 'stringio'
|
||||||
|
|
||||||
|
puts "CPPFLAGS: #{RbConfig::CONFIG["CPPFLAGS"]}"
|
||||||
|
|
||||||
|
$stderr = StringIO.new
|
||||||
|
begin
|
||||||
|
system RbConfig.ruby, "-e", "p :OK"
|
||||||
|
out = $stderr.string
|
||||||
|
ensure
|
||||||
|
$stderr = STDERR
|
||||||
|
end
|
||||||
|
abort out unless out.empty?
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
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/] }
|
||||||
|
|
||||||
|
by_minor.each_pair do |minor, versions|
|
||||||
|
puts versions.map { |v| "ruby-#{v}" }.join(', ') if minor
|
||||||
|
end
|
||||||
|
|
||||||
|
puts
|
||||||
|
puts (versions[:truffleruby] - %w[head]).map { |v| "truffleruby-#{v}" }.join(', ')
|
||||||
|
|
||||||
|
puts
|
||||||
|
puts (versions[:"truffleruby+graalvm"] - %w[head]).map { |v| "truffleruby+graalvm-#{v}" }.join(', ')
|
||||||
|
|
||||||
|
puts
|
||||||
|
puts (versions[:jruby] - %w[head]).map { |v| "jruby-#{v}" }.join(', ')
|
||||||
|
|
||||||
|
(versions[:jruby] - %w[head]).each do |v|
|
||||||
|
puts "- { os: windows-latest, jruby-version: #{v}, ruby: jruby-#{v} }"
|
||||||
|
end
|
||||||
@@ -0,0 +1,81 @@
|
|||||||
|
{
|
||||||
|
"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",
|
||||||
|
"2.7.8": "https://github.com/oneclick/rubyinstaller2/releases/download/RubyInstaller-2.7.8-1/rubyinstaller-2.7.8-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.0.6": "https://github.com/oneclick/rubyinstaller2/releases/download/RubyInstaller-3.0.6-1/rubyinstaller-3.0.6-1-x64.7z",
|
||||||
|
"3.0.7": "https://github.com/oneclick/rubyinstaller2/releases/download/RubyInstaller-3.0.7-1/rubyinstaller-3.0.7-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.1.4": "https://github.com/oneclick/rubyinstaller2/releases/download/RubyInstaller-3.1.4-1/rubyinstaller-3.1.4-1-x64.7z",
|
||||||
|
"3.1.5": "https://github.com/oneclick/rubyinstaller2/releases/download/RubyInstaller-3.1.5-1/rubyinstaller-3.1.5-1-x64.7z",
|
||||||
|
"3.1.6": "https://github.com/oneclick/rubyinstaller2/releases/download/RubyInstaller-3.1.6-1/rubyinstaller-3.1.6-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",
|
||||||
|
"3.2.1": "https://github.com/oneclick/rubyinstaller2/releases/download/RubyInstaller-3.2.1-1/rubyinstaller-3.2.1-1-x64.7z",
|
||||||
|
"3.2.2": "https://github.com/oneclick/rubyinstaller2/releases/download/RubyInstaller-3.2.2-1/rubyinstaller-3.2.2-1-x64.7z",
|
||||||
|
"3.2.3": "https://github.com/oneclick/rubyinstaller2/releases/download/RubyInstaller-3.2.3-1/rubyinstaller-3.2.3-1-x64.7z",
|
||||||
|
"3.2.4": "https://github.com/oneclick/rubyinstaller2/releases/download/RubyInstaller-3.2.4-1/rubyinstaller-3.2.4-1-x64.7z",
|
||||||
|
"3.2.5": "https://github.com/oneclick/rubyinstaller2/releases/download/RubyInstaller-3.2.5-1/rubyinstaller-3.2.5-1-x64.7z",
|
||||||
|
"3.2.6": "https://github.com/oneclick/rubyinstaller2/releases/download/RubyInstaller-3.2.6-1/rubyinstaller-3.2.6-1-x64.7z",
|
||||||
|
"3.2.7": "https://github.com/oneclick/rubyinstaller2/releases/download/RubyInstaller-3.2.7-1/rubyinstaller-3.2.7-1-x64.7z",
|
||||||
|
"3.3.0": "https://github.com/oneclick/rubyinstaller2/releases/download/RubyInstaller-3.3.0-1/rubyinstaller-3.3.0-1-x64.7z",
|
||||||
|
"3.3.1": "https://github.com/oneclick/rubyinstaller2/releases/download/RubyInstaller-3.3.1-1/rubyinstaller-3.3.1-1-x64.7z",
|
||||||
|
"3.3.2": "https://github.com/oneclick/rubyinstaller2/releases/download/RubyInstaller-3.3.2-1/rubyinstaller-3.3.2-1-x64.7z",
|
||||||
|
"3.3.3": "https://github.com/oneclick/rubyinstaller2/releases/download/RubyInstaller-3.3.3-1/rubyinstaller-3.3.3-1-x64.7z",
|
||||||
|
"3.3.4": "https://github.com/oneclick/rubyinstaller2/releases/download/RubyInstaller-3.3.4-1/rubyinstaller-3.3.4-1-x64.7z",
|
||||||
|
"3.3.5": "https://github.com/oneclick/rubyinstaller2/releases/download/RubyInstaller-3.3.5-1/rubyinstaller-3.3.5-1-x64.7z",
|
||||||
|
"3.3.6": "https://github.com/oneclick/rubyinstaller2/releases/download/RubyInstaller-3.3.6-2/rubyinstaller-3.3.6-2-x64.7z",
|
||||||
|
"3.3.7": "https://github.com/oneclick/rubyinstaller2/releases/download/RubyInstaller-3.3.7-1/rubyinstaller-3.3.7-1-x64.7z",
|
||||||
|
"3.4.1": "https://github.com/oneclick/rubyinstaller2/releases/download/RubyInstaller-3.4.1-2/rubyinstaller-3.4.1-2-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"
|
||||||
|
}
|
||||||
+263
-41
@@ -1,68 +1,290 @@
|
|||||||
// 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 common = require('./common')
|
||||||
|
const rubyInstallerVersions = require('./windows-versions.json')
|
||||||
|
|
||||||
const releasesURL = 'https://github.com/oneclick/rubyinstaller2/releases'
|
const drive = common.drive
|
||||||
|
|
||||||
export async function downloadExtractAndSetPATH(ruby) {
|
const msys2GCCReleaseURI = 'https://github.com/ruby/setup-msys2-gcc/releases/download'
|
||||||
const version = ruby.split('-', 2)[1]
|
|
||||||
if (!ruby.startsWith('ruby-') || version.startsWith('2.3')) {
|
const msys2BasePath = process.env['GHCUP_MSYS2']
|
||||||
throw new Error(`Only ruby >= 2.4 is supported on Windows currently (input: ${ruby})`)
|
const vcPkgBasePath = process.env['VCPKG_INSTALLATION_ROOT']
|
||||||
|
|
||||||
|
// needed for Ruby 2.0-2.3, cert file used by Git for Windows
|
||||||
|
let certFile = 'C:\\Program Files\\Git\\mingw64\\etc\\ssl\\cert.pem'
|
||||||
|
if (!fs.existsSync(certFile)) {
|
||||||
|
certFile = 'C:\\Program Files\\Git\\mingw64\\ssl\\cert.pem'
|
||||||
|
if (!fs.existsSync(certFile)) {
|
||||||
|
throw new Error("Cannot find Git's cert file")
|
||||||
}
|
}
|
||||||
const tag = `RubyInstaller-${version}-1`
|
}
|
||||||
const base = `${tag.toLowerCase()}-x64`
|
|
||||||
|
|
||||||
const url = `${releasesURL}/download/${tag}/${base}.7z`
|
// location & path for old RubyInstaller DevKit (MSYS1), used with Ruby 2.0-2.3
|
||||||
console.log(url)
|
const msys1 = `${drive}:\\DevKit64`
|
||||||
|
const msysPathEntries = [`${msys1}\\mingw\\x86_64-w64-mingw32\\bin`, `${msys1}\\mingw\\bin`, `${msys1}\\bin`]
|
||||||
|
|
||||||
const downloadPath = await tc.downloadTool(url)
|
export function getAvailableVersions(platform, engine) {
|
||||||
await exec.exec(`7z x ${downloadPath} -xr!${base}\\share\\doc -oC:\\`)
|
if (engine === 'ruby') {
|
||||||
const rubyPrefix = `C:\\${base}`
|
return Object.keys(rubyInstallerVersions)
|
||||||
|
} else {
|
||||||
|
return undefined
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const msys2 = await linkMSYS2()
|
export async function install(platform, engine, version) {
|
||||||
const newPath = setupPath(msys2, rubyPrefix)
|
const url = rubyInstallerVersions[version]
|
||||||
core.exportVariable('PATH', newPath)
|
|
||||||
|
|
||||||
if (!fs.existsSync(`${rubyPrefix}\\bin\\bundle.cmd`)) {
|
// The windows-2016 and windows-2019 images have MSYS2 build tools (C:/msys64/usr)
|
||||||
await exec.exec(`${rubyPrefix}\\bin\\gem install bundler -v "~> 1" --no-document`)
|
// and MinGW build tools installed. The windows-2022 image has neither.
|
||||||
|
const hasMSYS2PreInstalled = ['windows-2019', 'windows-2016'].includes(platform)
|
||||||
|
|
||||||
|
if (!url.endsWith('.7z')) {
|
||||||
|
throw new Error(`URL should end in .7z: ${url}`)
|
||||||
|
}
|
||||||
|
const base = url.slice(url.lastIndexOf('/') + 1, url.length - '.7z'.length)
|
||||||
|
|
||||||
|
let rubyPrefix, inToolCache
|
||||||
|
if (common.shouldUseToolCache(engine, version)) {
|
||||||
|
inToolCache = common.toolCacheFind(engine, version)
|
||||||
|
if (inToolCache) {
|
||||||
|
rubyPrefix = inToolCache
|
||||||
|
} else {
|
||||||
|
rubyPrefix = common.getToolCacheRubyPrefix(platform, engine, version)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
rubyPrefix = `${drive}:\\${base}`
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!inToolCache) {
|
||||||
|
await downloadAndExtract(engine, version, url, base, rubyPrefix);
|
||||||
|
}
|
||||||
|
|
||||||
|
const windowsToolchain = core.getInput('windows-toolchain')
|
||||||
|
if (windowsToolchain === 'none') {
|
||||||
|
common.setupPath([`${rubyPrefix}\\bin`])
|
||||||
|
return rubyPrefix
|
||||||
|
}
|
||||||
|
|
||||||
|
let toolchainPaths = (version === 'mswin') ? await setupMSWin() : await setupMingw(version)
|
||||||
|
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
|
||||||
}
|
}
|
||||||
|
|
||||||
async function linkMSYS2() {
|
// Actions windows-2022 image does not contain any mingw or ucrt build tools. Install tools for it,
|
||||||
const toolCacheVersions = tc.findAllVersions('Ruby')
|
// and also install ucrt tools on earlier versions, which have msys2 and mingw tools preinstalled.
|
||||||
toolCacheVersions.sort()
|
async function installGCCTools(type, version) {
|
||||||
if (toolCacheVersions.length == 0) {
|
// 2022-Dec ruby/msys2-gcc-pkgs now uses a suffix to delineate different archive versions.
|
||||||
throw new Error('Could not find MSYS2 in the toolcache')
|
// 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. Note that the mswin archive uses OpenSSL 3.
|
||||||
|
// As of Jan-2023, OpenSSL 3 is used in Ruby 3.2 & all head versions. MSYS2 updated
|
||||||
|
// to OpenSSL 3 on 14-Jan-2023.
|
||||||
|
let suffix = ''
|
||||||
|
if (common.isHeadVersion(version) || common.floatVersion(version) >= 3.2) {
|
||||||
|
suffix = '-3.0'
|
||||||
}
|
}
|
||||||
const latestVersion = toolCacheVersions.slice(-1)[0]
|
const downloadPath = await common.measure(`Downloading ${type}${suffix} build tools`, async () => {
|
||||||
const latestHostedRuby = tc.find('Ruby', latestVersion)
|
let url = `${msys2GCCReleaseURI}/msys2-gcc-pkgs/${type}${suffix}.7z`
|
||||||
|
console.log(url)
|
||||||
|
return await tc.downloadTool(url)
|
||||||
|
})
|
||||||
|
|
||||||
const hostedMSYS2 = `${latestHostedRuby}\\msys64`
|
await common.measure(`Extracting ${type}${suffix} build tools`, async () =>
|
||||||
const msys2 = 'C:\\msys64'
|
exec.exec('7z', ['x', downloadPath, '-aoa', '-bd', `-o${msys2BasePath}`], { silent: true }))
|
||||||
await exec.exec(`cmd /c mklink /D ${msys2} ${hostedMSYS2}`)
|
|
||||||
return msys2
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function setupPath(msys2, rubyPrefix) {
|
// Actions windows-2022 image does not contain any MSYS2 build tools. Install tools for it.
|
||||||
let path = process.env['PATH'].split(';')
|
// 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)
|
||||||
|
})
|
||||||
|
|
||||||
// Remove conflicting dev tools from PATH
|
// need to remove all directories, since they may indicate old packages are installed,
|
||||||
path = path.filter(e => !e.match(/\b(Chocolatey|CMake|mingw64|OpenSSL|Strawberry)\b/))
|
// otherwise, error of "error: duplicated database entry"
|
||||||
|
fs.rmSync(`${msys2BasePath}\\var\\lib\\pacman\\local`, { recursive: true, force: true })
|
||||||
|
|
||||||
// Remove default Ruby in PATH
|
await common.measure(`Extracting msys2 build tools`, async () =>
|
||||||
path = path.filter(e => !e.match(/\bRuby\b/))
|
exec.exec('7z', ['x', downloadPath, '-aoa', '-bd', `-o${msys2BasePath}`], { silent: true }))
|
||||||
|
}
|
||||||
|
|
||||||
// Add MSYS2 in PATH
|
// Windows JRuby can install gems that require compile tools, only needed for
|
||||||
path.unshift(`${msys2}\\mingw64\\bin`, `${msys2}\\usr\\bin`)
|
// 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')
|
||||||
|
}
|
||||||
|
|
||||||
// Add the downloaded Ruby in PATH
|
// Install vcpkg files needed to build mswin Ruby
|
||||||
path.unshift(`${rubyPrefix}\\bin`)
|
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)
|
||||||
|
})
|
||||||
|
|
||||||
return path.join(';')
|
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')
|
||||||
|
return await common.measure('Setting up MSVC environment', async () => addVCVARSEnv())
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Sets MSVC environment for use in Actions
|
||||||
|
* allows steps to run without running vcvars*.bat, also for PowerShell
|
||||||
|
* adds a convenience VCVARS environment variable
|
||||||
|
* this assumes a single Visual Studio version being available in the Windows images */
|
||||||
|
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}`)
|
||||||
|
}
|
||||||
|
core.exportVariable('VCVARS', vcVars)
|
||||||
|
|
||||||
|
cmd = `cmd.exe /c ""${vcVars}" && set"`
|
||||||
|
|
||||||
|
let newEnv = new Map()
|
||||||
|
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)
|
||||||
|
})
|
||||||
|
|
||||||
|
let newPathEntries = undefined
|
||||||
|
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
|
||||||
|
}
|
||||||
|
|
||||||
|
// ssl files cause issues with non RI2 Rubies (<2.4) and ruby/ruby's CI from build folder due to dll resolution
|
||||||
|
function renameSystem32Dlls() {
|
||||||
|
const sys32 = 'C:\\Windows\\System32\\'
|
||||||
|
const badFiles = [`${sys32}libcrypto-1_1-x64.dll`, `${sys32}libssl-1_1-x64.dll`]
|
||||||
|
const existing = badFiles.filter((dll) => fs.existsSync(dll))
|
||||||
|
if (existing.length > 0) {
|
||||||
|
console.log(`Renaming ${existing.join(' and ')} to avoid dll resolution conflicts on Ruby <= 2.4`)
|
||||||
|
existing.forEach(dll => fs.renameSync(dll, `${dll}_`))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sets MSYS2 ENV variables set from running `ridk enable`
|
||||||
|
function addRidkEnv(ridk) {
|
||||||
|
let newEnv = new Map()
|
||||||
|
let cmd = `cmd.exe /c "${ridk} enable && set"`
|
||||||
|
let newSet = cp.execSync(cmd).toString().trim().split(/\r?\n/)
|
||||||
|
newSet = newSet.filter(line => /^\S+=\S+/.test(line))
|
||||||
|
newSet.forEach(s => {
|
||||||
|
let [k, v] = common.partition(s, '=')
|
||||||
|
newEnv.set(k, v)
|
||||||
|
})
|
||||||
|
|
||||||
|
for (let [k, v] of newEnv) {
|
||||||
|
if (process.env[k] !== v) {
|
||||||
|
if (!/^Path$/i.test(k)) {
|
||||||
|
console.log(`${k}=${v}`)
|
||||||
|
core.exportVariable(k, v)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user