This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch ci-scalpel-exclude-root-files in repository https://gitbox.apache.org/repos/asf/camel.git
commit 141b611c94cf10b64c18f903d0f5042248094676 Author: Claus Ibsen <[email protected]> AuthorDate: Wed Nov 11 13:38:42 2026 +0100 chore: ci - Scalpel ignores root-level files that do not affect the build Since Scalpel 0.5.0 (#29611) a changed root-level file that no module owns triggers a full build, even with an empty fullBuildTriggers, and incremental-build.sh then drops Scalpel's module list. Add the root-level doc and repository files (CLAUDE.md, AGENTS.md, README.md, Jenkinsfile*, ...) to -Dscalpel.excludePaths. mvnw, mvnw.cmd and pom.xml still trigger a full build. Co-Authored-By: Claude Opus 5.5 <[email protected]> Signed-off-by: Claus Ibsen <[email protected]> --- .github/CI-ARCHITECTURE.md | 2 ++ .github/actions/incremental-build/incremental-build.sh | 9 ++++++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/.github/CI-ARCHITECTURE.md b/.github/CI-ARCHITECTURE.md index 9e0279944e49..6c6ecc620664 100644 --- a/.github/CI-ARCHITECTURE.md +++ b/.github/CI-ARCHITECTURE.md @@ -238,6 +238,8 @@ The comparison is apples-to-apples: the current approach's reactor is filtered t The script overrides `fullBuildTriggers` to empty (`-Dscalpel.fullBuildTriggers=`) because Scalpel's default (`.mvn/**`) would trigger a full build whenever `.mvn/extensions.xml` itself changes (e.g., Dependabot bumping Scalpel). +It also passes `-Dscalpel.excludePaths` with `.github/**` and the root-level files that do not affect the build (`AGENTS.md`, `CLAUDE.md`, `README.md`, `KEYS`, `LICENSE.txt`, `Jenkinsfile*`, `.gitignore`, ...). Since Scalpel 0.5.0 a changed root-level file that no module owns triggers a full build, which the script treats as a Scalpel failure, so a PR that touches `CLAUDE.md` would lose Scalpel's module list. `mvnw`, `mvnw.cmd` and `pom.xml` are not excluded: a change to them should stil [...] + The grep-based script fetches the PR diff via the GitHub REST API. When the API does not return it (HTTP 406 for a PR beyond the GitHub diff limits, such as more than 300 files), the diff is computed from the local checkout against its merge base with the base branch, fetching the base branch when the checkout does not have it (camel-spring-boot runs this action after a depth-1 checkout); without either, the step fails rather than pass without testing (`pr_diff.sh`). Scalpel uses local g [...] ## Manual Integration Test Advisories diff --git a/.github/actions/incremental-build/incremental-build.sh b/.github/actions/incremental-build/incremental-build.sh index bd311a37a0dc..2c9a10bf51fc 100755 --- a/.github/actions/incremental-build/incremental-build.sh +++ b/.github/actions/incremental-build/incremental-build.sh @@ -245,6 +245,12 @@ runScalpelDetection() { # - explain=true: add per-module evidence[] to the report (exact file/property/dep that triggered each module) # - fullBuildTriggers="": override .mvn/** default (Scalpel lives in .mvn/extensions.xml) # - fetchBaseBranch=false: base branch is pre-fetched by the CI workflow + # - excludePaths: .github/** plus the root-level files that do not affect the build. + # Since Scalpel 0.5.0 a changed root-level file that no module owns triggers a full + # build, so a PR that only edits CLAUDE.md or README.md would lose its module list. + # mvnw, mvnw.cmd and pom.xml are left out on purpose: they do affect the build. + # A pattern without a "/" also matches at any depth (e.g. a module's README.md); + # the file-path step above still picks up the module of such a file. # - skipTestsForDownstreamModules: derived from EXCLUSION_LIST — tells Scalpel which # downstream modules should not run tests in skip-tests mode (for shadow comparison) # Strip the Maven "!:" prefix from each entry to get bare artifact IDs for Scalpel. @@ -253,7 +259,8 @@ runScalpelDetection() { # Always pass baseBranch explicitly — relying on Scalpel's env.GITHUB_BASE_REF # auto-detection is fragile across Maven wrappers and CI rerun contexts. local base_branch="origin/${GITHUB_BASE_REF:-main}" - local scalpel_args="-Dscalpel.enabled=true -Dscalpel.mode=report -Dscalpel.explain=true -Dscalpel.fullBuildTriggers= -Dscalpel.fetchBaseBranch=false -Dscalpel.baseBranch=${base_branch} -Dscalpel.excludePaths=.github/** -Dscalpel.skipTestsForDownstreamModules=${skip_downstream}" + local exclude_paths=".github/**,AGENTS.md,CLAUDE.md,CONTRIBUTING.md,README.md,SECURITY.md,KEYS,LICENSE.txt,NOTICE.txt,doap.rdf,Jenkinsfile*,.asf.yaml,.gitattributes,.gitignore,.gitmodules,.sdkmanrc,jbang-catalog.json" + local scalpel_args="-Dscalpel.enabled=true -Dscalpel.mode=report -Dscalpel.explain=true -Dscalpel.fullBuildTriggers= -Dscalpel.fetchBaseBranch=false -Dscalpel.baseBranch=${base_branch} -Dscalpel.excludePaths=${exclude_paths} -Dscalpel.skipTestsForDownstreamModules=${skip_downstream}" # Verify merge base is reachable (pre-fetched by the CI workflow step) if ! git merge-base HEAD "${base_branch}" >/dev/null 2>&1; then
