This is an automated email from the ASF dual-hosted git repository.
vlsi pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/calcite.git
The following commit(s) were added to refs/heads/main by this push:
new 24842aa862 [CALCITE-7892] CI test jobs cost about 230 runner-minutes
per commit and test the same configurations on every run
24842aa862 is described below
commit 24842aa86263e93fdd41a7427154c903cae29874
Author: Vladimir Sitnikov <[email protected]>
AuthorDate: Mon Oct 26 15:03:19 2026 +0300
[CALCITE-7892] CI test jobs cost about 230 runner-minutes per commit and
test the same configurations on every run
The 11 hand-written test jobs in main.yml ran the same combinations on
every commit: the Zulu JDK only, an English locale, two Guava versions,
and JDK 24 as the newest JDK. They took about 230 runner-minutes per
commit, and adding a JDK meant copying a 30-line job.
.github/workflows/matrix.mjs now generates 6 test jobs per run with
github-actions-random-matrix. It varies the OS, the test JDK (8 to 24)
and its vendor, the Guava version (21.0 to 33.4.8-jre), Avatica (the
pinned release or main), the time zone, and the locale. Every run has
Windows, macOS, JDK 8, JDK 24, the oldest and the latest Guava, and
Avatica main; the remaining rows cover value pairs that no earlier row
covers. A pull request keeps the same rows across pushes, and
workflow_dispatch replays a run from the seed it printed.
The new Gradle property testExtraJvmArgs passes JVM arguments to the
test JVM only. CI sets the locale and the time zone there, so Gradle
itself keeps the runner's locale.
Not changed: the ErrorProne, Checker Framework, and Druid jobs. The
avatica axis replaces the separate "Avatica main" job.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
---
.github/workflows/main.yml | 351 ++++++++----------------------------
.github/workflows/matrix.mjs | 162 +++++++++++++++++
.github/workflows/package-lock.json | 21 +++
.github/workflows/package.json | 7 +
.gitignore | 3 +
build.gradle.kts | 6 +
6 files changed, 270 insertions(+), 280 deletions(-)
diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
index 10581a9eb7..08f6d919aa 100644
--- a/.github/workflows/main.yml
+++ b/.github/workflows/main.yml
@@ -36,6 +36,12 @@ on:
- 'site/**'
branches:
- '*'
+ # Replays the test jobs of an earlier run: paste the seed from its log
+ workflow_dispatch:
+ inputs:
+ matrix_rng_seed:
+ description: 'RNG seed of the test matrix'
+ required: false
concurrency:
# On main/release, we don't want any jobs cancelled so the sha is used to
name the group
@@ -49,104 +55,94 @@ concurrency:
env:
_JAVA_OPTIONS: '-XX:GCTimeLimit=90 -XX:GCHeapFreeLimit=35'
DEVELOCITY_ACCESS_KEY: ${{ secrets.DEVELOCITY_ACCESS_KEY }}
+ # matrix.mjs reads both values as well
GUAVA_MIN: '21.0' # oldest supported Guava version
GUAVA_MAX: '33.4.8-jre' # latest supported Guava version
- GUAVA: '21.0' # most jobs test against oldest Guava version
jobs:
- windows-jdk8:
- name: 'Windows (JDK 8)'
- runs-on: windows-latest
+ matrix_prep:
+ name: 'Matrix preparation'
+ runs-on: ubuntu-latest
+ outputs:
+ matrix: ${{ steps.set-matrix.outputs.matrix }}
+ env:
+ MATRIX_JOBS: 6
+ # Every push to a pull request gets the same rows
+ GITHUB_PR_NUMBER: ${{ github.event.number }}
+ RNG_SEED: ${{ github.event.inputs.matrix_rng_seed }}
steps:
- - uses: actions/checkout@v7
- with:
- fetch-depth: 50
- - name: 'Set up JDK 25 for compilation and JDK 8 for tests'
- uses: actions/setup-java@v6
- with:
- java-version: |
- 25
- 8
- distribution: 'zulu'
- - uses: burrunan/gradle-cache-action@v1
- name: Test
- with:
- job-id: jdk${{ matrix.jdk }}
- remote-build-cache-proxy-enabled: false
- arguments: --scan --no-parallel --no-daemon build javadoc
- properties: |
- org.gradle.java.installations.auto-download=false
- - name: 'sqlline and sqllsh'
- env:
- JAVA_OPTS: "-Dcalcite.model.classes.allowed=org.apache."
- shell: cmd
- run: |
- call sqlline.bat -e '!quit'
- echo.
- echo Sqlline example/csv
- call sqlline.bat --verbose -u
jdbc:calcite:model=example/csv/src/test/resources/model.json -n admin -p admin
-f example/csv/src/test/resources/smoke_test.sql
- echo.
- echo sqlsh
- call sqlsh.bat -o headers "select count(*) commits, author from
(select substring(author, 1, position(' <' in author)-1) author from
git_commits) group by author order by count(*) desc, author limit 20"
+ - uses: actions/checkout@v7
+ with:
+ fetch-depth: 1
+ - id: set-matrix
+ run: |
+ npm ci --prefix .github/workflows
+ node .github/workflows/matrix.mjs
- windows-jdk17:
- name: 'Windows (JDK 17)'
- runs-on: windows-latest
+ test:
+ name: '${{ matrix.name }}'
+ needs: matrix_prep
+ runs-on: ${{ matrix.os }}
+ strategy:
+ fail-fast: false
+ matrix: ${{ fromJson(needs.matrix_prep.outputs.matrix) }}
+ env:
+ TZ: ${{ matrix.tz }}
+ ORG_GRADLE_PROJECT_testExtraJvmArgs: ${{ matrix.testExtraJvmArgs }}
steps:
- uses: actions/checkout@v7
with:
fetch-depth: 50
- - name: 'Set up JDK 25 for compilation and JDK 17 for tests'
+ - name: 'Set up JDK 25 for compilation'
uses: actions/setup-java@v6
with:
- java-version: |
- 25
- 17
+ java-version: 25
distribution: 'zulu'
+ # https://github.com/actions/setup-java/issues/559
+ architecture: ${{ runner.arch == 'ARM64' && 'aarch64' || 'x64' }}
+ # The last JDK set up becomes JAVA_HOME, which runs Gradle and the tests
+ - name: 'Set up JDK ${{ matrix.java_version }} (${{
matrix.java_distribution }}) for tests'
+ uses: actions/setup-java@v6
+ with:
+ java-version: ${{ matrix.java_version }}
+ distribution: ${{ matrix.java_distribution }}
+ # https://github.com/actions/setup-java/issues/559
+ architecture: ${{ runner.arch == 'ARM64' && 'aarch64' || 'x64' }}
+ - name: 'Clone Avatica main'
+ if: ${{ matrix.avatica == 'main' }}
+ run: git clone --branch main --depth 100
https://github.com/apache/calcite-avatica.git ../calcite-avatica
- uses: burrunan/gradle-cache-action@v1
- name: Test
+ name: 'Build Avatica main'
+ if: ${{ matrix.avatica == 'main' }}
with:
- job-id: jdk${{ matrix.jdk }}
+ job-id: avatica-jdk${{ matrix.java_version }}
remote-build-cache-proxy-enabled: false
- arguments: --scan --no-parallel --no-daemon build
+ build-root-directory: ../calcite-avatica
+ arguments: publishToMavenLocal
properties: |
- org.gradle.java.installations.auto-download=false
- - name: 'sqlline and sqllsh'
+ calcite.avatica.version=1.0.0-dev-main
+ skipJavadoc=
+ - name: 'Parameters: JDK ${{ matrix.java_version }} ${{
matrix.java_distribution }}, Guava ${{ matrix.guava }}, TZ=${{ matrix.tz }},
${{ matrix.testExtraJvmArgs }}'
+ shell: bash
env:
- JAVA_OPTS: "-Dcalcite.model.classes.allowed=org.apache."
- shell: cmd
+ MATRIX_JSON: ${{ toJSON(matrix) }}
run: |
- call sqlline.bat -e '!quit'
- echo.
- echo Sqlline example/csv
- call sqlline.bat --verbose -u
jdbc:calcite:model=example/csv/src/test/resources/model.json -n admin -p admin
-f example/csv/src/test/resources/smoke_test.sql
- echo.
- echo sqlsh
- call sqlsh.bat -o headers "select count(*) commits, author from
(select substring(author, 1, position(' <' in author)-1) author from
git_commits) group by author order by count(*) desc, author limit 20"
-
- windows-jdk21:
- name: 'Windows (JDK 21)'
- runs-on: windows-latest
- steps:
- - uses: actions/checkout@v7
- with:
- fetch-depth: 50
- - name: 'Set up JDK 25 for compilation and JDK 21 for tests'
- uses: actions/setup-java@v6
- with:
- java-version: |
- 25
- 21
- distribution: 'zulu'
+ echo "Matrix row: $MATRIX_JSON"
+ echo "JAVA_HOME: $JAVA_HOME"
+ echo "Properties the test JVM sees with testExtraJvmArgs:"
+ # testExtraJvmArgs is unquoted on purpose: each argument is a
separate word
+ "$JAVA_HOME/bin/java" $ORG_GRADLE_PROJECT_testExtraJvmArgs
-XshowSettings:properties -version 2>&1 \
+ | grep -E '^
*(java\.version|java\.vendor|java\.vm\.name|user\.language|user\.country|user\.timezone|file\.encoding|os\.name|os\.arch)
='
- uses: burrunan/gradle-cache-action@v1
name: Test
with:
- job-id: jdk${{ matrix.jdk }}
+ job-id: jdk${{ matrix.java_version }}
remote-build-cache-proxy-enabled: false
- arguments: --scan --no-parallel --no-daemon build
+ arguments: --scan --no-parallel --no-daemon -Pguava.version=${{
matrix.guava }} ${{ matrix.avatica == 'main' &&
'-Pcalcite.avatica.version=1.0.0-dev-main-SNAPSHOT -PenableMavenLocal' || '' }}
tasks build ${{ matrix.javadoc && 'javadoc' || '' }}
properties: |
org.gradle.java.installations.auto-download=false
- - name: 'sqlline and sqllsh'
+ - name: 'sqlline and sqlsh'
+ if: ${{ runner.os == 'Windows' }}
env:
JAVA_OPTS: "-Dcalcite.model.classes.allowed=org.apache."
shell: cmd
@@ -158,213 +154,8 @@ jobs:
echo.
echo sqlsh
call sqlsh.bat -o headers "select count(*) commits, author from
(select substring(author, 1, position(' <' in author)-1) author from
git_commits) group by author order by count(*) desc, author limit 20"
-
- linux-jdk8-oldest-guava-tz:
- name: 'Linux (JDK 8, oldest Guava, America/New_York Timezone)'
- runs-on: ubuntu-latest
- env:
- TZ: 'America/New_York' # flips between −05:00 and −04:00
- steps:
- - uses: actions/checkout@v7
- with:
- fetch-depth: 50
- - name: 'Set up JDK 25 for compilation and JDK 8 for tests'
- uses: actions/setup-java@v6
- with:
- java-version: |
- 25
- 8
- distribution: 'zulu'
- - uses: burrunan/gradle-cache-action@v1
- name: Test
- with:
- job-id: jdk${{ matrix.jdk }}
- remote-build-cache-proxy-enabled: false
- arguments: --scan --no-parallel --no-daemon -Pguava.version=${{
env.GUAVA_MIN }} build
- properties: |
- org.gradle.java.installations.auto-download=false
-
- linux-jdk8-latest-guava-tz:
- name: 'Linux (JDK 8, latest Guava, America/New_York Timezone)'
- runs-on: ubuntu-latest
- env:
- TZ: 'America/New_York' # flips between −05:00 and −04:00
- steps:
- - uses: actions/checkout@v7
- with:
- fetch-depth: 50
- - name: 'Set up JDK 25 for compilation and JDK 8 for tests'
- uses: actions/setup-java@v6
- with:
- java-version: |
- 25
- 8
- distribution: 'zulu'
- - uses: burrunan/gradle-cache-action@v1
- name: Test
- with:
- job-id: jdk${{ matrix.jdk }}
- remote-build-cache-proxy-enabled: false
- arguments: --scan --no-parallel --no-daemon -Pguava.version=${{
env.GUAVA_MAX }} tasks build
- properties: |
- org.gradle.java.installations.auto-download=false
-
- linux-jdk11-tz:
- name: 'Linux (JDK 11, Pacific/Chatham Timezone)'
- runs-on: ubuntu-latest
- env:
- TZ: 'Pacific/Chatham' # flips between +12:45 and +13:45
- steps:
- - uses: actions/checkout@v7
- with:
- fetch-depth: 50
- - name: 'Set up JDK 25 for compilation and JDK 11 for tests'
- uses: actions/setup-java@v6
- with:
- java-version: |
- 25
- 11
- distribution: 'zulu'
- - uses: burrunan/gradle-cache-action@v1
- name: Test
- with:
- job-id: jdk${{ matrix.jdk }}
- remote-build-cache-proxy-enabled: false
- arguments: --scan --no-parallel --no-daemon build
- properties: |
- org.gradle.java.installations.auto-download=false
-
- linux-jdk17: # LTS JDK version, don't remove until EOL
- name: 'Linux (JDK 17)'
- runs-on: ubuntu-latest
- steps:
- - uses: actions/checkout@v7
- with:
- fetch-depth: 50
- - name: 'Set up JDK 25 for compilation and JDK 17 for tests'
- uses: actions/setup-java@v6
- with:
- java-version: |
- 25
- 17
- distribution: 'zulu'
- - uses: burrunan/gradle-cache-action@v1
- name: Test
- with:
- job-id: jdk${{ matrix.jdk }}
- remote-build-cache-proxy-enabled: false
- arguments: --scan --no-parallel --no-daemon -Pguava.version=${{
env.GUAVA }} build
- properties: |
- org.gradle.java.installations.auto-download=false
-
- linux-jdk121: # LTS JDK version, don't remove until EOL
- name: 'Linux (JDK 21)'
- runs-on: ubuntu-latest
- steps:
- - uses: actions/checkout@v7
- with:
- fetch-depth: 50
- - name: 'Set up JDK 25 for compilation and JDK 21 for tests'
- uses: actions/setup-java@v6
- with:
- java-version: |
- 25
- 21
- distribution: 'zulu'
- - uses: burrunan/gradle-cache-action@v1
- name: Test
- with:
- job-id: jdk${{ matrix.jdk }}
- remote-build-cache-proxy-enabled: false
- arguments: --scan --no-parallel --no-daemon -Pguava.version=${{
env.GUAVA }} build
- properties: |
- org.gradle.java.installations.auto-download=false
-
- linux-jdk24: # latest JDK version supported by ForbiddenAPIs plugin, keep
this updated (see https://jdk.java.net/)
- name: 'Linux (JDK 24)'
- runs-on: ubuntu-latest
- steps:
- - uses: actions/checkout@v7
- with:
- fetch-depth: 50
- - name: 'Set up JDK 25 for compilation and JDK 24 for tests'
- uses: actions/setup-java@v6
- with:
- java-version: |
- 25
- 24
- distribution: 'zulu'
- - uses: burrunan/gradle-cache-action@v1
- name: Test
- with:
- job-id: jdk${{ matrix.jdk }}
- remote-build-cache-proxy-enabled: false
- arguments: --scan --no-parallel --no-daemon -Pguava.version=${{
env.GUAVA }} tasks build
- properties: |
- org.gradle.java.installations.auto-download=false
-
- linux-avatica:
- name: 'Linux (JDK 11, Avatica main)'
- runs-on: ubuntu-latest
- steps:
- - name: 'Set up JDK 25 for compilation and JDK 11 for tests'
- uses: actions/setup-java@v6
- with:
- java-version: |
- 25
- 11
- distribution: 'zulu'
- - name: 'Clone Avatica to Maven Local repository'
- run: |
- git clone --branch main --depth 100
https://github.com/apache/calcite-avatica.git ../calcite-avatica
- - uses: burrunan/gradle-cache-action@v1
- name: Build Avatica
- with:
- job-id: avatica-jdk${{ matrix.jdk }}
- remote-build-cache-proxy-enabled: false
- build-root-directory: ../calcite-avatica
- arguments: publishToMavenLocal
- properties: |
- calcite.avatica.version=1.0.0-dev-main
- skipJavadoc=
- - uses: actions/checkout@v7
- with:
- fetch-depth: 50
- - uses: burrunan/gradle-cache-action@v1
- name: Test
- with:
- job-id: jdk${{ matrix.jdk }}
- remote-build-cache-proxy-enabled: false
- execution-only-caches: true
- arguments: --scan --no-parallel --no-daemon build javadoc
- properties: |
- org.gradle.java.installations.auto-download=false
- calcite.avatica.version=1.0.0-dev-main-SNAPSHOT
- enableMavenLocal=
-
- mac:
- name: 'macOS (JDK 21)'
- runs-on: macos-15
- steps:
- - uses: actions/checkout@v7
- with:
- fetch-depth: 50
- - name: 'Set up JDK 25 for compilation and JDK 21 for tests'
- uses: actions/setup-java@v6
- with:
- java-version: |
- 25
- 21
- distribution: 'zulu'
- - uses: burrunan/gradle-cache-action@v1
- name: Test
- with:
- job-id: jdk21
- remote-build-cache-proxy-enabled: false
- arguments: --scan --no-parallel --no-daemon build javadoc
- properties: |
- org.gradle.java.installations.auto-download=false
- - name: 'sqlline and sqllsh'
+ - name: 'sqlline and sqlsh'
+ if: ${{ runner.os != 'Windows' }}
env:
JAVA_OPTS: "-Dcalcite.model.classes.allowed=org.apache."
run: |
diff --git a/.github/workflows/matrix.mjs b/.github/workflows/matrix.mjs
new file mode 100644
index 0000000000..b23d89ea20
--- /dev/null
+++ b/.github/workflows/matrix.mjs
@@ -0,0 +1,162 @@
+// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements. See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to you under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// Generates the test jobs of main.yml. Each run picks MATRIX_JOBS rows: the
+// required rows below, then rows that cover value pairs no earlier row covers.
+// A pull request keeps the same rows across pushes, and every run prints its
+// seed. To list the rows of a run locally:
+//
+// npm ci --prefix .github/workflows
+// RNG_SEED=<seed> MATRIX_JOBS=6 node .github/workflows/matrix.mjs
+//
+// Add --coverage to print the share of value pairs the rows cover.
+import { createGitHubMatrixBuilder, setGitHubOutput } from
'@vlsi/github-actions-random-matrix/github';
+
+const { matrix } = createGitHubMatrixBuilder();
+matrix.failOnUnsatisfiableFilters(true);
+
+// The tests run on the JDK that runs Gradle. Gradle 8.14 runs on JDK 24 at
+// most, so JDK 25 compiles the code but does not run the tests yet.
+matrix.addAxis({
+ name: 'java_version',
+ title: x => 'JDK ' + x,
+ values: ['8', '11', '17', '21', '24'],
+});
+
+matrix.addAxis({
+ name: 'java_distribution',
+ // Oracle is missing: Oracle publishes current builds only for JDK 25, which
+ // cannot run Gradle 8.14. setup-java takes older Oracle JDKs from the
archive,
+ // which holds only the first GA build of each.
+ values: ['zulu', 'temurin', 'corretto', 'liberica', 'microsoft'],
+});
+
+// GUAVA_MIN and GUAVA_MAX come from main.yml, which the ErrorProne and
+// Checker Framework jobs read as well.
+const guavaMin = process.env.GUAVA_MIN || '21.0';
+const guavaMax = process.env.GUAVA_MAX || '33.4.8-jre';
+matrix.addAxis({
+ name: 'guava',
+ title: x => 'Guava ' + x,
+ values: [guavaMin, '27.1-jre', '31.1-jre', guavaMax],
+});
+
+matrix.addAxis({
+ name: 'os',
+ title: x => x.value.replace(/-latest$/, ''),
+ values: [
+ {value: 'ubuntu-latest', weight: 4},
+ {value: 'windows-latest', weight: 1},
+ {value: 'macos-15', weight: 1},
+ ],
+});
+
+matrix.addAxis({
+ name: 'tz',
+ values: [
+ 'UTC',
+ // UTC-05:00 in winter, UTC-04:00 in summer
+ 'America/New_York',
+ // UTC+12:45 in winter, UTC+13:45 in summer
+ 'Pacific/Chatham',
+ // UTC+00:00 in winter, so DST bugs hide behind a zero offset
+ 'Europe/London',
+ ],
+});
+
+matrix.addAxis({
+ name: 'locale',
+ title: x => x.language + '_' + x.country,
+ values: [
+ {language: 'en', country: 'US'},
+ // tr_TR is missing: innodb-java-reader 1.0.10 uppercases column types in
+ // the default locale, so "int" becomes "İNT" and
InnodbAdapterDataTypesTest
+ // fails.
+ // Uses a comma as the decimal separator
+ {language: 'de', country: 'DE'},
+ {language: 'fr', country: 'CA'},
+ {language: 'ru', country: 'RU'},
+ ],
+});
+
+// Calcite pins one Avatica release in gradle.properties; "main" builds Avatica
+// from its main branch, so incompatible changes show up before a release.
+matrix.addAxis({
+ name: 'avatica',
+ values: [
+ {value: 'release', title: '', weight: 4},
+ {value: 'main', title: 'Avatica main', weight: 1},
+ ],
+});
+
+matrix.setNamePattern(['java_version', 'java_distribution', 'guava', 'os',
'tz', 'locale', 'avatica']);
+
+// Microsoft builds only LTS releases starting with 11.
+matrix.imply({java_distribution: 'microsoft'}, {java_version: ['11', '17',
'21']});
+// Avatica's own CI builds on JDK 8 and 11, on Linux.
+matrix.imply({avatica: {value: 'main'}}, {java_version: ['8', '11'], os:
{value: 'ubuntu-latest'}});
+// Temurin publishes no JDK 8 for macOS on arm64.
+matrix.exclude({os: {value: 'macos-15'}, java_distribution: 'temurin',
java_version: '8'});
+
+const javaVersions = matrix.axisByName.java_version.values;
+
+const include = matrix.generateRows(Number(process.env.MATRIX_JOBS || 6), {
+ require: [
+ {os: {value: 'windows-latest'}},
+ {os: {value: 'macos-15'}},
+ // Javadoc options depend on the JDK. JDK 24 is missing: its javadoc
+ // reports "reference not found" in RelBuilder, SqlFunctions, and
+ // SqlValidatorScope.
+ {
+ filter: {java_version: '8'},
+ tag: row => { row.javadoc = true; },
+ },
+ {
+ filter: {java_version: '21'},
+ tag: row => { row.javadoc = true; },
+ },
+ {java_version: javaVersions[javaVersions.length - 1]},
+ {guava: guavaMin},
+ {guava: guavaMax},
+ {avatica: {value: 'main'}},
+ ],
+});
+if (include.length === 0) {
+ throw new Error('Matrix list is empty');
+}
+
+include.sort((a, b) => a.name.localeCompare(b.name, undefined, {numeric:
true}));
+
+include.forEach(v => {
+ // These reach the test JVM only; Gradle keeps the runner's locale.
+ const jvmArgs = [
+ `-Duser.language=${v.locale.language}`,
+ `-Duser.country=${v.locale.country}`,
+ // The JVM on Windows ignores TZ, so set the time zone explicitly.
+ `-Duser.timezone=${v.tz}`,
+ ];
+ v.testExtraJvmArgs = jvmArgs.join(' ');
+ v.os = v.os.value;
+ v.avatica = v.avatica.value;
+ delete v.locale;
+});
+
+if (process.argv.includes('--coverage')) {
+ const coverage = matrix.pairCoverageReport();
+ console.log(`Pair coverage: ${coverage.covered}/${coverage.total}
(${coverage.percentage}%)`);
+} else {
+ console.log(include);
+ setGitHubOutput('matrix', {include});
+}
diff --git a/.github/workflows/package-lock.json
b/.github/workflows/package-lock.json
new file mode 100644
index 0000000000..645731c28c
--- /dev/null
+++ b/.github/workflows/package-lock.json
@@ -0,0 +1,21 @@
+{
+ "name": "workflows",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "dependencies": {
+ "@vlsi/github-actions-random-matrix": "2.4.0"
+ }
+ },
+ "node_modules/@vlsi/github-actions-random-matrix": {
+ "version": "2.4.0",
+ "resolved":
"https://registry.npmjs.org/@vlsi/github-actions-random-matrix/-/github-actions-random-matrix-2.4.0.tgz",
+ "integrity":
"sha512-OO79/PYYm3zXol0KhI6T6U1rJXJbV/q2JOelz0jsir50Iqw5GvMdhlvq8Qbgw9PL3w2v/KETt0AzlFxC+tc0rQ==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=16"
+ }
+ }
+ }
+}
diff --git a/.github/workflows/package.json b/.github/workflows/package.json
new file mode 100644
index 0000000000..e8a9775511
--- /dev/null
+++ b/.github/workflows/package.json
@@ -0,0 +1,7 @@
+{
+ "private": true,
+ "type": "module",
+ "dependencies": {
+ "@vlsi/github-actions-random-matrix": "2.4.0"
+ }
+}
diff --git a/.gitignore b/.gitignore
index 85e63264c0..dde46a4f22 100644
--- a/.gitignore
+++ b/.gitignore
@@ -58,3 +58,6 @@ local.properties
# jenv
.java-version
+
+# npm dependencies of .github/workflows/matrix.mjs
+.github/workflows/node_modules/
diff --git a/build.gradle.kts b/build.gradle.kts
index 6d5c4747a9..165a7f9fad 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -928,6 +928,12 @@ fun passProperty(name: String, default: String? = null) {
passProperty(e)
}
}
+ // JVM arguments for the test JVM only, separated by spaces.
+ // CI sets the locale and the time zone here.
+ // A -D argument overrides the same property passed above.
+ project.props.string("testExtraJvmArgs").trim().takeIf {
it.isNotEmpty() }?.let {
+ jvmArgs(it.split(Regex("\\s+")))
+ }
}
// Cannot be moved above otherwise configure each will override
// also the specific configurations below.