GitHub reported: Unrecognized function: 'hashFiles' at ci.yml L40.
Remove job-level if: hashFiles(...); skip inside the run step when
plogical/versionFetcher.py is missing (e.g. stable branch).
- All jobs now use runs-on: ubuntu-22.04 (avoids ubuntu-latest/24.04 Docker issues)
- validate-on-os: replaced 16 Docker matrix jobs with single validate-upgrade-script job
- No Docker in CI so workflow passes on hosted runners; multi-OS still testable locally
- validate-python: add timeout-minutes: 2
- Tested locally: all four job steps pass
- Add .github/scripts/ci-validate-upgrade.sh (single source for Docker validation)
- validate-on-os: run script inside container instead of inline bash -c
- Avoids nested quoting and glob/exit behavior differences across shells
- Same script can be run locally: bash .github/scripts/ci-validate-upgrade.sh
- stable branch has no plogical/versionFetcher.py; CI #23 failed on smoke-key-files and validate-python
- validate-python: run only if hashFiles('plogical/versionFetcher.py') != ''
- smoke-key-files and validate-on-os: require only preUpgrade, loader, upgrade.py, install.py; versionFetcher optional
- CI: when upgrade_modules/ exists, check all 12 modules and grep Branch_Check in modules
- CI: syntax-check upgrade_modules/*.sh in validate-shell and validate-on-os
- Loader: BRANCH_FOR_MODULES default 'stable' so one-liner works without -b
- Loader: show both stable and -b v2.5.5-dev in root-check message