This is an automated email from the ASF dual-hosted git repository.

lewismc pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nutch.git


The following commit(s) were added to refs/heads/master by this push:
     new ee2a286d1 NUTCH-3186 Split SonarQube workflow in unprivileged build 
and privileged analysis part (#940)
ee2a286d1 is described below

commit ee2a286d1d63e66ae5e9fee6aa05b13544eb823e
Author: Sebastian Nagel <[email protected]>
AuthorDate: Sun Jul 19 21:53:29 2026 +0200

    NUTCH-3186 Split SonarQube workflow in unprivileged build and privileged 
analysis part (#940)
    
    * NUTCH-3186 Split SonarQube workflow in unprivileged build and privileged 
analysis part
    
    - Cache / upload in master / PR ci build:
      - build artifacts (class files and dependency jars)
      - coverage reports
    - Do not run builds or tests in "sonarcloud" workflow
    - Download cached artifacts and call Sonarcloud scan
    - Do not clean before running integration tests (protocol and indexer)
      to avoid that test results are removed
    
    * NUTCH-3186 Split SonarQube workflow in unprivileged build and privileged 
analysis part
    
    - Fix yamllint error
    
    * NUTCH-3186 Split SonarQube workflow in unprivileged build and privileged 
analysis part
    
    - Allow checkout on PR branch in sonarcloud workflow
    
    * NUTCH-3186 Split SonarQube workflow in unprivileged build and privileged 
analysis part
    
    - Fix yamllint error
---
 .github/workflows/master-build.yml | 25 +++++++++++++++++--
 .github/workflows/sonarcloud.yml   | 49 +++++++++++++++++++++++++-------------
 2 files changed, 55 insertions(+), 19 deletions(-)

diff --git a/.github/workflows/master-build.yml 
b/.github/workflows/master-build.yml
index ec6fdc966..5e6b0302a 100644
--- a/.github/workflows/master-build.yml
+++ b/.github/workflows/master-build.yml
@@ -25,6 +25,10 @@ concurrency:
   group: master-build-${{ github.ref }}
   cancel-in-progress: true
 
+# Explicitly drop all permissions.
+# Permissions will be granted to individual jobs as needed.
+permissions: {}
+
 # Java Version Strategy:
 # - Requires Java 17+ to build, test, and run (Hadoop 3.5+ client + JUnit 6).
 # - Default bytecode: javac.version=17 (see default.properties).
@@ -247,11 +251,14 @@ jobs:
       # run indexer integration tests when indexer plugin files change (Docker 
required, ubuntu-latest only)
       - name: test indexer integration
         if: ${{ steps.filter.outputs.indexer_plugins == 'true' && matrix.os == 
'ubuntu-latest' }}
-        run: ant clean test-indexer-integration -buildfile build.xml
+        run: ant test-indexer-integration -buildfile build.xml
       # run protocol integration tests when protocol plugin files change 
(Docker required, ubuntu-latest only)
       - name: test protocol integration
         if: ${{ steps.filter.outputs.protocol_plugins == 'true' && matrix.os 
== 'ubuntu-latest' }}
-        run: ant clean test-protocol-integration -buildfile build.xml
+        run: ant test-protocol-integration -buildfile build.xml
+      - name: Generate JaCoCo XML report
+        run: ant jacoco-report -buildfile build.xml
+        continue-on-error: true
       - name: Check for test results
         id: check_tests
         if: always() && matrix.os == 'ubuntu-latest'
@@ -263,6 +270,20 @@ jobs:
           else
             echo "has_results=false" >> $GITHUB_OUTPUT
           fi
+      - name: Upload Build and Test Artifacts (Binaries)
+        uses: actions/upload-artifact@v7
+        if: always() && matrix.os == 'ubuntu-latest' && matrix.java == '17' && 
steps.check_tests.outputs.has_results == 'true'
+        with:
+          name: build-artifacts-${{ matrix.os }}-jdk${{ matrix.java }}
+          path: |
+            # core class files
+            ./build/classes/**/*.class
+            # plugin and test class files
+            ./build/**/classes/**/*.class
+            # dependencies
+            ./build/lib/*.jar
+            ./build/test/lib/*.jar
+          retention-days: 1
       - name: Upload Test Report
         uses: actions/upload-artifact@v7
         if: always() && matrix.os == 'ubuntu-latest' && matrix.java == '17' && 
steps.check_tests.outputs.has_results == 'true'
diff --git a/.github/workflows/sonarcloud.yml b/.github/workflows/sonarcloud.yml
index edcb3cd30..eece51352 100644
--- a/.github/workflows/sonarcloud.yml
+++ b/.github/workflows/sonarcloud.yml
@@ -19,20 +19,30 @@ on:
     workflows: [master pull request ci]
     types: [completed]
 
+# Explicitly drop all permissions.
+# Permissions will be granted to individual jobs as needed.
+permissions: {}
+
 concurrency:
   group: sonarcloud-${{ github.event.workflow_run.pull_requests[0].number || 
github.event.workflow_run.head_sha }}
   cancel-in-progress: true
 
 jobs:
-  analysis:
-    if: github.event.workflow_run.conclusion == 'success'
+  # WARNING: this job runs with access to repository secrets: do not execute 
untrusted code here.
+  # It is triggered after the Build workflow completes; avoid running any code 
from the pull request itself.
+  sonarcloud-scan:
+    if: ${{ github.event.workflow_run.conclusion == 'success' }}
     runs-on: ubuntu-latest
+
     steps:
       - uses: actions/checkout@v7
         with:
           repository: ${{ github.event.workflow_run.head_repository.full_name 
}}
           ref: ${{ github.event.workflow_run.head_sha }}
-          fetch-depth: 0
+          fetch-depth: 0  # Shallow clones should be disabled for a better 
relevancy of analysis
+          allow-unsafe-pr-checkout: true  # Explicitely allow (no code is 
compiled or run in this workflow)
+          persist-credentials: false
+
       - name: Fetch target branch for PR analysis
         if: github.event.workflow_run.event == 'pull_request'
         run: |
@@ -43,16 +53,17 @@ jobs:
         with:
           java-version: '17'
           distribution: 'temurin'
-      - name: Cache Ivy dependencies
-        uses: actions/cache@v6
-        with:
-          path: ~/.ivy2/cache
-          key: ${{ runner.os }}-ivy-${{ hashFiles('ivy/ivy.xml', 
'src/plugin/**/ivy.xml') }}
-          restore-keys: |
-            ${{ runner.os }}-ivy-
-      - name: Compile (no tests)
-        run: ant compile compile-plugins resolve-test -buildfile build.xml
+
       # Coverage and JUnit XML come only from the master-build Ubuntu JDK 17 
matrix job.
+      - name: Download Binary Artifacts (Ubuntu JDK 17)
+        uses: dawidd6/action-download-artifact@v21
+        with:
+          name: build-artifacts-ubuntu-latest-jdk17
+          workflow: master-build.yml
+          run_id: ${{ github.event.workflow_run.id }}
+          path: ./build/
+        continue-on-error: true
+
       - name: Download coverage data (Ubuntu JDK 17)
         uses: dawidd6/action-download-artifact@v21
         with:
@@ -61,22 +72,24 @@ jobs:
           run_id: ${{ github.event.workflow_run.id }}
           path: ./build/coverage/
         continue-on-error: true
+
       - name: Download test reports (Ubuntu JDK 17)
         uses: dawidd6/action-download-artifact@v21
         with:
           name: junit-test-results-ubuntu-latest-jdk17
           workflow: master-build.yml
           run_id: ${{ github.event.workflow_run.id }}
-          path: ./build/test-jdk17/
+          path: |
+            ./build/test/TEST-*.xml
+            ./build/**/test/TEST-*.xml
         continue-on-error: true
+
       - name: Flatten test reports (JDK 17 only)
         run: |
           mkdir -p ./build/test-reports
-          find ./build/test-jdk17 -name 'TEST-*.xml' -exec cp {} 
./build/test-reports/ \; 2>/dev/null || true
-        continue-on-error: true
-      - name: Generate JaCoCo XML report
-        run: ant jacoco-report -buildfile build.xml
+          find ./build/test ./build/*/test/ -name 'TEST-*.xml' -exec cp {} 
./build/test-reports/ \; 2>/dev/null || true
         continue-on-error: true
+
       - name: Resolve PR number
         id: pr
         run: |
@@ -109,6 +122,7 @@ jobs:
           fi
         env:
           GH_TOKEN: ${{ github.token }}
+
       - name: SonarCloud Scan (PR)
         if: steps.pr.outputs.is_pr == 'true'
         uses: 
SonarSource/sonarqube-scan-action@713881670b6b3676cda39549040e2d88c70d582e
@@ -120,6 +134,7 @@ jobs:
         env:
           SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
           SONAR_HOST_URL: https://sonarcloud.io
+
       - name: SonarCloud Scan (branch)
         if: steps.pr.outputs.is_pr == 'false' && steps.pr.outputs.skip != 
'true'
         uses: 
SonarSource/sonarqube-scan-action@713881670b6b3676cda39549040e2d88c70d582e

Reply via email to