This is an automated email from the ASF dual-hosted git repository. lprimak pushed a commit to branch build-test-older-jdk in repository https://gitbox.apache.org/repos/asf/shiro.git
commit ab5f9a7519f117787e90ba9938aa2b72df43d927 Author: lprimak <[email protected]> AuthorDate: Sun Nov 1 20:18:20 2026 -0600 Separate CI builds from JDK runtime testing Build once on JDK 25 and reuse compiled output across the supported JDK test matrices in GitHub Actions and Jenkins. • Skip Java, Groovy, and AspectJ compilation in test jobs • Make Liberty server lifecycle honor skipITs • Limit Jakarta EE tests to Linux on JDK 25 • Remove redundant RAT checks and stale Jenkins Maven arguments • Simplify Jenkins deployment and consolidate notifications --- .github/workflows/maven.yml | 75 ++++---- .jenkins.groovy | 266 ++++++++++++++-------------- .jenkins_maven_args | 1 - integration-tests/jaxrs/openliberty/pom.xml | 2 + pom.xml | 5 + 5 files changed, 182 insertions(+), 167 deletions(-) diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml index 022741274..b1ec5220c 100644 --- a/.github/workflows/maven.yml +++ b/.github/workflows/maven.yml @@ -44,65 +44,74 @@ jobs: java-version: 25 distribution: temurin - - name: License Check - run: ./mvnw apache-rat:check "-Drat.consoleOutput" - - name: Build with Maven - # zizmor: ignore[template-injection] run: >- ./mvnw verify --show-version --errors --batch-mode --no-transfer-progress -Pdocs - -Dgh_user=${{ github.actor }} -Dgh_token=${{ secrets.GITHUB_TOKEN }} + -DskipTests -DskipITs + + - name: Bundle build output + run: find . -path './.mvn' -prune -o -type d -name target -prune -print0 | tar --null -T - -czf ci-build.tar.gz + + - name: Upload build output + uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2 + with: + name: ci-build + path: ci-build.tar.gz + retention-days: 1 - build-all: + test: needs: build strategy: matrix: os: [ 'ubuntu-latest', 'windows-latest', 'macOS-latest' ] - jdk: [ 21, 25 ] + jdk: [ 17, 21, 25 ] dist: [ 'temurin', 'semeru', 'zulu' ] exclude: - # was already built - - os: 'ubuntu-latest' - jdk: 25 - dist: 'temurin' - # exclude temurin on MacOS. zulu (also hotspot) and Semeru are sufficient. - - os: 'macOS-latest' - dist: 'temurin' - # no Temurin 21 - - dist: 'temurin' - jdk: 21 - # no Semeru 21 - - dist: 'semeru' - jdk: 21 + # Zulu covers HotSpot on macOS and Windows; Semeru covers OpenJ9. + - { os: 'macOS-latest', dist: 'temurin' } + - { os: 'windows-latest', dist: 'temurin' } fail-fast: false runs-on: ${{ matrix.os }} + defaults: + run: + shell: bash + steps: - name: Checkout uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: persist-credentials: false - - name: Set up JDK + - name: Set up test JDK uses: actions/setup-java@b843ebf9b913146b38da2eaa7aeddf76074ae1ad # v6.1.0 with: java-version: ${{ matrix.jdk }} distribution: ${{ matrix.dist }} - - name: Build with Maven (Linux) - if: matrix.os == 'ubuntu-latest' && matrix.jdk >= 21 - # zizmor: ignore[template-injection] - run: >- - ./mvnw verify --show-version --errors --batch-mode --no-transfer-progress - -Dgh_user=${{ github.actor }} -Dgh_token=${{ secrets.GITHUB_TOKEN }} - - - name: Build with Maven (non-Linux) - if: matrix.os != 'ubuntu-latest' || matrix.jdk < 21 - run: >- - ./mvnw verify --show-version --errors --batch-mode --no-transfer-progress - -Pskip_jakarta_ee_tests + - name: Download build output + uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8 + with: + name: ci-build + + - name: Restore build output + run: tar -xzf ci-build.tar.gz + + - name: Test with Maven + env: + JAKARTA_EE_TESTS: ${{ matrix.os == 'ubuntu-latest' && matrix.jdk == 25 }} + GH_USER: ${{ github.actor }} + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + args=(--show-version --errors --batch-mode --no-transfer-progress + -Dmaven.main.skip=true -Dmaven.test.compile.skip=true -Daspectj.skip=true + -Dcheckstyle.skip -DminimalJavaBuildVersion=17 "-Dgh_user=$GH_USER" "-Dgh_token=$GH_TOKEN") + if [ "$JAKARTA_EE_TESTS" != true ]; then + args+=(-Pskip_jakarta_ee_tests) + fi + ./mvnw verify "${args[@]}" - name: Archive test run logs uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2 diff --git a/.jenkins.groovy b/.jenkins.groovy index 866615b04..6510068ef 100644 --- a/.jenkins.groovy +++ b/.jenkins.groovy @@ -21,12 +21,17 @@ def deployableBranch = env.BRANCH_NAME ==~ /(main|4.x)/ def latestSupportedJDK = 'jdk_25_latest' def builtinVersion = '999-SNAPSHOT' def nextVersion +def mavenArgs = '--show-version --errors --batch-mode --no-transfer-progress' +def skipCompilation = '-Dmaven.main.skip=true -Dmaven.test.compile.skip=true -Daspectj.skip=true' pipeline { agent none options { + // Configure an overall timeout for the build of one hour. + timeout(time: 1, unit: 'HOURS') + skipDefaultCheckout() // When we have test-fails e.g. we don't need to run the remaining steps skipStagesAfterUnstable() buildDiscarder(logRotator(numToKeepStr: '5', artifactNumToKeepStr: '5', daysToKeepStr: '30')) @@ -34,12 +39,91 @@ pipeline { stages { stage('Build') { + agent { + node { + // https://cwiki.apache.org/confluence/display/INFRA/ci-builds.apache.org + label 'ubuntu' + customWorkspace "workspace/${JOB_NAME}/BuildCheckout/" + } + } + + tools { + // https://cwiki.apache.org/confluence/display/INFRA/Maven+Installation+Matrix + maven 'maven_3_latest' + jdk "${latestSupportedJDK}" + } + + stages { + stage('Checkout and Initialization') { + steps { + echo 'Cleaning up the workspace' + cleanBeforeCheckout() + echo 'Checking out branch ' + env.BRANCH_NAME + checkout scm + echo 'Building Branch: ' + env.BRANCH_NAME + echo 'Using PATH = ' + env.PATH + echo 'Slave Node = ' + env.NODE_NAME + } + } + + stage('Use next -SNAPSHOT version') { + when { + expression { deployableBranch } + // is not a PR (GitHub) / MergeRequest (GitLab) / Change (Gerrit)? + not { changeRequest() } + } + + steps { + echo 'Setting next -SNAPSHOT version' + script { + def latestRelease = sh(script: """ + curl -sf https://repo.maven.apache.org/maven2/org/apache/shiro/shiro-root/maven-metadata.xml \ + | xmllint --xpath '//metadata/versioning/versions/version/text()' - 2>/dev/null \ + | egrep -vi "alpha|beta|RC"|tail -n1 \ + || echo '$builtinVersion' + """, returnStdout: true + ).trim() + + def parts = latestRelease.tokenize('.') + def nextPatch = parts[2].toInteger() + 1 + nextVersion = "${parts[0]}.${parts[1]}.${nextPatch}-SNAPSHOT" + if (env.BRANCH_NAME == '4.x') { + nextVersion = '4.0.0-SNAPSHOT' + } else if (parts[0].toInteger() < 3) { + nextVersion = '3.0.0-SNAPSHOT' + } + + echo "Latest release: ${latestRelease}, next SNAPSHOT: ${nextVersion}" + } + + sh "./mvnw -B versions:set -DprocessAllModules=true -DgenerateBackupPoms=false \ + -DoldVersion=${builtinVersion} -DnewVersion=${nextVersion}" + } + } + + stage('Compile and package') { + steps { + echo 'Building' + sh "./mvnw verify ${mavenArgs} -Pdocs -DskipTests -DskipITs" + stash name: 'ci-build', includes: '**/target/**,**/pom.xml', excludes: '.mvn/**' + } + } + } + + post { + success { + cleanBeforeCheckout() + } + } + } + + stage('Test') { matrix { axes { axis { // https://cwiki.apache.org/confluence/display/INFRA/JDK+Installation+Matrix name 'MATRIX_JDK' - values 'jdk_26_latest', 'jdk_25_latest', 'jdk_21_latest' + values 'jdk_27_latest', 'jdk_25_latest', 'jdk_21_latest' } // Additional axes, like OS and maven version can be configured here. } @@ -52,11 +136,6 @@ pipeline { } } - options { - // Configure an overall timeout for the build of one hour. - timeout(time: 1, unit: 'HOURS') - } - tools { // https://cwiki.apache.org/confluence/display/INFRA/Maven+Installation+Matrix maven 'maven_3_latest' @@ -64,76 +143,26 @@ pipeline { } stages { - stage('Initialization') { - steps { - echo 'Building Branch: ' + env.BRANCH_NAME - echo 'Using PATH = ' + env.PATH - echo 'Slave Node = ' + env.NODE_NAME - } - } - - stage('Cleanup') { + stage('Checkout and Restore build') { steps { echo 'Cleaning up the workspace' cleanBeforeCheckout() - } - } - - stage('Checkout') { - steps { echo 'Checking out branch ' + env.BRANCH_NAME checkout scm + echo 'Building Branch: ' + env.BRANCH_NAME + echo 'Using PATH = ' + env.PATH + echo 'Slave Node = ' + env.NODE_NAME + unstash 'ci-build' } } - stage('Use next -SNAPSHOT version') { - when { - expression { deployableBranch } - expression { MATRIX_JDK == latestSupportedJDK } - // is not a PR (GitHub) / MergeRequest (GitLab) / Change (Gerrit)? - not { changeRequest() } - } - steps { - echo 'Setting next -SNAPSHOT version' - script { - def latestRelease = sh(script: """ - curl -sf https://repo.maven.apache.org/maven2/org/apache/shiro/shiro-root/maven-metadata.xml \ - | xmllint --xpath '//metadata/versioning/versions/version/text()' - 2>/dev/null \ - | egrep -vi "alpha|beta|RC"|tail -n1 \ - || echo '$builtinVersion' - """, returnStdout: true - ).trim() - - def parts = latestRelease.tokenize('.') - def nextPatch = parts[2].toInteger() + 1 - nextVersion = "${parts[0]}.${parts[1]}.${nextPatch}-SNAPSHOT" - if (env.BRANCH_NAME == '4.x') { - nextVersion = '4.0.0-SNAPSHOT' - } else if (parts[0].toInteger() < 3) { - nextVersion = '3.0.0-SNAPSHOT' - } - - echo "Latest release: ${latestRelease}, next SNAPSHOT: ${nextVersion}" - } - - sh "./mvnw -B versions:set -DprocessAllModules=true -DgenerateBackupPoms=false \ - -DoldVersion=${builtinVersion} -DnewVersion=${nextVersion}" - } - } - - stage('License check') { + stage('Run tests') { steps { - echo 'License check' - sh './mvnw --batch-mode -Drat.consoleOutput=true apache-rat:check' + sh "./mvnw verify ${mavenArgs} ${skipCompilation} \ + -Pskip_jakarta_ee_tests -Dcheckstyle.skip -DminimalJavaBuildVersion=17 \ + -Dmaven.test.failure.ignore=true" } - } - stage('Build') { - steps { - echo 'Building' - sh './mvnw verify --show-version --errors --batch-mode --no-transfer-progress \ - -Dmaven.test.failure.ignore=true -Pskip_jakarta_ee_tests -DjavaVersion=17' - } post { always { junit(testResults: '**/surefire-reports/*.xml', allowEmptyResults: true) @@ -145,92 +174,63 @@ pipeline { stage('Deploy') { when { - allOf { - expression { deployableBranch } - expression { MATRIX_JDK == latestSupportedJDK } - // is not a PR (GitHub) / MergeRequest (GitLab) / Change (Gerrit)? - not { changeRequest() } - } + expression { deployableBranch } + expression { MATRIX_JDK == latestSupportedJDK } + // is not a PR (GitHub) / MergeRequest (GitLab) / Change (Gerrit)? + not { changeRequest() } } + steps { echo 'Deploying' - sh './mvnw --batch-mode deploy -Pdocs -DskipTests -DskipITs' + sh "./mvnw deploy ${mavenArgs} ${skipCompilation} \ + -Pdocs -DskipTests -DskipITs -Dmaven.install.skip=true -Dcheckstyle.skip" } } } // end of stages - // Do any post build stuff ... such as sending emails depending on the overall build result. post { - // If this build failed, send an email to the list. - failure { - script { - if (deployableBranch) { - emailext( - subject: "[BUILD-FAILURE]: Job '${env.JOB_NAME} [${env.BRANCH_NAME}] [${env.BUILD_NUMBER}]'", - body: """ -BUILD-FAILURE: Job '${env.JOB_NAME} [${env.BRANCH_NAME}] [${env.BUILD_NUMBER}]': -Check console output at "<a href="${env.BUILD_URL}">${env.JOB_NAME} [${env.BRANCH_NAME}] [${env.BUILD_NUMBER}]</a>" -""", - to: "[email protected]", - recipientProviders: [[$class: 'DevelopersRecipientProvider']] - ) - } - } - } - - // If this build didn't fail, but there were failing tests, send an email to the list. - unstable { - script { - if (deployableBranch) { - emailext( - subject: "[BUILD-UNSTABLE]: Job '${env.JOB_NAME} [${env.BRANCH_NAME}] [${env.BUILD_NUMBER}]'", - body: """ -BUILD-UNSTABLE: Job '${env.JOB_NAME} [${env.BRANCH_NAME}] [${env.BUILD_NUMBER}]': -Check console output at "<a href="${env.BUILD_URL}">${env.JOB_NAME} [${env.BRANCH_NAME}] [${env.BUILD_NUMBER}]</a>" -""", - to: "[email protected]", - recipientProviders: [[$class: 'DevelopersRecipientProvider']] - ) - } - } - } - - // Send an email, if the last build was not successful and this one is. success { // Cleanup the build directory if the build was successful // (in this case we probably don't have to do any post-build analysis) cleanBeforeCheckout() - script { - // remove MatrixCheckout directories older than 30 days to save disk space - sh ''' - set -eu - base_dir="../../../.." - if [ -d "$base_dir" ]; then - find "$base_dir" -name MatrixCheckout -mindepth 3 -maxdepth 3 -type d -mtime +30 -exec rm -rf {} + - fi - ''' - - // If this build was successful, and the previous build was not successful, send a "back to normal" email. - if (deployableBranch - && (currentBuild.previousBuild != null) && (currentBuild.previousBuild.result != 'SUCCESS')) { - emailext( - subject: "[BUILD-STABLE]: Job '${env.JOB_NAME} [${env.BRANCH_NAME}] [${env.BUILD_NUMBER}]'", - body: """ -BUILD-STABLE: Job '${env.JOB_NAME} [${env.BRANCH_NAME}] [${env.BUILD_NUMBER}]': -Is back to normal. -""", - to: "[email protected]", - recipientProviders: [[$class: 'DevelopersRecipientProvider']] - ) - } - } + // remove MatrixCheckout directories older than 30 days to save disk space + sh ''' + set -eu + base_dir="../../../.." + if [ -d "$base_dir" ]; then + find "$base_dir" -name MatrixCheckout -mindepth 3 -maxdepth 3 -type d -mtime +30 -exec rm -rf {} + + fi + ''' } } // end of post } // end of matrix - } // main stage ('Build') + } // main stage ('Test') } // main stages + + // Do any post build stuff ... such as sending emails depending on the overall build result. + post { + always { + script { + def result = currentBuild.currentResult + // If this build was successful, and the previous build was not successful, send a "back to normal" email. + def recovered = result == 'SUCCESS' && currentBuild.previousBuild != null \ + && currentBuild.previousBuild.result != 'SUCCESS' + if (deployableBranch && (result in ['FAILURE', 'UNSTABLE'] || recovered)) { + def status = recovered ? 'STABLE' : result + def job = "${env.JOB_NAME} [${env.BRANCH_NAME}] [${env.BUILD_NUMBER}]" + emailext( + subject: "[BUILD-${status}]: Job '${job}'", + body: recovered ? "BUILD-STABLE: Job '${job}': Is back to normal." + : "BUILD-${status}: Job '${job}': Check console output at <a href='${env.BUILD_URL}'>${job}</a>", + to: '[email protected]', + recipientProviders: [[$class: 'DevelopersRecipientProvider']] + ) + } + } + } + } } diff --git a/.jenkins_maven_args b/.jenkins_maven_args deleted file mode 100644 index c7750edfb..000000000 --- a/.jenkins_maven_args +++ /dev/null @@ -1 +0,0 @@ --Dmaven.compiler.release=17 -Djapicmp.skip=true diff --git a/integration-tests/jaxrs/openliberty/pom.xml b/integration-tests/jaxrs/openliberty/pom.xml index bd6f11990..ad27e4d53 100644 --- a/integration-tests/jaxrs/openliberty/pom.xml +++ b/integration-tests/jaxrs/openliberty/pom.xml @@ -34,6 +34,7 @@ <properties> <module.name>its.jaxrs.openliberty</module.name> + <liberty.start.skip>${skipITs}</liberty.start.skip> <liberty.var.default.http.port>9080</liberty.var.default.http.port> <liberty.var.default.https.port>9443</liberty.var.default.https.port> <liberty.var.app.filename>shiro-its-jaxrs-app-${project.version}</liberty.var.app.filename> @@ -62,6 +63,7 @@ <artifactId>liberty-maven-plugin</artifactId> <version>3.12.4</version> <configuration> + <skip>${liberty.start.skip}</skip> <serverName>shiro-its-jaxrs-openliberty</serverName> <features> <acceptLicense>true</acceptLicense> diff --git a/pom.xml b/pom.xml index 8b5586890..74e9c42d5 100644 --- a/pom.xml +++ b/pom.xml @@ -76,6 +76,7 @@ <japicmp.skip>${japicmp-skip}</japicmp.skip> <!-- workaround for gmavenplus plugin until maven 4 is being used --> <maven.project.sourceRoots.warningsDisabled>true</maven.project.sourceRoots.warningsDisabled> + <maven.test.compile.skip>${maven.test.skip}</maven.test.compile.skip> <!--suppress CheckTagEmptyBody --> <surefire.argLine/> <!--suppress CheckTagEmptyBody --> @@ -616,6 +617,7 @@ <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> + <skip>${maven.test.compile.skip}</skip> <showWarnings>true</showWarnings> <parameters>true</parameters> <compilerArgs> @@ -703,6 +705,9 @@ <plugin> <groupId>org.codehaus.gmavenplus</groupId> <artifactId>gmavenplus-plugin</artifactId> + <configuration> + <skipTests>${maven.test.compile.skip}</skipTests> + </configuration> <executions> <execution> <goals>
