From 6afa36f31dca3e5171eef85d592679d010ba6250 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Petrovick=C3=BD?= Date: Thu, 14 Aug 2025 08:53:19 +0200 Subject: [PATCH 1/6] ci: generate JUnit test summary --- .github/workflows/pull_request.yml | 23 +++++++++++++++++++++++ build/build-parent/pom.xml | 6 ++++++ core/src/test/resources/logback-test.xml | 4 ++-- 3 files changed, 31 insertions(+), 2 deletions(-) diff --git a/.github/workflows/pull_request.yml b/.github/workflows/pull_request.yml index 0e46d596fc..49c1652582 100644 --- a/.github/workflows/pull_request.yml +++ b/.github/workflows/pull_request.yml @@ -44,6 +44,11 @@ jobs: - name: Build and test timefold-solver run: mvn -B verify + + - name: Test Summary + uses: test-summary/action@v2 + with: + paths: "**/TEST-*.xml" java_full: name: "Java Solver (with flag -Dfull)" runs-on: ubuntu-latest @@ -60,6 +65,11 @@ jobs: - name: Build and test timefold-solver using flag -Dfull run: mvn -Dfull -B verify + - name: Test Summary + uses: test-summary/action@v2 + with: + paths: "**/TEST-*.xml" + spring_boot_3_3_x: name: "Spring Boot 3.3.x" runs-on: ubuntu-latest @@ -81,6 +91,10 @@ jobs: run: | cd spring-integration mvn -B verify + - name: Test Summary + uses: test-summary/action@v2 + with: + paths: "**/TEST-*.xml" spring_boot_3_4_x: name: "Spring Boot 3.4.x" runs-on: ubuntu-latest @@ -102,6 +116,10 @@ jobs: run: | cd spring-integration mvn -B verify + - name: Test Summary + uses: test-summary/action@v2 + with: + paths: "**/TEST-*.xml" native: name: "Native Image" @@ -140,3 +158,8 @@ jobs: run: | cd ${{matrix.module}} mvn -B -Dnative verify + + - name: Test Summary + uses: test-summary/action@v2 + with: + paths: "**/TEST-*.xml" diff --git a/build/build-parent/pom.xml b/build/build-parent/pom.xml index b2efc68625..e0ed540634 100644 --- a/build/build-parent/pom.xml +++ b/build/build-parent/pom.xml @@ -555,10 +555,16 @@ maven-surefire-plugin ${version.surefire.plugin} + + true + maven-failsafe-plugin ${version.surefire.plugin} + + true + diff --git a/core/src/test/resources/logback-test.xml b/core/src/test/resources/logback-test.xml index 833262ebba..93f7c37ce1 100644 --- a/core/src/test/resources/logback-test.xml +++ b/core/src/test/resources/logback-test.xml @@ -9,11 +9,11 @@ - + - + From 68f50fb460d131cd5317ef493d56d46d063449e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Petrovick=C3=BD?= Date: Thu, 14 Aug 2025 09:05:22 +0200 Subject: [PATCH 2/6] Make a test fail --- .github/workflows/pull_request.yml | 11 +++++- .../DefaultExhaustiveSearchPhaseTest.java | 36 +++++++++---------- 2 files changed, 28 insertions(+), 19 deletions(-) diff --git a/.github/workflows/pull_request.yml b/.github/workflows/pull_request.yml index 49c1652582..6a21f7755b 100644 --- a/.github/workflows/pull_request.yml +++ b/.github/workflows/pull_request.yml @@ -49,6 +49,8 @@ jobs: uses: test-summary/action@v2 with: paths: "**/TEST-*.xml" + show: "fail" + if: always() java_full: name: "Java Solver (with flag -Dfull)" runs-on: ubuntu-latest @@ -69,6 +71,8 @@ jobs: uses: test-summary/action@v2 with: paths: "**/TEST-*.xml" + show: "fail" + if: always() spring_boot_3_3_x: name: "Spring Boot 3.3.x" @@ -95,6 +99,8 @@ jobs: uses: test-summary/action@v2 with: paths: "**/TEST-*.xml" + show: "fail" + if: always() spring_boot_3_4_x: name: "Spring Boot 3.4.x" runs-on: ubuntu-latest @@ -120,6 +126,8 @@ jobs: uses: test-summary/action@v2 with: paths: "**/TEST-*.xml" + show: "fail" + if: always() native: name: "Native Image" @@ -147,7 +155,6 @@ jobs: with: java-version: ${{matrix.java-version}} distribution: 'graalvm-community' - components: 'native-image' github-token: ${{ secrets.GITHUB_TOKEN }} cache: 'maven' @@ -163,3 +170,5 @@ jobs: uses: test-summary/action@v2 with: paths: "**/TEST-*.xml" + show: "fail" + if: always() diff --git a/core/src/test/java/ai/timefold/solver/core/impl/exhaustivesearch/DefaultExhaustiveSearchPhaseTest.java b/core/src/test/java/ai/timefold/solver/core/impl/exhaustivesearch/DefaultExhaustiveSearchPhaseTest.java index 4b192ae0f3..2c225e1f47 100644 --- a/core/src/test/java/ai/timefold/solver/core/impl/exhaustivesearch/DefaultExhaustiveSearchPhaseTest.java +++ b/core/src/test/java/ai/timefold/solver/core/impl/exhaustivesearch/DefaultExhaustiveSearchPhaseTest.java @@ -1,21 +1,5 @@ package ai.timefold.solver.core.impl.exhaustivesearch; -import static ai.timefold.solver.core.testutil.PlannerAssert.assertCode; -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; -import static org.mockito.Mockito.any; -import static org.mockito.Mockito.doAnswer; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - -import java.util.Arrays; -import java.util.Collections; -import java.util.List; -import java.util.concurrent.atomic.AtomicLong; -import java.util.concurrent.atomic.AtomicReference; - import ai.timefold.solver.core.api.score.buildin.simple.SimpleScore; import ai.timefold.solver.core.api.solver.Solver; import ai.timefold.solver.core.api.solver.SolverFactory; @@ -45,10 +29,25 @@ import ai.timefold.solver.core.testdomain.pinned.unassignedvar.TestdataPinnedAllowsUnassignedSolution; import ai.timefold.solver.core.testutil.AbstractMeterTest; import ai.timefold.solver.core.testutil.PlannerTestUtils; - +import io.micrometer.core.instrument.Metrics; +import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; -import io.micrometer.core.instrument.Metrics; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.concurrent.atomic.AtomicLong; +import java.util.concurrent.atomic.AtomicReference; + +import static ai.timefold.solver.core.testutil.PlannerAssert.assertCode; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.mockito.Mockito.any; +import static org.mockito.Mockito.doAnswer; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; class DefaultExhaustiveSearchPhaseTest extends AbstractMeterTest { @@ -195,6 +194,7 @@ void solveWithInitializedEntitiesAndMetric() { @Test void solveCustomMetrics() { + Assertions.fail(); var meterRegistry = new TestMeterRegistry(); Metrics.addRegistry(meterRegistry); From 0912ccd5b1cc37bf6d5e9ea37611ee9579483bdb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Petrovick=C3=BD?= Date: Thu, 14 Aug 2025 09:07:25 +0200 Subject: [PATCH 3/6] Formatting --- .../DefaultExhaustiveSearchPhaseTest.java | 34 ++++++++++--------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/core/src/test/java/ai/timefold/solver/core/impl/exhaustivesearch/DefaultExhaustiveSearchPhaseTest.java b/core/src/test/java/ai/timefold/solver/core/impl/exhaustivesearch/DefaultExhaustiveSearchPhaseTest.java index 2c225e1f47..b1ca139c78 100644 --- a/core/src/test/java/ai/timefold/solver/core/impl/exhaustivesearch/DefaultExhaustiveSearchPhaseTest.java +++ b/core/src/test/java/ai/timefold/solver/core/impl/exhaustivesearch/DefaultExhaustiveSearchPhaseTest.java @@ -1,5 +1,21 @@ package ai.timefold.solver.core.impl.exhaustivesearch; +import static ai.timefold.solver.core.testutil.PlannerAssert.assertCode; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.mockito.Mockito.any; +import static org.mockito.Mockito.doAnswer; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.concurrent.atomic.AtomicLong; +import java.util.concurrent.atomic.AtomicReference; + import ai.timefold.solver.core.api.score.buildin.simple.SimpleScore; import ai.timefold.solver.core.api.solver.Solver; import ai.timefold.solver.core.api.solver.SolverFactory; @@ -29,25 +45,11 @@ import ai.timefold.solver.core.testdomain.pinned.unassignedvar.TestdataPinnedAllowsUnassignedSolution; import ai.timefold.solver.core.testutil.AbstractMeterTest; import ai.timefold.solver.core.testutil.PlannerTestUtils; -import io.micrometer.core.instrument.Metrics; + import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; -import java.util.concurrent.atomic.AtomicLong; -import java.util.concurrent.atomic.AtomicReference; - -import static ai.timefold.solver.core.testutil.PlannerAssert.assertCode; -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; -import static org.mockito.Mockito.any; -import static org.mockito.Mockito.doAnswer; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; +import io.micrometer.core.instrument.Metrics; class DefaultExhaustiveSearchPhaseTest extends AbstractMeterTest { From 9af4ef12ad2e7ac42180da08b3fc01e0be842716 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Petrovick=C3=BD?= Date: Thu, 14 Aug 2025 09:15:57 +0200 Subject: [PATCH 4/6] Propagate to all test jobs --- .github/workflows/pull_request_quickstarts.yml | 8 +++++++- .github/workflows/pull_request_secure.yml | 12 ++++++++++++ .../DefaultExhaustiveSearchPhaseTest.java | 2 -- 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/.github/workflows/pull_request_quickstarts.yml b/.github/workflows/pull_request_quickstarts.yml index 27455714f8..6a8345c196 100644 --- a/.github/workflows/pull_request_quickstarts.yml +++ b/.github/workflows/pull_request_quickstarts.yml @@ -67,4 +67,10 @@ jobs: - name: Build and test timefold-quickstarts working-directory: ./timefold-quickstarts shell: bash - run: mvn -B clean verify \ No newline at end of file + run: mvn -B clean verify + - name: Test Summary + uses: test-summary/action@v2 + with: + paths: "**/TEST-*.xml" + show: "fail" + if: always() diff --git a/.github/workflows/pull_request_secure.yml b/.github/workflows/pull_request_secure.yml index a4cf64ea40..b1e5aebbd5 100644 --- a/.github/workflows/pull_request_secure.yml +++ b/.github/workflows/pull_request_secure.yml @@ -133,6 +133,12 @@ jobs: working-directory: ./timefold-solver-benchmarks shell: bash run: mvn -B -DskipJMH clean verify + - name: Test Summary + uses: test-summary/action@v2 + with: + paths: "**/TEST-*.xml" + show: "fail" + if: always() enterprise-java: needs: approval_required name: Enterprise Edition (Java) @@ -187,6 +193,12 @@ jobs: working-directory: ./timefold-solver-enterprise shell: bash run: mvn -B clean verify + - name: Test Summary + uses: test-summary/action@v2 + with: + paths: "**/TEST-*.xml" + show: "fail" + if: always() build_documentation: runs-on: ubuntu-latest diff --git a/core/src/test/java/ai/timefold/solver/core/impl/exhaustivesearch/DefaultExhaustiveSearchPhaseTest.java b/core/src/test/java/ai/timefold/solver/core/impl/exhaustivesearch/DefaultExhaustiveSearchPhaseTest.java index b1ca139c78..4b192ae0f3 100644 --- a/core/src/test/java/ai/timefold/solver/core/impl/exhaustivesearch/DefaultExhaustiveSearchPhaseTest.java +++ b/core/src/test/java/ai/timefold/solver/core/impl/exhaustivesearch/DefaultExhaustiveSearchPhaseTest.java @@ -46,7 +46,6 @@ import ai.timefold.solver.core.testutil.AbstractMeterTest; import ai.timefold.solver.core.testutil.PlannerTestUtils; -import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; import io.micrometer.core.instrument.Metrics; @@ -196,7 +195,6 @@ void solveWithInitializedEntitiesAndMetric() { @Test void solveCustomMetrics() { - Assertions.fail(); var meterRegistry = new TestMeterRegistry(); Metrics.addRegistry(meterRegistry); From 2a496aed51474a3de4f2e44d72421c35868c40b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Petrovick=C3=BD?= Date: Thu, 14 Aug 2025 09:19:41 +0200 Subject: [PATCH 5/6] Use a SHA instead of a version --- .github/workflows/pull_request.yml | 10 +++++----- .github/workflows/pull_request_quickstarts.yml | 2 +- .github/workflows/pull_request_secure.yml | 4 ++-- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/.github/workflows/pull_request.yml b/.github/workflows/pull_request.yml index 6a21f7755b..0d208db6db 100644 --- a/.github/workflows/pull_request.yml +++ b/.github/workflows/pull_request.yml @@ -46,7 +46,7 @@ jobs: run: mvn -B verify - name: Test Summary - uses: test-summary/action@v2 + uses: test-summary/action@2920bc1b1b377c787227b204af6981e8f41bbef3 with: paths: "**/TEST-*.xml" show: "fail" @@ -68,7 +68,7 @@ jobs: run: mvn -Dfull -B verify - name: Test Summary - uses: test-summary/action@v2 + uses: test-summary/action@2920bc1b1b377c787227b204af6981e8f41bbef3 with: paths: "**/TEST-*.xml" show: "fail" @@ -96,7 +96,7 @@ jobs: cd spring-integration mvn -B verify - name: Test Summary - uses: test-summary/action@v2 + uses: test-summary/action@2920bc1b1b377c787227b204af6981e8f41bbef3 with: paths: "**/TEST-*.xml" show: "fail" @@ -123,7 +123,7 @@ jobs: cd spring-integration mvn -B verify - name: Test Summary - uses: test-summary/action@v2 + uses: test-summary/action@2920bc1b1b377c787227b204af6981e8f41bbef3 with: paths: "**/TEST-*.xml" show: "fail" @@ -167,7 +167,7 @@ jobs: mvn -B -Dnative verify - name: Test Summary - uses: test-summary/action@v2 + uses: test-summary/action@2920bc1b1b377c787227b204af6981e8f41bbef3 with: paths: "**/TEST-*.xml" show: "fail" diff --git a/.github/workflows/pull_request_quickstarts.yml b/.github/workflows/pull_request_quickstarts.yml index 6a8345c196..4dd75b8823 100644 --- a/.github/workflows/pull_request_quickstarts.yml +++ b/.github/workflows/pull_request_quickstarts.yml @@ -69,7 +69,7 @@ jobs: shell: bash run: mvn -B clean verify - name: Test Summary - uses: test-summary/action@v2 + uses: test-summary/action@2920bc1b1b377c787227b204af6981e8f41bbef3 with: paths: "**/TEST-*.xml" show: "fail" diff --git a/.github/workflows/pull_request_secure.yml b/.github/workflows/pull_request_secure.yml index b1e5aebbd5..089a9ecf42 100644 --- a/.github/workflows/pull_request_secure.yml +++ b/.github/workflows/pull_request_secure.yml @@ -134,7 +134,7 @@ jobs: shell: bash run: mvn -B -DskipJMH clean verify - name: Test Summary - uses: test-summary/action@v2 + uses: test-summary/action@2920bc1b1b377c787227b204af6981e8f41bbef3 with: paths: "**/TEST-*.xml" show: "fail" @@ -194,7 +194,7 @@ jobs: shell: bash run: mvn -B clean verify - name: Test Summary - uses: test-summary/action@v2 + uses: test-summary/action@2920bc1b1b377c787227b204af6981e8f41bbef3 with: paths: "**/TEST-*.xml" show: "fail" From 07e7eb79bb5810ecbe10ef97574778692f0d7f64 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Petrovick=C3=BD?= Date: Thu, 14 Aug 2025 11:01:45 +0200 Subject: [PATCH 6/6] Increase Node.js memory --- .github/workflows/pull_request.yml | 3 +++ .github/workflows/pull_request_quickstarts.yml | 3 +++ .github/workflows/pull_request_secure.yml | 3 +++ 3 files changed, 9 insertions(+) diff --git a/.github/workflows/pull_request.yml b/.github/workflows/pull_request.yml index 0d208db6db..f3fff4b1b6 100644 --- a/.github/workflows/pull_request.yml +++ b/.github/workflows/pull_request.yml @@ -1,5 +1,8 @@ name: "Base Workflow" +env: + NODE_OPTIONS: "--max_old_space_size=4096" + on: push: branches: [main] diff --git a/.github/workflows/pull_request_quickstarts.yml b/.github/workflows/pull_request_quickstarts.yml index 4dd75b8823..3603d41dc4 100644 --- a/.github/workflows/pull_request_quickstarts.yml +++ b/.github/workflows/pull_request_quickstarts.yml @@ -1,5 +1,8 @@ name: Quickstarts Workflow +env: + NODE_OPTIONS: "--max_old_space_size=4096" + on: push: branches: [main] diff --git a/.github/workflows/pull_request_secure.yml b/.github/workflows/pull_request_secure.yml index 089a9ecf42..600d401e10 100644 --- a/.github/workflows/pull_request_secure.yml +++ b/.github/workflows/pull_request_secure.yml @@ -4,6 +4,9 @@ # or that there is explicit approval for their jobs to run. name: Secured Workflow +env: + NODE_OPTIONS: "--max_old_space_size=4096" + on: push: branches: [ main ]