From 8d19b70aa83e5484ae9a7d1e1754547c79a4fab3 Mon Sep 17 00:00:00 2001 From: Trask Stalnaker Date: Mon, 7 Jul 2025 08:25:37 -0700 Subject: [PATCH 1/7] Faster smoke tests --- .github/workflows/build-common.yml | 44 ++++++++++++++++++++++++++---- 1 file changed, 39 insertions(+), 5 deletions(-) diff --git a/.github/workflows/build-common.yml b/.github/workflows/build-common.yml index 06de7ee4a91..3596c0df351 100644 --- a/.github/workflows/build-common.yml +++ b/.github/workflows/build-common.yml @@ -196,9 +196,27 @@ jobs: - id: set-matrix run: | - modules=$(ls -d smoke-tests/apps/* | sed 's/\/$//' | sed 's/\//:/g' | sed 's/^/:/') - inner_json=$(echo $modules | xargs echo | sed 's/ /","/g') - echo "matrix={\"module\":[\"$inner_json\"]}" >> $GITHUB_OUTPUT + # Find all smoke test files and create matrix entries + tests=$( + for module_dir in smoke-tests/apps/*/; do + module=$(echo "$module_dir" | sed 's|/$||' | sed 's|/|:|g') + find "${module_dir}src/smokeTest/java" -name "*Test.java" -type f | \ + sed "s|${module_dir}src/smokeTest/java/||" | \ + sed 's|/|.|g' | \ + sed 's|\.java$||' | \ + sed "s|^|${module}:|" + done + ) + + if [ -n "$tests" ]; then + # Convert to JSON array + json_array=$(echo "$tests" | sed 's/.*/"&"/' | tr '\n' ',' | sed 's/,$//') + echo "matrix={\"test\":[$json_array]}" >> $GITHUB_OUTPUT + echo "Generated matrix with $(echo "$tests" | wc -l) test entries" + else + echo "matrix={\"test\":[]}" >> $GITHUB_OUTPUT + echo "No test entries found" + fi smoke-test: needs: setup-smoke-test-matrix @@ -225,13 +243,29 @@ jobs: - name: Setup Gradle uses: gradle/actions/setup-gradle@v4 + - name: Extract module and test class + run: | + # Split the test entry into module and test class + # Format is ":smoke-tests:apps:ModuleName:com.package.TestClass" + test_entry="${{ matrix.test }}" + # Extract everything before the last colon as the module + module="${test_entry%:*}" + # Extract everything after the last colon as the test class + test_class="${test_entry##*:}" + echo "MODULE=${module}" >> $GITHUB_ENV + echo "TEST_CLASS=${test_class}" >> $GITHUB_ENV + - name: Test - run: ./gradlew ${{ matrix.module }}:smokeTest + run: ./gradlew ${{ env.MODULE }}:smokeTest --tests "${{ env.TEST_CLASS }}" - name: Create unique artifact name if: failure() run: | - echo "UPLOAD_ARTIFACT_NAME=${{ matrix.module }}" | sed 's/:/-/g' >> $GITHUB_ENV + # Create a unique name based on module and test class + artifact_name="${{ env.MODULE }}:${{ env.TEST_CLASS }}" + # Replace colons and dots with hyphens for valid artifact names + artifact_name=$(echo "$artifact_name" | sed 's/[:.]/\-/g') + echo "UPLOAD_ARTIFACT_NAME=$artifact_name" >> $GITHUB_ENV - name: Upload smoke test reports uses: actions/upload-artifact@v4 From 8d51346cbd116a89687e4100647f850d5244633e Mon Sep 17 00:00:00 2001 From: Trask Stalnaker Date: Mon, 7 Jul 2025 08:44:33 -0700 Subject: [PATCH 2/7] fix --- .github/workflows/build-common.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-common.yml b/.github/workflows/build-common.yml index 3596c0df351..92732a440ce 100644 --- a/.github/workflows/build-common.yml +++ b/.github/workflows/build-common.yml @@ -256,7 +256,7 @@ jobs: echo "TEST_CLASS=${test_class}" >> $GITHUB_ENV - name: Test - run: ./gradlew ${{ env.MODULE }}:smokeTest --tests "${{ env.TEST_CLASS }}" + run: ./gradlew ${{ env.MODULE }}:smokeTest --tests "${{ env.TEST_CLASS }}*" - name: Create unique artifact name if: failure() From da371d8ff4489073428198b45e01577adbe28239 Mon Sep 17 00:00:00 2001 From: Trask Stalnaker Date: Mon, 7 Jul 2025 10:42:10 -0700 Subject: [PATCH 3/7] shorter job name --- .github/workflows/build-common.yml | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/.github/workflows/build-common.yml b/.github/workflows/build-common.yml index 92732a440ce..84e5388b74c 100644 --- a/.github/workflows/build-common.yml +++ b/.github/workflows/build-common.yml @@ -197,28 +197,30 @@ jobs: - id: set-matrix run: | # Find all smoke test files and create matrix entries - tests=$( + json_array=$( for module_dir in smoke-tests/apps/*/; do module=$(echo "$module_dir" | sed 's|/$||' | sed 's|/|:|g') + module_name=$(echo "$module" | sed 's|.*:||') find "${module_dir}src/smokeTest/java" -name "*Test.java" -type f | \ sed "s|${module_dir}src/smokeTest/java/||" | \ sed 's|/|.|g' | \ sed 's|\.java$||' | \ - sed "s|^|${module}:|" - done + while read -r full_class; do + echo "{\"test\":\"${module}:${full_class}\",\"display\":\"${module_name}:${full_class##*.}\"}" + done + done | tr '\n' ',' | sed 's/,$//' ) - if [ -n "$tests" ]; then - # Convert to JSON array - json_array=$(echo "$tests" | sed 's/.*/"&"/' | tr '\n' ',' | sed 's/,$//') - echo "matrix={\"test\":[$json_array]}" >> $GITHUB_OUTPUT - echo "Generated matrix with $(echo "$tests" | wc -l) test entries" + if [ -n "$json_array" ]; then + echo "matrix={\"include\":[$json_array]}" >> $GITHUB_OUTPUT + echo "Generated matrix with $(echo "$json_array" | tr ',' '\n' | wc -l) test entries" else - echo "matrix={\"test\":[]}" >> $GITHUB_OUTPUT + echo "matrix={\"include\":[]}" >> $GITHUB_OUTPUT echo "No test entries found" fi smoke-test: + name: ${{ matrix.display }} needs: setup-smoke-test-matrix runs-on: ubuntu-latest strategy: From 08144cac629a7ec8d2434a8b0840043bef6c1393 Mon Sep 17 00:00:00 2001 From: Trask Stalnaker Date: Mon, 7 Jul 2025 10:49:59 -0700 Subject: [PATCH 4/7] simplify --- .github/workflows/build-common.yml | 18 +++--------------- 1 file changed, 3 insertions(+), 15 deletions(-) diff --git a/.github/workflows/build-common.yml b/.github/workflows/build-common.yml index 84e5388b74c..7abc9e59769 100644 --- a/.github/workflows/build-common.yml +++ b/.github/workflows/build-common.yml @@ -206,7 +206,7 @@ jobs: sed 's|/|.|g' | \ sed 's|\.java$||' | \ while read -r full_class; do - echo "{\"test\":\"${module}:${full_class}\",\"display\":\"${module_name}:${full_class##*.}\"}" + echo "{\"test\":\"${module}:${full_class}\",\"display\":\"${module_name}:${full_class##*.}\",\"module\":\"${module}\",\"test_class\":\"${full_class}\"}" done done | tr '\n' ',' | sed 's/,$//' ) @@ -245,26 +245,14 @@ jobs: - name: Setup Gradle uses: gradle/actions/setup-gradle@v4 - - name: Extract module and test class - run: | - # Split the test entry into module and test class - # Format is ":smoke-tests:apps:ModuleName:com.package.TestClass" - test_entry="${{ matrix.test }}" - # Extract everything before the last colon as the module - module="${test_entry%:*}" - # Extract everything after the last colon as the test class - test_class="${test_entry##*:}" - echo "MODULE=${module}" >> $GITHUB_ENV - echo "TEST_CLASS=${test_class}" >> $GITHUB_ENV - - name: Test - run: ./gradlew ${{ env.MODULE }}:smokeTest --tests "${{ env.TEST_CLASS }}*" + run: ./gradlew ${{ matrix.module }}:smokeTest --tests "${{ matrix.test_class }}*" - name: Create unique artifact name if: failure() run: | # Create a unique name based on module and test class - artifact_name="${{ env.MODULE }}:${{ env.TEST_CLASS }}" + artifact_name="${{ matrix.module }}:${{ matrix.test_class }}" # Replace colons and dots with hyphens for valid artifact names artifact_name=$(echo "$artifact_name" | sed 's/[:.]/\-/g') echo "UPLOAD_ARTIFACT_NAME=$artifact_name" >> $GITHUB_ENV From 0098cde0457d1adc0c6f46f66f85951c13a6a6e2 Mon Sep 17 00:00:00 2001 From: Trask Stalnaker Date: Mon, 7 Jul 2025 10:51:29 -0700 Subject: [PATCH 5/7] unused --- .github/workflows/build-common.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-common.yml b/.github/workflows/build-common.yml index 7abc9e59769..67df88bcbaa 100644 --- a/.github/workflows/build-common.yml +++ b/.github/workflows/build-common.yml @@ -206,7 +206,7 @@ jobs: sed 's|/|.|g' | \ sed 's|\.java$||' | \ while read -r full_class; do - echo "{\"test\":\"${module}:${full_class}\",\"display\":\"${module_name}:${full_class##*.}\",\"module\":\"${module}\",\"test_class\":\"${full_class}\"}" + echo "{\"display\":\"${module_name}:${full_class##*.}\",\"module\":\"${module}\",\"test_class\":\"${full_class}\"}" done done | tr '\n' ',' | sed 's/,$//' ) From 599efe281cffe6eb664611088e82e3735f68e6dd Mon Sep 17 00:00:00 2001 From: Trask Stalnaker Date: Mon, 7 Jul 2025 11:09:21 -0700 Subject: [PATCH 6/7] comments --- .github/workflows/build-common.yml | 34 ++++++++++++++++++------------ 1 file changed, 21 insertions(+), 13 deletions(-) diff --git a/.github/workflows/build-common.yml b/.github/workflows/build-common.yml index 67df88bcbaa..9c46d57d35e 100644 --- a/.github/workflows/build-common.yml +++ b/.github/workflows/build-common.yml @@ -196,28 +196,36 @@ jobs: - id: set-matrix run: | - # Find all smoke test files and create matrix entries json_array=$( for module_dir in smoke-tests/apps/*/; do + # Convert directory path to module name (e.g., "smoke-tests/apps/MyApp/" -> "smoke-tests:apps:MyApp") module=$(echo "$module_dir" | sed 's|/$||' | sed 's|/|:|g') + # Extract just the app name from the module path (e.g., "smoke-tests:apps:MyApp" -> "MyApp") module_name=$(echo "$module" | sed 's|.*:||') - find "${module_dir}src/smokeTest/java" -name "*Test.java" -type f | \ + + find "${module_dir}src/smokeTest/java" -name "*Test.java" | \ + # Remove the base path to get relative path from smokeTest/java sed "s|${module_dir}src/smokeTest/java/||" | \ - sed 's|/|.|g' | \ - sed 's|\.java$||' | \ - while read -r full_class; do - echo "{\"display\":\"${module_name}:${full_class##*.}\",\"module\":\"${module}\",\"test_class\":\"${full_class}\"}" + # Convert file name to class name (e.g., "com/example/MyTest.java" -> "com.example.MyTest") + sed 's|/|.|g' | sed 's|\.java$||' | \ + # Process each fully qualified test class name + while read -r class_name; do + # Extract just the simple class name (e.g., "com.example.MyTest" -> "MyTest") + short_name=$(echo "$class_name" | sed 's/.*\.//') + # Create JSON object for each test with: + # - display: human-readable name (AppName:TestClassName) + # - module: gradle module path for running the test + # - test_class: full qualified class name for --tests parameter + echo "{\"display\":\"${module_name}:${short_name}\"," \ + "\"module\":\"${module}\"," \ + "\"test_class\":\"${class_name}\"}" done + # Join all JSON objects with commas and remove trailing comma done | tr '\n' ',' | sed 's/,$//' ) - if [ -n "$json_array" ]; then - echo "matrix={\"include\":[$json_array]}" >> $GITHUB_OUTPUT - echo "Generated matrix with $(echo "$json_array" | tr ',' '\n' | wc -l) test entries" - else - echo "matrix={\"include\":[]}" >> $GITHUB_OUTPUT - echo "No test entries found" - fi + # Output the matrix in GitHub Actions format + echo "matrix={\"include\":[$json_array]}" >> $GITHUB_OUTPUT smoke-test: name: ${{ matrix.display }} From 6ddfe0520a80789bdf2589e1e5627c3437ea1877 Mon Sep 17 00:00:00 2001 From: Trask Stalnaker Date: Mon, 7 Jul 2025 11:16:19 -0700 Subject: [PATCH 7/7] naming --- .github/workflows/build-common.yml | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/.github/workflows/build-common.yml b/.github/workflows/build-common.yml index 9c46d57d35e..c0231496b3c 100644 --- a/.github/workflows/build-common.yml +++ b/.github/workflows/build-common.yml @@ -197,26 +197,22 @@ jobs: - id: set-matrix run: | json_array=$( - for module_dir in smoke-tests/apps/*/; do - # Convert directory path to module name (e.g., "smoke-tests/apps/MyApp/" -> "smoke-tests:apps:MyApp") - module=$(echo "$module_dir" | sed 's|/$||' | sed 's|/|:|g') + for dir in smoke-tests/apps/*; do + # Convert directory path to module name (e.g., "smoke-tests/apps/MyApp" -> "smoke-tests:apps:MyApp") + module=$(echo "$dir" | sed 's|/|:|g') # Extract just the app name from the module path (e.g., "smoke-tests:apps:MyApp" -> "MyApp") - module_name=$(echo "$module" | sed 's|.*:||') + module_short=$(echo "$module" | sed 's|.*:||') - find "${module_dir}src/smokeTest/java" -name "*Test.java" | \ + find "${dir}/src/smokeTest/java" -name "*Test.java" | \ # Remove the base path to get relative path from smokeTest/java - sed "s|${module_dir}src/smokeTest/java/||" | \ + sed "s|${dir}/src/smokeTest/java/||" | \ # Convert file name to class name (e.g., "com/example/MyTest.java" -> "com.example.MyTest") sed 's|/|.|g' | sed 's|\.java$||' | \ # Process each fully qualified test class name while read -r class_name; do # Extract just the simple class name (e.g., "com.example.MyTest" -> "MyTest") - short_name=$(echo "$class_name" | sed 's/.*\.//') - # Create JSON object for each test with: - # - display: human-readable name (AppName:TestClassName) - # - module: gradle module path for running the test - # - test_class: full qualified class name for --tests parameter - echo "{\"display\":\"${module_name}:${short_name}\"," \ + class_short=$(echo "$class_name" | sed 's/.*\.//') + echo "{\"display\":\"${module_short}:${class_short}\"," \ "\"module\":\"${module}\"," \ "\"test_class\":\"${class_name}\"}" done