11// The script generates a random subset of valid jdk, os, timezone, and other axes.
22// You can preview the results by running "node matrix.js"
33// See https://github.com/vlsi/github-actions-random-matrix
4+ let fs = require ( 'fs' ) ;
5+ let os = require ( 'os' ) ;
46let { MatrixBuilder} = require ( './matrix_builder' ) ;
57const matrix = new MatrixBuilder ( ) ;
68matrix . addAxis ( {
7- name : 'jdk' ,
8- title : x => x . version + ', ' + x . group ,
9+ name : 'java_distribution' ,
910 values : [
10- // Zulu
11- { group : 'Zulu' , version : '11' , distribution : 'zulu' , jit : 'hotspot' } ,
12- { group : 'Zulu' , version : '17' , distribution : 'zulu' , jit : 'hotspot' } ,
13-
14- // Adopt
15- { group : 'Adopt Hotspot' , version : '11' , distribution : 'adopt-hotspot' , jit : 'hotspot' } ,
16- { group : 'Adopt Hotspot' , version : '17' , distribution : 'adopt-hotspot' , jit : 'hotspot' } ,
11+ { value : 'corretto' , vendor : 'amazon' , weight : 1 } ,
12+ { value : 'liberica' , vendor : 'bellsoft' , weight : 1 } ,
13+ { value : 'microsoft' , vendor : 'microsoft' , weight : 1 } ,
14+ { value : 'oracle' , vendor : 'oracle' , weight : 1 } ,
15+ // There are issues running Semeru JDK with Gradle 8.5
16+ // See https://github.com/gradle/gradle/issues/27273
17+ // {value: 'semeru', vendor: 'ibm', weight: 4},
18+ { value : 'temurin' , vendor : 'eclipse' , weight : 1 } ,
19+ { value : 'zulu' , vendor : 'azul' , weight : 1 } ,
20+ ]
21+ } ) ;
1722
18- // Amazon Corretto
19- {
20- group : 'Corretto' ,
21- version : '17' ,
22- jit : 'hotspot' ,
23- distribution : 'jdkfile' ,
24- url : 'https://corretto.aws/downloads/latest/amazon-corretto-17-x64-linux-jdk.tar.gz'
25- } ,
26- {
27- group : 'Corretto' ,
28- version : '11' ,
29- jit : 'hotspot' ,
30- distribution : 'jdkfile' ,
31- url : 'https://corretto.aws/downloads/latest/amazon-corretto-11-x64-linux-jdk.tar.gz'
32- } ,
33- //DragonWell
34- {
35- group : 'DragonWell' ,
36- version : '11' ,
37- jit : 'hotspot' ,
38- distribution : 'jdkfile' ,
39- url : 'https://github.com/alibaba/dragonwell11/releases/download/dragonwell-standard-11.0.16.12_jdk-11.0.16-ga/Alibaba_Dragonwell_Standard_11.0.16.12.8_x64_linux.tar.gz'
40- } ,
41- {
42- group : 'DragonWell' ,
43- version : '17' ,
44- jit : 'hotspot' ,
45- distribution : 'jdkfile' ,
46- url : 'https://github.com/alibaba/dragonwell17/releases/download/dragonwell-standard-17.0.4.0.4%2B8_jdk-17.0.4-ga/Alibaba_Dragonwell_Standard_17.0.4.0.4%2B8_x64_linux.tar.gz'
47- } ,
48- //GraalVM
49- {
50- group : 'GraalVM' ,
51- version : '11' ,
52- jit : 'hotspot' ,
53- distribution : 'jdkfile' ,
54- url : 'https://github.com/graalvm/graalvm-ce-builds/releases/download/vm-22.3.0/graalvm-ce-java11-linux-amd64-22.3.0.tar.gz'
55- } ,
56- {
57- group : 'GraalVM' ,
58- version : '17' ,
59- jit : 'hotspot' ,
60- distribution : 'jdkfile' ,
61- url : 'https://github.com/graalvm/graalvm-ce-builds/releases/download/vm-22.3.0/graalvm-ce-java17-linux-amd64-22.3.0.tar.gz'
62- } ,
63- // Microsoft
64- {
65- group : 'Microsoft' ,
66- version : '11' ,
67- jit : 'hotspot' ,
68- distribution : 'jdkfile' ,
69- url : 'https://aka.ms/download-jdk/microsoft-jdk-11.0.11.9.1-linux-x64.tar.gz'
70- } ,
71- {
72- group : 'Microsoft' ,
73- version : '17' ,
74- jit : 'hotspot' ,
75- distribution : 'jdkfile' ,
76- url : 'https://aka.ms/download-jdk/microsoft-jdk-17.0.1.12.1-linux-x64.tar.gz'
77- } ,
78- // Liberica
79- {
80- group : 'Liberica' ,
81- version : '17' ,
82- jit : 'hotspot' ,
83- distribution : 'jdkfile' ,
84- url : 'https://download.bell-sw.com/java/17.0.1+12/bellsoft-jdk17.0.1+12-linux-amd64.tar.gz'
85- } ,
86- {
87- group : 'Liberica' ,
88- version : '11' ,
89- jit : 'hotspot' ,
90- distribution : 'jdkfile' ,
91- url : 'https://download.bell-sw.com/java/11.0.13+8/bellsoft-jdk11.0.13+8-linux-amd64.tar.gz'
92- } ,
93- // SapMachine
94- {
95- group : 'SapMachine' ,
96- version : '11' ,
97- jit : 'hotspot' ,
98- distribution : 'jdkfile' ,
99- url : 'https://github.com/SAP/SapMachine/releases/download/sapmachine-11.0.17/sapmachine-jdk-11.0.17_linux-x64_bin.tar.gz'
100- } ,
101- {
102- group : 'SapMachine' ,
103- version : '17' ,
104- jit : 'hotspot' ,
105- distribution : 'jdkfile' ,
106- url : 'https://github.com/SAP/SapMachine/releases/download/sapmachine-17.0.5/sapmachine-jdk-17.0.5_linux-x64_bin.tar.gz'
107- } ,
108- //Semeru
109- {
110- group : 'Semeru' ,
111- version : '11' ,
112- jit : 'hotspot' ,
113- distribution : 'jdkfile' ,
114- url : 'https://github.com/ibmruntimes/semeru11-binaries/releases/download/jdk-11.0.17%2B8_openj9-0.35.0/ibm-semeru-open-jdk_x64_linux_11.0.17_8_openj9-0.35.0.tar.gz'
115- } ,
116- {
117- group : 'Semeru' ,
118- version : '17' ,
119- jit : 'hotspot' ,
120- distribution : 'jdkfile' ,
121- url : 'https://github.com/ibmruntimes/semeru17-binaries/releases/download/jdk-17.0.5%2B8_openj9-0.35.0/ibm-semeru-open-jdk_x64_linux_17.0.5_8_openj9-0.35.0.tar.gz'
122- } ,
23+ const eaJava = '22' ;
24+ matrix . addAxis ( {
25+ name : 'java_version' ,
26+ // Strings allow versions like 18-ea
27+ values : [
28+ '11' ,
29+ '17' ,
30+ '21' ,
31+ eaJava ,
12332 ]
12433} ) ;
34+
12535matrix . addAxis ( {
12636 name : 'tz' ,
12737 values : [
@@ -157,25 +67,41 @@ matrix.addAxis({
15767 ]
15868} ) ;
15969
160- matrix . setNamePattern ( [ 'jdk ' , 'hash' , 'os' , 'tz' , 'locale' ] ) ;
70+ matrix . setNamePattern ( [ 'java_version' , 'java_distribution ', 'hash' , 'os' , 'tz' , 'locale' ] ) ;
16171
162- // TODO: figure out how "same hashcode" could be configured in OpenJ9
163- matrix . exclude ( { hash : { value : 'same' } , jdk : { jit : 'openj9' } } ) ;
164- matrix . exclude ( { jdk : { distribution : 'jdkfile' } , os : [ 'windows-latest' , 'macos-latest' ] } ) ;
72+ matrix . imply ( { java_version : eaJava } , { java_distribution : { value : 'oracle' } } )
73+ // Oracle JDK is only supported for JDK 17 and later
74+ matrix . exclude ( { java_distribution : { value : 'oracle' } , java_version : [ '11' ] } ) ;
75+ // Semeru uses OpenJ9 jit which has no option for making hash codes the same
76+ // See https://github.com/eclipse-openj9/openj9/issues/17309
77+ matrix . exclude ( { java_distribution : { value : 'semeru' } , hash : { value : 'same' } } ) ;
16578// Ensure at least one job with "same" hashcode exists
16679matrix . generateRow ( { hash : { value : 'same' } } ) ;
16780// Ensure at least one windows and at least one linux job is present (macos is almost the same as linux)
16881matrix . generateRow ( { os : 'windows-latest' } ) ;
16982matrix . generateRow ( { os : 'ubuntu-latest' } ) ;
170- // Ensure there will be at least one job with Java 17
171- matrix . generateRow ( { jdk : { version : 17 } } ) ;
17283// Ensure there will be at least one job with Java 11
173- matrix . generateRow ( { jdk : { version : 11 } } ) ;
84+ matrix . generateRow ( { java_version : "11" } ) ;
85+ // Ensure there will be at least one job with Java 17
86+ matrix . generateRow ( { java_version : "17" } ) ;
87+ // Ensure there will be at least one job with Java 21
88+ matrix . generateRow ( { java_version : "21" } ) ;
89+ // Ensure there will be at least one job with Java EA
90+ matrix . generateRow ( { java_version : eaJava } ) ;
17491const include = matrix . generateRows ( process . env . MATRIX_JOBS || 5 ) ;
17592if ( include . length === 0 ) {
17693 throw new Error ( 'Matrix list is empty' ) ;
17794}
17895include . sort ( ( a , b ) => a . name . localeCompare ( b . name , undefined , { numeric : true } ) ) ;
96+ include . forEach ( v => {
97+ // Pass locale via Gradle arguments in case it won't be inherited from _JAVA_OPTIONS
98+ // In fact, _JAVA_OPTIONS is non-standard and might be ignored by some JVMs
99+ let gradleArgs = [
100+ `-Duser.country=${ v . locale . country } ` ,
101+ `-Duser.language=${ v . locale . language } ` ,
102+ ] ;
103+ v . extraGradleArgs = gradleArgs . join ( ' ' ) ;
104+ } ) ;
179105include . forEach ( v => {
180106 let jvmArgs = [ ] ;
181107 if ( v . hash . value === 'same' ) {
@@ -184,23 +110,30 @@ include.forEach(v => {
184110 // Gradle does not work in tr_TR locale, so pass locale to test only: https://github.com/gradle/gradle/issues/17361
185111 jvmArgs . push ( `-Duser.country=${ v . locale . country } ` ) ;
186112 jvmArgs . push ( `-Duser.language=${ v . locale . language } ` ) ;
187- if ( v . jdk . jit === 'hotspot' && Math . random ( ) > 0.5 ) {
113+ v . java_vendor = v . java_distribution . vendor ;
114+ v . java_distribution = v . java_distribution . value ;
115+ if ( v . java_distribution === 'oracle' ) {
116+ v . oracle_java_website = v . java_version === eaJava ? 'jdk.java.net' : 'oracle.com' ;
117+ }
118+ v . non_ea_java_version = v . java_version === eaJava ? '' : v . java_version ;
119+ if ( v . java_distribution !== 'semeru' && Math . random ( ) > 0.5 ) {
188120 // The following options randomize instruction selection in JIT compiler
189121 // so it might reveal missing synchronization in TestNG code
190122 v . name += ', stress JIT' ;
123+ v . testDisableCaching = 'JIT randomization should not be cached' ;
191124 jvmArgs . push ( '-XX:+UnlockDiagnosticVMOptions' ) ;
192125 // Randomize instruction scheduling in GCM
193126 // share/opto/c2_globals.hpp
194127 jvmArgs . push ( '-XX:+StressGCM' ) ;
195128 // Randomize instruction scheduling in LCM
196129 // share/opto/c2_globals.hpp
197130 jvmArgs . push ( '-XX:+StressLCM' ) ;
198- if ( v . jdk . version >= 16 ) {
131+ if ( v . java_version >= 16 ) {
199132 // Randomize worklist traversal in IGVN
200133 // share/opto/c2_globals.hpp
201134 jvmArgs . push ( '-XX:+StressIGVN' ) ;
202135 }
203- if ( v . jdk . version >= 17 ) {
136+ if ( v . java_version >= 17 ) {
204137 // Randomize worklist traversal in CCP
205138 // share/opto/c2_globals.hpp
206139 jvmArgs . push ( '-XX:+StressCCP' ) ;
@@ -211,4 +144,9 @@ include.forEach(v => {
211144} ) ;
212145
213146console . log ( include ) ;
214- console . log ( '::set-output name=matrix::' + JSON . stringify ( { include} ) ) ;
147+ let filePath = process . env [ 'GITHUB_OUTPUT' ] || '' ;
148+ if ( filePath ) {
149+ fs . appendFileSync ( filePath , `matrix<<MATRIX_BODY${ os . EOL } ${ JSON . stringify ( { include} ) } ${ os . EOL } MATRIX_BODY${ os . EOL } ` , {
150+ encoding : 'utf8'
151+ } ) ;
152+ }
0 commit comments