From eca359cf6938ef8e0bd0972d137deb2fa0df6789 Mon Sep 17 00:00:00 2001 From: Darin Kelkhoff Date: Wed, 2 Jul 2025 12:32:37 -0500 Subject: [PATCH 01/10] Try not manually installing java 17, and parse jacoco outputs more directly (per Cursor) --- .circleci/config.yml | 20 ++++++-------------- pom.xml | 26 +++++++++++++------------- 2 files changed, 19 insertions(+), 27 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 7433d19e..952363a8 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -17,21 +17,13 @@ commands: path: << parameters.module >>/target/site/jacoco/jacoco-resources when: always - install_java17: + check_java_version: steps: - run: - name: Install Java 17 + name: Check Java Version command: | - sudo apt-get update - sudo apt install -y openjdk-17-jdk - sudo rm /etc/alternatives/java - sudo ln -s /usr/lib/jvm/java-17-openjdk-amd64/bin/java /etc/alternatives/java - - run: - ## used by jacoco uncovered class reporting in pom.xml - name: Install html2text - command: | - sudo apt-get update - sudo apt-get install -y html2text + java -version + echo "Java version check completed" mvn_verify: steps: @@ -139,7 +131,7 @@ jobs: executor: localstack/default steps: ## - localstack/startup - - install_java17 + - check_java_version - mvn_verify - check_middleware_api_versions @@ -147,7 +139,7 @@ jobs: executor: localstack/default steps: ## - localstack/startup - - install_java17 + - check_java_version - mvn_verify - check_middleware_api_versions - mvn_jar_deploy diff --git a/pom.xml b/pom.xml index a8d48433..a09cd325 100644 --- a/pom.xml +++ b/pom.xml @@ -249,25 +249,25 @@ echo " See also target/site/jacoco/index.html" echo " and https://www.jacoco.org/jacoco/trunk/doc/counters.html" echo "------------------------------------------------------------" -if which xpath > /dev/null 2>&1; then +# Parse Jacoco HTML coverage summary using grep and sed +if [ -f target/site/jacoco/index.html ]; then echo "Element\nInstructions Missed\nInstruction Coverage\nBranches Missed\nBranch Coverage\nComplexity Missed\nComplexity Hit\nLines Missed\nLines Hit\nMethods Missed\nMethods Hit\nClasses Missed\nClasses Hit\n" > /tmp/$$.headers - xpath -n -q -e '/html/body/table/tfoot/tr[1]/td/text()' target/site/jacoco/index.html > /tmp/$$.values + # Extract values from the footer row of the coverage table + grep -A 12 '' target/site/jacoco/index.html | grep '' | sed 's/\([^<]*\)<\/td>/\1/' | tr '\n' '\t' | sed 's/\t$/\n/' > /tmp/$$.values paste /tmp/$$.headers /tmp/$$.values | tail +2 | awk -v FS='\t' '{printf("%-20s %s\n",$1,$2)}' rm /tmp/$$.headers /tmp/$$.values else - echo "xpath is not installed. Jacoco coverage summary will not be produced here..."; + echo "Jacoco coverage summary could not be parsed..."; fi -if which html2text > /dev/null 2>&1; then - echo "Untested classes, per Jacoco:" - echo "-----------------------------" - for i in target/site/jacoco/*/index.html; do - html2text -width 500 -nobs $i | sed '1,/^Total/d;' | grep -v Created | sed 's/ \+/ /g' | sed 's/ [[:digit:]]$//' | grep -v 0$ | cut -d' ' -f1; - done; - echo -else - echo "html2text is not installed. Untested classes from Jacoco will not be printed here..."; -fi +echo "Untested classes, per Jacoco:" +echo "-----------------------------" +# Parse Jacoco XML reports directly to find classes with 0% coverage +find target/site/jacoco -name "jacoco.xml" -exec grep -l ' From 779dfd25d095a502dd76041b6392627179f008a6 Mon Sep 17 00:00:00 2001 From: Darin Kelkhoff Date: Wed, 2 Jul 2025 13:03:06 -0500 Subject: [PATCH 02/10] Cursor rewrite of store-artifacts/jacoco-site --- .circleci/config.yml | 35 +++-------------------------------- 1 file changed, 3 insertions(+), 32 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 952363a8..c2e70028 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -5,18 +5,6 @@ orbs: browser-tools: circleci/browser-tools@1.4.7 commands: - store_jacoco_site: - parameters: - module: - type: string - steps: - - store_artifacts: - path: << parameters.module >>/target/site/jacoco/index.html - when: always - - store_artifacts: - path: << parameters.module >>/target/site/jacoco/jacoco-resources - when: always - check_java_version: steps: - run: @@ -41,26 +29,9 @@ commands: name: Run Maven Verify command: | mvn -s .circleci/mvn-settings.xml -T4 verify - - store_jacoco_site: - module: qqq-backend-core - - store_jacoco_site: - module: qqq-backend-module-filesystem - - store_jacoco_site: - module: qqq-backend-module-rdbms - - store_jacoco_site: - module: qqq-backend-module-api - - store_jacoco_site: - module: qqq-middleware-api - - store_jacoco_site: - module: qqq-middleware-javalin - - store_jacoco_site: - module: qqq-middleware-picocli - - store_jacoco_site: - module: qqq-middleware-slack - - store_jacoco_site: - module: qqq-language-support-javascript - - store_jacoco_site: - module: qqq-sample-project + - store_artifacts: + path: "*/target/site/jacoco/" + when: always - run: name: Save test results command: | From 58dbcfd42bef07c4f86268407fd3cfacc8bfe3a0 Mon Sep 17 00:00:00 2001 From: Darin Kelkhoff Date: Wed, 2 Jul 2025 13:06:20 -0500 Subject: [PATCH 03/10] manual rewrite of jacoco summary reporting shell lines --- pom.xml | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/pom.xml b/pom.xml index a09cd325..a69a3ce8 100644 --- a/pom.xml +++ b/pom.xml @@ -251,22 +251,19 @@ echo "------------------------------------------------------------" # Parse Jacoco HTML coverage summary using grep and sed if [ -f target/site/jacoco/index.html ]; then - echo "Element\nInstructions Missed\nInstruction Coverage\nBranches Missed\nBranch Coverage\nComplexity Missed\nComplexity Hit\nLines Missed\nLines Hit\nMethods Missed\nMethods Hit\nClasses Missed\nClasses Hit\n" > /tmp/$$.headers + echo -e "Instructions Missed\nInstruction Coverage\nBranches Missed\nBranch Coverage\nComplexity Missed\nComplexity Hit\nLines Missed\nLines Hit\nMethods Missed\nMethods Hit\nClasses Missed\nClasses Hit\n" > /tmp/$$headers # Extract values from the footer row of the coverage table - grep -A 12 '' target/site/jacoco/index.html | grep '' | sed 's/\([^<]*\)<\/td>/\1/' | tr '\n' '\t' | sed 's/\t$/\n/' > /tmp/$$.values + sed 's/<\/\w\+>/&\n/g' target/site/jacoco/index.html | grep -A 12 '' | grep '\([^<]*\)<\/td>/\1/' | grep -v Total > /tmp/$$.values paste /tmp/$$.headers /tmp/$$.values | tail +2 | awk -v FS='\t' '{printf("%-20s %s\n",$1,$2)}' rm /tmp/$$.headers /tmp/$$.values else - echo "Jacoco coverage summary could not be parsed..."; + echo "Jacoco coverage summary was not found."; fi echo "Untested classes, per Jacoco:" echo "-----------------------------" # Parse Jacoco XML reports directly to find classes with 0% coverage -find target/site/jacoco -name "jacoco.xml" -exec grep -l '/&\n/g;s/<\/class>/&\n/g' target/site/jacoco/jacoco.xml | grep -v 'counter type="CLASS" missed="0"' | sed 's/>.*//;s/.*\///;s/".*//' echo ]]> From 04e64b04ab8df7bff4a9fa0c49138355a474de79 Mon Sep 17 00:00:00 2001 From: Darin Kelkhoff Date: Thu, 3 Jul 2025 13:08:53 -0500 Subject: [PATCH 04/10] test output updates: - by default, make tests put all their output into files (under target/surefire-reports/) - with system property -DtestOutputToFile=false to get all output on console; - have circleci store that output as artifacts; - run mvn in 'batch mode' in circleci, for quieter output (no download progress, no color codes) --- .circleci/config.yml | 53 ++++++++++++++++++++++++++++++++++++++++---- README.md | 14 ++++++++++++ pom.xml | 8 ++++--- 3 files changed, 68 insertions(+), 7 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index c2e70028..83312064 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -28,10 +28,55 @@ commands: - run: name: Run Maven Verify command: | - mvn -s .circleci/mvn-settings.xml -T4 verify + mvn -s .circleci/mvn-settings.xml -T4 --batch-mode verify - store_artifacts: path: "*/target/site/jacoco/" when: always + - store_artifacts: + path: "*/target/test-logs/" + when: always + - run: + name: Concatenate test output files + command: | + # Create artifacts directory + mkdir -p ~/test-output-artifacts/ + + # Find all module directories that have target/surefire-reports + for module_dir in */; do + if [ -d "${module_dir}target/surefire-reports" ]; then + module_name=$(basename "${module_dir%/}") + output_file="~/test-output-artifacts/${module_name}-test-output.txt" + + echo "Processing module: ${module_name}" + echo "Output file: ${output_file}" + + # Concatenate all .txt files in the surefire-reports directory + if [ -n "$(find "${module_dir}target/surefire-reports" -name "*.txt" -type f)" ]; then + echo "=== Test Output for ${module_name} ===" > "${output_file}" + echo "Generated at: $(date)" >> "${output_file}" + echo "==========================================" >> "${output_file}" + echo "" >> "${output_file}" + + # Sort files to ensure consistent ordering + find "${module_dir}target/surefire-reports" -name "*.txt" -type f | sort | while read -r txt_file; do + echo "--- File: $(basename "${txt_file}") ---" >> "${output_file}" + cat "${txt_file}" >> "${output_file}" + echo "" >> "${output_file}" + echo "--- End of $(basename "${txt_file}") ---" >> "${output_file}" + echo "" >> "${output_file}" + done + + echo "Concatenated test output for ${module_name} to ${output_file}" + else + echo "No .txt files found in ${module_dir}target/surefire-reports" + fi + fi + done + when: always + - store_artifacts: + path: ~/test-output-artifacts + destination: test-output + when: always - run: name: Save test results command: | @@ -54,8 +99,8 @@ commands: - run: name: Build and Run ValidateApiVersions command: | - mvn -s .circleci/mvn-settings.xml -T4 install -DskipTests - mvn -s .circleci/mvn-settings.xml -pl qqq-middleware-javalin package appassembler:assemble -DskipTests + mvn -s .circleci/mvn-settings.xml -T4 --batch-mode install -DskipTests + mvn -s .circleci/mvn-settings.xml -T4 --batch-mode -pl qqq-middleware-javalin package appassembler:assemble -DskipTests qqq-middleware-javalin/target/appassembler/bin/ValidateApiVersions -r $(pwd) mvn_jar_deploy: @@ -71,7 +116,7 @@ commands: - run: name: Run Maven Jar Deploy command: | - mvn -s .circleci/mvn-settings.xml -T4 flatten:flatten jar:jar deploy:deploy + mvn -s .circleci/mvn-settings.xml -T4 --batch-mode flatten:flatten jar:jar deploy:deploy - save_cache: paths: - ~/.m2 diff --git a/README.md b/README.md index 797f0e0b..8a810ee7 100644 --- a/README.md +++ b/README.md @@ -30,6 +30,20 @@ There are a few useful IntelliJ settings files, under `qqq-dev-tools/intellij`: One will likely also want the [Kingsrook Commentator Plugin](https://plugins.jetbrains.com/plugin/19325-kingsrook-commentator). +## Test Logging +By default, when ran from the command line, mvn surefire will make each test's +output (e.g., System.out, err, printStackTrace, and all logger calls) go into a +file under target/surefire-reports/${className}.txt. + +The system property `-DtestOutputToFile=false` can be given on the command line +to get all of this output on the console. + +In the IDE (e.g,. IntelliJ), output goes to the Console. + +In CircleCI, output goes to files, and those files are concatenated together and +stored as artifacts. + + ## License QQQ - Low-code Application Framework for Engineers. \ Copyright (C) 2020-2024. Kingsrook, LLC \ diff --git a/pom.xml b/pom.xml index a69a3ce8..291e05db 100644 --- a/pom.xml +++ b/pom.xml @@ -59,6 +59,7 @@ 0.80 0.95 none + true @@ -141,6 +142,8 @@ @{jaCoCoArgLine} + + ${testOutputToFile} @@ -249,10 +252,9 @@ echo " See also target/site/jacoco/index.html" echo " and https://www.jacoco.org/jacoco/trunk/doc/counters.html" echo "------------------------------------------------------------" -# Parse Jacoco HTML coverage summary using grep and sed +# Parse Jacoco HTML coverage summary if [ -f target/site/jacoco/index.html ]; then - echo -e "Instructions Missed\nInstruction Coverage\nBranches Missed\nBranch Coverage\nComplexity Missed\nComplexity Hit\nLines Missed\nLines Hit\nMethods Missed\nMethods Hit\nClasses Missed\nClasses Hit\n" > /tmp/$$headers - # Extract values from the footer row of the coverage table + echo -e "Instructions Missed\nInstruction Coverage\nBranches Missed\nBranch Coverage\nComplexity Missed\nComplexity Hit\nLines Missed\nLines Hit\nMethods Missed\nMethods Hit\nClasses Missed\nClasses Hit\n" > /tmp/$$.headers sed 's/<\/\w\+>/&\n/g' target/site/jacoco/index.html | grep -A 12 '' | grep '\([^<]*\)<\/td>/\1/' | grep -v Total > /tmp/$$.values paste /tmp/$$.headers /tmp/$$.values | tail +2 | awk -v FS='\t' '{printf("%-20s %s\n",$1,$2)}' rm /tmp/$$.headers /tmp/$$.values From fc6f7b084dd7bfd96632eeb0e4e6001d0df94d72 Mon Sep 17 00:00:00 2001 From: Darin Kelkhoff Date: Thu, 3 Jul 2025 14:48:52 -0500 Subject: [PATCH 05/10] Enhance Jacoco coverage summary output to include module name and improve readability with additional separators. --- pom.xml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 291e05db..0f55dd18 100644 --- a/pom.xml +++ b/pom.xml @@ -247,7 +247,7 @@ if [ ! -e target/site/jacoco/index.html ]; then fi echo -echo "Jacoco coverage summary report:" +echo "Jacoco coverage summary report for module: ${project.artifactId}" echo " See also target/site/jacoco/index.html" echo " and https://www.jacoco.org/jacoco/trunk/doc/counters.html" echo "------------------------------------------------------------" @@ -261,11 +261,14 @@ if [ -f target/site/jacoco/index.html ]; then else echo "Jacoco coverage summary was not found."; fi +echo "-----------------------------" +echo -echo "Untested classes, per Jacoco:" +echo "Untested classes, per Jacoco for module: ${project.artifactId}" echo "-----------------------------" # Parse Jacoco XML reports directly to find classes with 0% coverage sed 's//&\n/g;s/<\/class>/&\n/g' target/site/jacoco/jacoco.xml | grep -v 'counter type="CLASS" missed="0"' | sed 's/>.*//;s/.*\///;s/".*//' +echo "-----------------------------" echo ]]> From 171c73c4e4837a930e0fe779e01629bdd0ff7032 Mon Sep 17 00:00:00 2001 From: Darin Kelkhoff Date: Thu, 3 Jul 2025 14:49:17 -0500 Subject: [PATCH 06/10] Update CircleCI configuration to use absolute paths for test output artifacts --- .circleci/config.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 83312064..1a02379d 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -39,13 +39,13 @@ commands: name: Concatenate test output files command: | # Create artifacts directory - mkdir -p ~/test-output-artifacts/ + mkdir -p /home/circleci/test-output-artifacts/ # Find all module directories that have target/surefire-reports for module_dir in */; do if [ -d "${module_dir}target/surefire-reports" ]; then module_name=$(basename "${module_dir%/}") - output_file="~/test-output-artifacts/${module_name}-test-output.txt" + output_file="/home/circleci/test-output-artifacts/${module_name}-test-output.txt" echo "Processing module: ${module_name}" echo "Output file: ${output_file}" @@ -74,7 +74,7 @@ commands: done when: always - store_artifacts: - path: ~/test-output-artifacts + path: /home/circleci/test-output-artifacts destination: test-output when: always - run: From 7b2b1814272282b01398f83bb9fb8c45ebf1f812 Mon Sep 17 00:00:00 2001 From: Darin Kelkhoff Date: Thu, 3 Jul 2025 15:03:25 -0500 Subject: [PATCH 07/10] split mvn verify into mvn build (which will have lots of output about downloading deps) and mvn test, to run tests (moving to test goal instead of verify, since we don't have any int-tests that would run in a verify, and we don't really need to do a packge) --- .circleci/config.yml | 33 ++++++++++++++++++++++++--------- 1 file changed, 24 insertions(+), 9 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 1a02379d..a9ddd154 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -13,7 +13,7 @@ commands: java -version echo "Java version check completed" - mvn_verify: + mvn_build: steps: - checkout - restore_cache: @@ -26,9 +26,24 @@ commands: command: | echo "RDBMS_PASSWORD=$RDBMS_PASSWORD" >> qqq-sample-project/.env - run: - name: Run Maven Verify + name: Run Maven Compile command: | - mvn -s .circleci/mvn-settings.xml -T4 --batch-mode verify + mvn -s .circleci/mvn-settings.xml -T4 --batch-mode compile + - save_cache: + paths: + - ~/.m2 + key: v1-dependencies-{{ checksum "pom.xml" }} + + mvn_test: + steps: + - checkout + - restore_cache: + keys: + - v1-dependencies-{{ checksum "pom.xml" }} + - run: + name: Run Maven Test + command: | + mvn -s .circleci/mvn-settings.xml -T4 --batch-mode test - store_artifacts: path: "*/target/site/jacoco/" when: always @@ -64,6 +79,8 @@ commands: echo "" >> "${output_file}" echo "--- End of $(basename "${txt_file}") ---" >> "${output_file}" echo "" >> "${output_file}" + echo "" >> "${output_file}" + echo "" >> "${output_file}" done echo "Concatenated test output for ${module_name} to ${output_file}" @@ -85,10 +102,6 @@ commands: when: always - store_test_results: path: ~/test-results - - save_cache: - paths: - - ~/.m2 - key: v1-dependencies-{{ checksum "pom.xml" }} check_middleware_api_versions: steps: @@ -148,7 +161,8 @@ jobs: steps: ## - localstack/startup - check_java_version - - mvn_verify + - mvn_build + - mvn_test - check_middleware_api_versions mvn_deploy: @@ -156,7 +170,8 @@ jobs: steps: ## - localstack/startup - check_java_version - - mvn_verify + - mvn_build + - mvn_test - check_middleware_api_versions - mvn_jar_deploy From 14a3dad3c879ecf5083b2751c1a541f151d88c43 Mon Sep 17 00:00:00 2001 From: Darin Kelkhoff Date: Thu, 3 Jul 2025 15:13:15 -0500 Subject: [PATCH 08/10] Refactor CircleCI config to run tests and API version checks in parallel - Split mvn_test job into separate build, test, and api_version_check jobs - Run test and api_version_check in parallel after build completes - Both parallel jobs use compiled outputs from build via Maven cache - Remove unnecessary check_java_version steps - Remove unused test-logs artifact storage - Add jacoco:report to generate coverage reports - Maintain sequential execution in mvn_deploy job --- .circleci/config.yml | 47 +++++++++++++++++++++++++++----------------- 1 file changed, 29 insertions(+), 18 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index a9ddd154..cf61ae84 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -5,14 +5,6 @@ orbs: browser-tools: circleci/browser-tools@1.4.7 commands: - check_java_version: - steps: - - run: - name: Check Java Version - command: | - java -version - echo "Java version check completed" - mvn_build: steps: - checkout @@ -43,13 +35,10 @@ commands: - run: name: Run Maven Test command: | - mvn -s .circleci/mvn-settings.xml -T4 --batch-mode test + mvn -s .circleci/mvn-settings.xml -T4 --batch-mode test jacoco:report - store_artifacts: path: "*/target/site/jacoco/" when: always - - store_artifacts: - path: "*/target/test-logs/" - when: always - run: name: Concatenate test output files command: | @@ -156,20 +145,24 @@ commands: when: always jobs: - mvn_test: + build: executor: localstack/default steps: - ## - localstack/startup - - check_java_version - mvn_build + + test: + executor: localstack/default + steps: - mvn_test + + api_version_check: + executor: localstack/default + steps: - check_middleware_api_versions mvn_deploy: executor: localstack/default steps: - ## - localstack/startup - - check_java_version - mvn_build - mvn_test - check_middleware_api_versions @@ -184,13 +177,31 @@ jobs: workflows: test_only: jobs: - - mvn_test: + - build: context: [ qqq-maven-registry-credentials, build-qqq-sample-app ] filters: branches: ignore: /(dev|integration.*)/ tags: ignore: /(version|snapshot)-.*/ + - test: + context: [ qqq-maven-registry-credentials, build-qqq-sample-app ] + requires: + - build + filters: + branches: + ignore: /(dev|integration.*)/ + tags: + ignore: /(version|snapshot)-.*/ + - api_version_check: + context: [ qqq-maven-registry-credentials, build-qqq-sample-app ] + requires: + - build + filters: + branches: + ignore: /(dev|integration.*)/ + tags: + ignore: /(version|snapshot)-.*/ deploy: jobs: From 0aaf1849621486fed82296c02b90834e3a7ab60b Mon Sep 17 00:00:00 2001 From: Darin Kelkhoff Date: Thu, 3 Jul 2025 15:24:54 -0500 Subject: [PATCH 09/10] move concatenate-test-output to its own script; switch back to verify, so we get jacoco reports; switch to no-tranffer-progress from batch-mode, so we still get color output --- .circleci/concatenate-test-output.sh | 48 +++++++++++++++++++++++ .circleci/config.yml | 57 ++++++---------------------- 2 files changed, 59 insertions(+), 46 deletions(-) create mode 100755 .circleci/concatenate-test-output.sh diff --git a/.circleci/concatenate-test-output.sh b/.circleci/concatenate-test-output.sh new file mode 100755 index 00000000..e86efd8e --- /dev/null +++ b/.circleci/concatenate-test-output.sh @@ -0,0 +1,48 @@ +#!/bin/bash + +############################################################################ +## Script to concatenate all .txt files in the surefire-reports directory +## into a single artifact that can be stored in CI. +############################################################################ + +mkdir -p /home/circleci/test-output-artifacts/ + +################################################################### +## Find all module directories that have target/surefire-reports ## +################################################################### +for module_dir in */; do + if [ -d "${module_dir}target/surefire-reports" ]; then + module_name=$(basename "${module_dir%/}") + output_file="/home/circleci/test-output-artifacts/${module_name}-test-output.txt" + + echo "Processing module: ${module_name}" + echo "Output file: ${output_file}" + + ################################################################## + ## Concatenate all .txt files in the surefire-reports directory ## + ################################################################## + if [ -n "$(find "${module_dir}target/surefire-reports" -name "*.txt" -type f)" ]; then + echo "=== Test Output for ${module_name} ===" > "${output_file}" + echo "Generated at: $(date)" >> "${output_file}" + echo "==========================================" >> "${output_file}" + echo "" >> "${output_file}" + + ############################################## + ## Sort files to ensure consistent ordering ## + ############################################## + find "${module_dir}target/surefire-reports" -name "*.txt" -type f | sort | while read -r txt_file; do + echo "--- File: $(basename "${txt_file}") ---" >> "${output_file}" + cat "${txt_file}" >> "${output_file}" + echo "" >> "${output_file}" + echo "--- End of $(basename "${txt_file}") ---" >> "${output_file}" + echo "" >> "${output_file}" + echo "" >> "${output_file}" + echo "" >> "${output_file}" + done + + echo "Concatenated test output for ${module_name} to ${output_file}" + else + echo "No .txt files found in ${module_dir}target/surefire-reports" + fi + fi +done \ No newline at end of file diff --git a/.circleci/config.yml b/.circleci/config.yml index cf61ae84..a50edc3a 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -20,64 +20,29 @@ commands: - run: name: Run Maven Compile command: | - mvn -s .circleci/mvn-settings.xml -T4 --batch-mode compile + mvn -s .circleci/mvn-settings.xml -T4 --no-transfer-progress compile - save_cache: paths: - ~/.m2 key: v1-dependencies-{{ checksum "pom.xml" }} - mvn_test: + mvn_verify: steps: - checkout - restore_cache: keys: - v1-dependencies-{{ checksum "pom.xml" }} - run: - name: Run Maven Test + name: Run Maven Verify command: | - mvn -s .circleci/mvn-settings.xml -T4 --batch-mode test jacoco:report + mvn -s .circleci/mvn-settings.xml -T4 --no-transfer-progress verify - store_artifacts: + name: Store Jacoco reports path: "*/target/site/jacoco/" when: always - run: name: Concatenate test output files - command: | - # Create artifacts directory - mkdir -p /home/circleci/test-output-artifacts/ - - # Find all module directories that have target/surefire-reports - for module_dir in */; do - if [ -d "${module_dir}target/surefire-reports" ]; then - module_name=$(basename "${module_dir%/}") - output_file="/home/circleci/test-output-artifacts/${module_name}-test-output.txt" - - echo "Processing module: ${module_name}" - echo "Output file: ${output_file}" - - # Concatenate all .txt files in the surefire-reports directory - if [ -n "$(find "${module_dir}target/surefire-reports" -name "*.txt" -type f)" ]; then - echo "=== Test Output for ${module_name} ===" > "${output_file}" - echo "Generated at: $(date)" >> "${output_file}" - echo "==========================================" >> "${output_file}" - echo "" >> "${output_file}" - - # Sort files to ensure consistent ordering - find "${module_dir}target/surefire-reports" -name "*.txt" -type f | sort | while read -r txt_file; do - echo "--- File: $(basename "${txt_file}") ---" >> "${output_file}" - cat "${txt_file}" >> "${output_file}" - echo "" >> "${output_file}" - echo "--- End of $(basename "${txt_file}") ---" >> "${output_file}" - echo "" >> "${output_file}" - echo "" >> "${output_file}" - echo "" >> "${output_file}" - done - - echo "Concatenated test output for ${module_name} to ${output_file}" - else - echo "No .txt files found in ${module_dir}target/surefire-reports" - fi - fi - done + command: .circleci/concatenate-test-output.sh when: always - store_artifacts: path: /home/circleci/test-output-artifacts @@ -101,8 +66,8 @@ commands: - run: name: Build and Run ValidateApiVersions command: | - mvn -s .circleci/mvn-settings.xml -T4 --batch-mode install -DskipTests - mvn -s .circleci/mvn-settings.xml -T4 --batch-mode -pl qqq-middleware-javalin package appassembler:assemble -DskipTests + mvn -s .circleci/mvn-settings.xml -T4 --no-transfer-progress install -DskipTests + mvn -s .circleci/mvn-settings.xml -T4 --no-transfer-progress -pl qqq-middleware-javalin package appassembler:assemble -DskipTests qqq-middleware-javalin/target/appassembler/bin/ValidateApiVersions -r $(pwd) mvn_jar_deploy: @@ -118,7 +83,7 @@ commands: - run: name: Run Maven Jar Deploy command: | - mvn -s .circleci/mvn-settings.xml -T4 --batch-mode flatten:flatten jar:jar deploy:deploy + mvn -s .circleci/mvn-settings.xml -T4 --no-transfer-progress flatten:flatten jar:jar deploy:deploy - save_cache: paths: - ~/.m2 @@ -153,7 +118,7 @@ jobs: test: executor: localstack/default steps: - - mvn_test + - mvn_verify api_version_check: executor: localstack/default @@ -164,7 +129,7 @@ jobs: executor: localstack/default steps: - mvn_build - - mvn_test + - mvn_verify - check_middleware_api_versions - mvn_jar_deploy From 8531feef70bbb3a8d2924407f3c5034e91fc9897 Mon Sep 17 00:00:00 2001 From: Darin Kelkhoff Date: Thu, 3 Jul 2025 15:41:09 -0500 Subject: [PATCH 10/10] Add script to collect JaCoCo reports and update CircleCI config to use it --- .circleci/collect-jacoco-reports.sh | 26 ++++++++++++++++++++++++++ .circleci/config.yml | 8 ++++++-- 2 files changed, 32 insertions(+), 2 deletions(-) create mode 100755 .circleci/collect-jacoco-reports.sh diff --git a/.circleci/collect-jacoco-reports.sh b/.circleci/collect-jacoco-reports.sh new file mode 100755 index 00000000..dca6bbad --- /dev/null +++ b/.circleci/collect-jacoco-reports.sh @@ -0,0 +1,26 @@ +#!/bin/bash + +############################################################################ +## Script to collect all JaCoCo reports from different modules into a +## single directory for easier artifact storage in CI. +############################################################################ + +mkdir -p /home/circleci/jacoco-reports/ + +############################################################## +## Find all module directories that have target/site/jacoco ## +############################################################## +for module_dir in */; do + if [ -d "${module_dir}target/site/jacoco" ]; then + module_name=$(basename "${module_dir%/}") + target_dir="/home/circleci/jacoco-reports/${module_name}" + + echo "Collecting JaCoCo reports for module: ${module_name}" + + cp -r "${module_dir}target/site/jacoco" "${target_dir}" + + echo "Copied JaCoCo reports for ${module_name} to ${target_dir}" + fi +done + +echo "All JaCoCo reports collected to /home/circleci/jacoco-reports/" \ No newline at end of file diff --git a/.circleci/config.yml b/.circleci/config.yml index a50edc3a..748c1a64 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -36,9 +36,13 @@ commands: name: Run Maven Verify command: | mvn -s .circleci/mvn-settings.xml -T4 --no-transfer-progress verify + - run: + name: Collect JaCoCo reports + command: .circleci/collect-jacoco-reports.sh + when: always - store_artifacts: - name: Store Jacoco reports - path: "*/target/site/jacoco/" + path: /home/circleci/jacoco-reports + destination: jacoco-reports when: always - run: name: Concatenate test output files