From 66940abdb80d5bd465f66cef52cde58f1a542b13 Mon Sep 17 00:00:00 2001 From: Rain Ramm Date: Mon, 2 Jun 2025 14:44:01 +0300 Subject: [PATCH 1/8] Run tests with every supported Spring Boot version --- .github/workflows/build.yml | 11 ++++++++--- build.gradle | 13 +++++++++---- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 91aea9d..c5bfdd1 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -12,7 +12,8 @@ jobs: strategy: matrix: java: [ '17', '21' ] - name: Test with Java ${{ matrix.Java }} + spring-boot-version: ['3.0.13', '3.1.12', '3.2.12', '3.3.12', '3.4.6', '3.5.0'] + name: Test with Java ${{ matrix.Java }} / Spring Boot ${{ matrix.spring-boot-version }} steps: - name: Checkout code uses: actions/checkout@v4 @@ -25,6 +26,10 @@ jobs: distribution: temurin java-version: ${{ matrix.java }} + - name: Update Spring Boot version + run: | + ./gradlew useSpringBootVersion -PspringBootVersion=${{ matrix.spring-boot-version }} + - name: Run tests and generate reports run: ./gradlew testAndReport @@ -32,12 +37,12 @@ jobs: uses: actions/upload-artifact@v4 if: always() with: - name: report-java-${{ matrix.Java }} + name: report-java-${{ matrix.java }}-${{ matrix.spring-boot-version }} path: build/reports/** retention-days: 5 - name: Run Sonar analysis - if: matrix.Java == '17' + if: matrix.java == '17' && matrix.spring-boot-version == '3.5.0' env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} diff --git a/build.gradle b/build.gradle index 25bc300..f2eebde 100644 --- a/build.gradle +++ b/build.gradle @@ -1,7 +1,6 @@ buildscript { ext { - springBootVersion = '3.5.0' - springVersion = '6.2.7' + springBootVersion = project.hasProperty('springBootVersion') ? project.springBootVersion : '3.5.0' jacksonVersion = '2.19.0' retrofitVersion = '2.11.0' } @@ -40,10 +39,10 @@ dependencies { compileOnly group: 'org.apache.tomcat', name: 'tomcat-catalina', version: '10.1.41' // https://mvnrepository.com/artifact/org.springframework/spring-webmvc - compileOnly group: 'org.springframework', name: 'spring-webmvc', version: "${springVersion}" + compileOnly 'org.springframework:spring-webmvc' // https://mvnrepository.com/artifact/org.springframework/spring-tx - compileOnly group: 'org.springframework', name: 'spring-tx', version: "${springVersion}" + compileOnly 'org.springframework:spring-tx' // https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-security compileOnly group: 'org.springframework.boot', name: 'spring-boot-starter-security', version: "${springBootVersion}" @@ -112,3 +111,9 @@ dependencies { configurations { testImplementation.extendsFrom compileOnly } + +tasks.register('useSpringBootVersion') { + doLast { + println "Using Spring Boot version: ${springBootVersion}" + } +} From 95ae5ee0728569bcabbe04ed7b7c8e48baf23106 Mon Sep 17 00:00:00 2001 From: Rain Ramm Date: Tue, 3 Jun 2025 08:33:07 +0300 Subject: [PATCH 2/8] Run tests with every supported Spring Boot version --- .github/workflows/build.yml | 1 + build.gradle | 5 +++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index c5bfdd1..a497ea7 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -10,6 +10,7 @@ jobs: test: runs-on: ubuntu-latest strategy: + fail-fast: false matrix: java: [ '17', '21' ] spring-boot-version: ['3.0.13', '3.1.12', '3.2.12', '3.3.12', '3.4.6', '3.5.0'] diff --git a/build.gradle b/build.gradle index f2eebde..012d0ae 100644 --- a/build.gradle +++ b/build.gradle @@ -1,6 +1,7 @@ buildscript { ext { springBootVersion = project.hasProperty('springBootVersion') ? project.springBootVersion : '3.5.0' + springVersion = '6.2.7' jacksonVersion = '2.19.0' retrofitVersion = '2.11.0' } @@ -39,10 +40,10 @@ dependencies { compileOnly group: 'org.apache.tomcat', name: 'tomcat-catalina', version: '10.1.41' // https://mvnrepository.com/artifact/org.springframework/spring-webmvc - compileOnly 'org.springframework:spring-webmvc' + compileOnly group: 'org.springframework', name: 'spring-webmvc', version: "${springVersion}" // https://mvnrepository.com/artifact/org.springframework/spring-tx - compileOnly 'org.springframework:spring-tx' + compileOnly group: 'org.springframework', name: 'spring-tx', version: "${springVersion}" // https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-security compileOnly group: 'org.springframework.boot', name: 'spring-boot-starter-security', version: "${springBootVersion}" From c67f1b32da04db1074ca15a96cceaa7cc2abe711 Mon Sep 17 00:00:00 2001 From: Rain Ramm Date: Tue, 3 Jun 2025 09:17:34 +0300 Subject: [PATCH 3/8] Run tests with every supported Spring Boot version --- .github/README.md | 1 + .github/spring-versions.json | 14 +++++++++ .github/workflows/build.yml | 55 ++++++++++++++++++++++++++++++------ build.gradle | 8 +----- 4 files changed, 63 insertions(+), 15 deletions(-) create mode 100644 .github/README.md create mode 100644 .github/spring-versions.json diff --git a/.github/README.md b/.github/README.md new file mode 100644 index 0000000..ea01201 --- /dev/null +++ b/.github/README.md @@ -0,0 +1 @@ +# Placeholder for documentation diff --git a/.github/spring-versions.json b/.github/spring-versions.json new file mode 100644 index 0000000..18f7440 --- /dev/null +++ b/.github/spring-versions.json @@ -0,0 +1,14 @@ +{ + "matrix": [ + { "boot": "3.0.13", "framework": "6.0.14", "java": "17" }, + { "boot": "3.0.13", "framework": "6.0.14", "java": "21" }, + { "boot": "3.1.12", "framework": "6.0.21", "java": "17" }, + { "boot": "3.1.12", "framework": "6.0.21", "java": "21" }, + { "boot": "3.2.12", "framework": "6.1.15", "java": "17" }, + { "boot": "3.2.12", "framework": "6.1.15", "java": "21" }, + { "boot": "3.3.12", "framework": "6.1.20", "java": "17" }, + { "boot": "3.3.12", "framework": "6.1.20", "java": "21" }, + { "boot": "3.4.6", "framework": "6.2.7", "java": "17" }, + { "boot": "3.4.6", "framework": "6.2.7", "java": "21" } + ] +} diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index a497ea7..8abdbab 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -7,14 +7,57 @@ on: workflow_dispatch: jobs: + generate-matrix: + runs-on: ubuntu-latest + outputs: + matrix: ${{ steps.set-matrix.outputs.matrix }} + steps: + - uses: actions/checkout@v4 + - name: Read matrix from JSON + id: set-matrix + run: | + MATRIX=$(jq -c '.matrix' .github/spring-versions.json) + echo "matrix={\"include\":$MATRIX}" >> $GITHUB_OUTPUT + + regression-tests: + needs: generate-matrix + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: ${{ fromJson(needs.generate-matrix.outputs.matrix) }} + name: Test with Java ${{ matrix.java }} / Spring Boot ${{ matrix.boot }} + steps: + - name: Checkout code + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Setup Java + uses: actions/setup-java@v4 + with: + distribution: temurin + java-version: ${{ matrix.java }} + + - name: Run tests and generate reports + run: ./gradlew testAndReport -PspringBootVersion=${{ matrix.boot }} -PspringFrameworkVersion=${{ matrix.framework }} + + - name: Upload Artifact + uses: actions/upload-artifact@v4 + if: always() + with: + name: report-java-${{ matrix.java }}-spring-boot-${{ matrix.boot }} + path: build/reports/** + retention-days: 5 + +# todo kirjutada readme ka, mis põhimõttel asi toimib ning kuidas uuendada + kuidas testida erinevaid SP versioone + test: runs-on: ubuntu-latest strategy: fail-fast: false matrix: java: [ '17', '21' ] - spring-boot-version: ['3.0.13', '3.1.12', '3.2.12', '3.3.12', '3.4.6', '3.5.0'] - name: Test with Java ${{ matrix.Java }} / Spring Boot ${{ matrix.spring-boot-version }} + name: Test with latest version of Spring Boot and Java ${{ matrix.java }} steps: - name: Checkout code uses: actions/checkout@v4 @@ -27,10 +70,6 @@ jobs: distribution: temurin java-version: ${{ matrix.java }} - - name: Update Spring Boot version - run: | - ./gradlew useSpringBootVersion -PspringBootVersion=${{ matrix.spring-boot-version }} - - name: Run tests and generate reports run: ./gradlew testAndReport @@ -38,12 +77,12 @@ jobs: uses: actions/upload-artifact@v4 if: always() with: - name: report-java-${{ matrix.java }}-${{ matrix.spring-boot-version }} + name: report-java-${{ matrix.java }} path: build/reports/** retention-days: 5 - name: Run Sonar analysis - if: matrix.java == '17' && matrix.spring-boot-version == '3.5.0' + if: matrix.java == '17' env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} diff --git a/build.gradle b/build.gradle index 012d0ae..27e8be0 100644 --- a/build.gradle +++ b/build.gradle @@ -1,7 +1,7 @@ buildscript { ext { springBootVersion = project.hasProperty('springBootVersion') ? project.springBootVersion : '3.5.0' - springVersion = '6.2.7' + springVersion = project.hasProperty('springFrameworkVersion') ? project.springFrameworkVersion : '6.2.7' jacksonVersion = '2.19.0' retrofitVersion = '2.11.0' } @@ -112,9 +112,3 @@ dependencies { configurations { testImplementation.extendsFrom compileOnly } - -tasks.register('useSpringBootVersion') { - doLast { - println "Using Spring Boot version: ${springBootVersion}" - } -} From 676bcf54d1da47fa080de634b6d09d1f0e494552 Mon Sep 17 00:00:00 2001 From: Rain Ramm Date: Tue, 3 Jun 2025 09:56:02 +0300 Subject: [PATCH 4/8] Fix tests for older versions of Spring Boot --- .github/README.md | 6 ++++++ .github/workflows/build.yml | 2 -- build.gradle | 9 ++++++++- 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/.github/README.md b/.github/README.md index ea01201..d4acdea 100644 --- a/.github/README.md +++ b/.github/README.md @@ -1 +1,7 @@ # Placeholder for documentation + + +### TODO + +* Lokaalseks jooksutamiseks skript, mis testib läbi kõik Spring Boot versioonid, kasutab sama faili mis Ations +* SB versioonide uuendamiseks skript koos oma actioniga, mis teeb PRi diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 8abdbab..7e6a309 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -49,8 +49,6 @@ jobs: path: build/reports/** retention-days: 5 -# todo kirjutada readme ka, mis põhimõttel asi toimib ning kuidas uuendada + kuidas testida erinevaid SP versioone - test: runs-on: ubuntu-latest strategy: diff --git a/build.gradle b/build.gradle index 27e8be0..f54991a 100644 --- a/build.gradle +++ b/build.gradle @@ -4,6 +4,7 @@ buildscript { springVersion = project.hasProperty('springFrameworkVersion') ? project.springFrameworkVersion : '6.2.7' jacksonVersion = '2.19.0' retrofitVersion = '2.11.0' + mockitoVersion = '5.2.+' // At least Mockito 5.2.0 is required to Mock final classes } dependencies { classpath 'org.owasp:dependency-check-gradle' @@ -79,7 +80,7 @@ dependencies { compileOnly group: 'com.squareup.okhttp3', name: 'logging-interceptor', version: '4.12.0' // https://mvnrepository.com/artifact/de.siegmar/logback-gelf - compileOnly group: 'de.siegmar', name: 'logback-gelf', version: '6.1.1' + compileOnly group: 'de.siegmar', name: 'logback-gelf', version: '5.0.+' // https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-web testImplementation group: 'org.springframework.boot', name: 'spring-boot-starter-web', version: "${springBootVersion}" @@ -99,6 +100,12 @@ dependencies { // https://mvnrepository.com/artifact/ee.bitweb/spring-test-core testImplementation group: 'ee.bitweb', name: 'spring-test-core', version: '2.+' + // https://mvnrepository.com/artifact/org.mockito/mockito-core + testImplementation group: 'org.mockito', name: 'mockito-core', version: "${mockitoVersion}" + + // https://mvnrepository.com/artifact/org.mockito/mockito-junit-jupiter + testImplementation group: 'org.mockito', name: 'mockito-junit-jupiter', version: "${mockitoVersion}" + // https://mvnrepository.com/artifact/org.mock-server/mockserver-netty testImplementation ("org.mock-server:mockserver-netty:5.15.0") { exclude group: 'junit', module: 'junit' From e9eab900ebaa0767581cc4d7ffc9756f9d14213a Mon Sep 17 00:00:00 2001 From: Rain Ramm Date: Tue, 3 Jun 2025 10:09:14 +0300 Subject: [PATCH 5/8] Fix tests for older versions of Spring Boot --- .github/spring-versions.json | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/spring-versions.json b/.github/spring-versions.json index 18f7440..73b65a5 100644 --- a/.github/spring-versions.json +++ b/.github/spring-versions.json @@ -1,7 +1,6 @@ { "matrix": [ { "boot": "3.0.13", "framework": "6.0.14", "java": "17" }, - { "boot": "3.0.13", "framework": "6.0.14", "java": "21" }, { "boot": "3.1.12", "framework": "6.0.21", "java": "17" }, { "boot": "3.1.12", "framework": "6.0.21", "java": "21" }, { "boot": "3.2.12", "framework": "6.1.15", "java": "17" }, From 88fc4fbc8ca2f593969461857454921066b407dc Mon Sep 17 00:00:00 2001 From: Rain Ramm Date: Tue, 3 Jun 2025 10:22:08 +0300 Subject: [PATCH 6/8] Give jobs better names --- .github/workflows/build.yml | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 7e6a309..256623d 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -11,6 +11,7 @@ jobs: runs-on: ubuntu-latest outputs: matrix: ${{ steps.set-matrix.outputs.matrix }} + name: Generate version matrix steps: - uses: actions/checkout@v4 - name: Read matrix from JSON @@ -25,7 +26,7 @@ jobs: strategy: fail-fast: false matrix: ${{ fromJson(needs.generate-matrix.outputs.matrix) }} - name: Test with Java ${{ matrix.java }} / Spring Boot ${{ matrix.boot }} + name: Test Spring Boot ${{ matrix.boot }} / Java ${{ matrix.java }} steps: - name: Checkout code uses: actions/checkout@v4 @@ -55,7 +56,7 @@ jobs: fail-fast: false matrix: java: [ '17', '21' ] - name: Test with latest version of Spring Boot and Java ${{ matrix.java }} + name: Test Spring Boot latest / Java ${{ matrix.java }} steps: - name: Checkout code uses: actions/checkout@v4 @@ -75,7 +76,7 @@ jobs: uses: actions/upload-artifact@v4 if: always() with: - name: report-java-${{ matrix.java }} + name: report-java-${{ matrix.java }}-spring-boot-latest path: build/reports/** retention-days: 5 @@ -90,9 +91,11 @@ jobs: runs-on: ubuntu-latest needs: [test] steps: - - uses: actions/checkout@v4 + - name: Checkout code + uses: actions/checkout@v4 - - uses: actions/setup-java@v4 + - name: Setup Java + uses: actions/setup-java@v4 with: distribution: temurin java-version: 17 From 152115ea6917d8e603bb48c5a2d83c738312e0d2 Mon Sep 17 00:00:00 2001 From: Rain Ramm Date: Mon, 16 Jun 2025 13:35:21 +0300 Subject: [PATCH 7/8] Add automatic update of spring-versions.json --- .github/scripts/udpate-spring-versions.py | 71 ++++++++++++++++++++ .github/spring-versions.json | 54 ++++++++++++--- .github/workflows/update-spring-versions.yml | 38 +++++++++++ 3 files changed, 154 insertions(+), 9 deletions(-) create mode 100644 .github/scripts/udpate-spring-versions.py create mode 100644 .github/workflows/update-spring-versions.yml diff --git a/.github/scripts/udpate-spring-versions.py b/.github/scripts/udpate-spring-versions.py new file mode 100644 index 0000000..4c7537c --- /dev/null +++ b/.github/scripts/udpate-spring-versions.py @@ -0,0 +1,71 @@ +import json +import re +from collections import defaultdict +from packaging.version import Version +from xml.etree import ElementTree as ET +import urllib.request + +# Configuration +managed_minors = {"3.0", "3.1", "3.2", "3.3", "3.4"} +boot_java_compatibility = { + "3.0": ["17"], # Java 21 not supported + "3.1": ["17", "21"], + "3.2": ["17", "21"], + "3.3": ["17", "21"], + "3.4": ["17", "21"] +} +output_path = ".github/spring-versions.json" + +# Step 1: Fetch Spring Boot versions +metadata_url = "https://repo1.maven.org/maven2/org/springframework/boot/spring-boot-starter/maven-metadata.xml" +with urllib.request.urlopen(metadata_url) as response: + xml_data = response.read() + +root = ET.fromstring(xml_data) +versions = [v.text for v in root.findall(".//version")] + +boot_versions = defaultdict(list) +for v in versions: + if not re.match(r"^\d+\.\d+\.\d+$", v): + continue + minor = ".".join(v.split(".")[:2]) + if minor in managed_minors: + boot_versions[minor].append(Version(v)) + +latest_boot_versions = {minor: str(max(vlist)) for minor, vlist in boot_versions.items()} + +# Step 2: Resolve Spring Framework version +def get_spring_framework_version(boot_version: str) -> str: + pom_url = f"https://repo1.maven.org/maven2/org/springframework/boot/spring-boot-starter/{boot_version}/spring-boot-starter-{boot_version}.pom" + try: + with urllib.request.urlopen(pom_url) as response: + pom_data = response.read() + pom_root = ET.fromstring(pom_data) + ns = {'m': 'http://maven.apache.org/POM/4.0.0'} + for dep in pom_root.findall(".//m:dependency", ns): + gid = dep.find("m:groupId", ns) + aid = dep.find("m:artifactId", ns) + ver = dep.find("m:version", ns) + if gid is not None and aid is not None and ver is not None: + if gid.text == "org.springframework" and aid.text == "spring-core": + return ver.text + except Exception as e: + print(f"Warning: Failed to fetch framework version for {boot_version}: {e}") + return "unknown" + +# Step 3: Build matrix +matrix_entries = [] +for minor, boot_version in sorted(latest_boot_versions.items()): + framework_version = get_spring_framework_version(boot_version) + for java_version in boot_java_compatibility.get(minor, []): + matrix_entries.append({ + "boot": boot_version, + "framework": framework_version, + "java": str(java_version) + }) + +# Step 4: Save result +with open(output_path, "w") as f: + json.dump({"matrix": matrix_entries}, f, indent=2) + +print(f"Updated {output_path} with {len(matrix_entries)} matrix entries.") diff --git a/.github/spring-versions.json b/.github/spring-versions.json index 73b65a5..156adae 100644 --- a/.github/spring-versions.json +++ b/.github/spring-versions.json @@ -1,13 +1,49 @@ { "matrix": [ - { "boot": "3.0.13", "framework": "6.0.14", "java": "17" }, - { "boot": "3.1.12", "framework": "6.0.21", "java": "17" }, - { "boot": "3.1.12", "framework": "6.0.21", "java": "21" }, - { "boot": "3.2.12", "framework": "6.1.15", "java": "17" }, - { "boot": "3.2.12", "framework": "6.1.15", "java": "21" }, - { "boot": "3.3.12", "framework": "6.1.20", "java": "17" }, - { "boot": "3.3.12", "framework": "6.1.20", "java": "21" }, - { "boot": "3.4.6", "framework": "6.2.7", "java": "17" }, - { "boot": "3.4.6", "framework": "6.2.7", "java": "21" } + { + "boot": "3.0.13", + "framework": "6.0.14", + "java": "17" + }, + { + "boot": "3.1.11", + "framework": "6.0.20", + "java": "17" + }, + { + "boot": "3.1.12", + "framework": "6.0.21", + "java": "21" + }, + { + "boot": "3.2.12", + "framework": "6.1.15", + "java": "17" + }, + { + "boot": "3.2.12", + "framework": "6.1.15", + "java": "21" + }, + { + "boot": "3.3.12", + "framework": "6.1.20", + "java": "17" + }, + { + "boot": "3.3.12", + "framework": "6.1.20", + "java": "21" + }, + { + "boot": "3.4.6", + "framework": "6.2.7", + "java": "17" + }, + { + "boot": "3.4.6", + "framework": "6.2.7", + "java": "21" + } ] } diff --git a/.github/workflows/update-spring-versions.yml b/.github/workflows/update-spring-versions.yml new file mode 100644 index 0000000..8f5b785 --- /dev/null +++ b/.github/workflows/update-spring-versions.yml @@ -0,0 +1,38 @@ +name: Update Spring Versions Matrix + +on: + schedule: + - cron: '0 3 1 * *' # Monthly on the 1st at 03:00 UTC + workflow_dispatch: # Allow manual trigger as well + +jobs: + update-matrix: + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: '3.x' + + - name: Install Python dependencies + run: pip install packaging + + - name: Run update script + run: python .github/scripts/update-spring-versions.py + + - name: Create Pull Request + uses: peter-evans/create-pull-request@v6 + with: + commit-message: "chore: update Spring Boot/Framework testing matrix" + title: "Update Spring Versions Matrix" + body: | + This PR updates the `spring-versions.json` matrix with the latest patch versions of Spring Boot and their corresponding Spring Framework versions for Java 17 and 21. + branch: update/spring-versions-matrix + labels: | + dependencies + spring + author: github-actions[bot] From 09910ab0bd91bc0dc5d34342ee0e69974236bcc2 Mon Sep 17 00:00:00 2001 From: Rain Ramm Date: Mon, 16 Jun 2025 14:52:36 +0300 Subject: [PATCH 8/8] Remove README.md --- .github/README.md | 7 ------- 1 file changed, 7 deletions(-) delete mode 100644 .github/README.md diff --git a/.github/README.md b/.github/README.md deleted file mode 100644 index d4acdea..0000000 --- a/.github/README.md +++ /dev/null @@ -1,7 +0,0 @@ -# Placeholder for documentation - - -### TODO - -* Lokaalseks jooksutamiseks skript, mis testib läbi kõik Spring Boot versioonid, kasutab sama faili mis Ations -* SB versioonide uuendamiseks skript koos oma actioniga, mis teeb PRi