Optimize CI: engine-grouped testing (42 jobs to 8)#1939
Merged
Conversation
Plan to restructure the GitHub Actions test matrix from 42 independent jobs (cfengine x dbengine) to 8 engine-grouped jobs. Each CF engine starts once and runs all database test suites sequentially, reducing total CI compute by ~75%. Key changes planned: - Engine-only matrix (8 jobs vs 42) - CFPM install once per Adobe engine instead of 6x - Oracle sleep 120 replaced with sqlplus health check - SQL Server memory 4GB->2GB, Oracle 2GB->1.5GB - JUnit XML reporting via JSON-to-XML conversion - Engine x database summary grid on workflow runs - BoxLang volume mounts re-enabled for local dev parity Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The test dataset is tiny (5 users, 8 authors, 40 photos). 4GB was excessive and prevents running all databases simultaneously on a 7GB GitHub runner. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Allows running all databases simultaneously within 7GB GitHub runner budget. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Volumes were commented out in 9790880 when Dockerfile was changed to COPY all code at build time. This broke local dev (code changes required rebuild). Re-enabling volumes restores live-reload behavior matching other CF engines. Docker gives volumes precedence over COPY, so CI still works correctly. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replaces cfengine x dbengine matrix (42 jobs) with cfengine-only matrix (8 jobs). Each job starts one CF engine + all databases, runs test suites sequentially. Key changes: - CF engine starts once per job instead of 6x (saves 5 startups per engine) - CFPM install runs once per Adobe engine instead of 6x (saves ~50 min compute) - Oracle sleep 120 replaced with sqlplus health check loop - All databases start in parallel during engine warmup - Tests continue after individual database failures (all DBs always run) - JUnit XML output uploaded for each engine-database pair - Summary jobs render engine x database grid on workflow run page - PR annotations via EnricoMi/publish-unit-test-result-action Total compute reduction: ~75% (from ~840 min to ~200 min) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Required by EnricoMi/publish-unit-test-result-action to post test result annotations and PR comments. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…rect Wheels returns HTTP 302 after reload=true completes. The test curl was capturing this 302 as a failure instead of following the redirect. Fix: issue the reload as a separate curl with -L (follow redirects), then run the actual test request without reload. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The previous fix split reload and test into two requests. But the reload request without format=json would run the full test suite in HTML format, then the second request would run it again — doubling execution time. Better approach: include reload=true AND format=json in one curl with -L. Wheels' redirectAfterReload strips reload/password but preserves db= and format=, so the redirect lands on ?db=X&format=json — exactly what we need. Single request, single test execution. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The ?db= parameter switches application.wheels.dataSourceName directly (runner.cfm:70-80). No reload needed because: - $_setTestboxEnv() handles datasource switching per HTTP request - populate.cfm creates identical table schemas across all databases - The old 42-job workflow never used reload=true either reload=true was breaking Adobe CF engines because $handleRestartAppRequest passes "application" as a component reference to cfinvoke, which Adobe CF can't resolve. Removing it fixes all Adobe engines and simplifies the curl. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
v5 uses Node.js 20 which is deprecated and will be forced to Node.js 24 on June 2, 2026. v6 natively supports Node.js 24. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Action version bumps (Node.js 24 support): - actions/checkout v4 → v5 - actions/upload-artifact v4 → v5 - actions/download-artifact v4 → v5 Restart CF engine container between database runs to prevent cross-DB contamination. Without restart, cached model metadata and association methods from one database's test run leak into subsequent runs: - BoxLang: shallow copy in runner.cfm causes datasource name to not actually switch (duplicate key errors on 2nd+ database) - Adobe CF: stale association methods cause "method not found" errors on later databases (e.g. hasAuthor missing on 4th DB) Container restart takes ~10-15s — much cheaper than a full rebuild, and guarantees clean application state per database. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Fixes remaining Node.js 20 deprecation warnings in CI. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Cast count attributes to int() in JUnit XML generation (CFML returns floats for numeric values, causing ValueError in publish action) - Set FORCE_JAVASCRIPT_ACTIONS_TO_NODE24 on publish-results and test-matrix-summary jobs (download-artifact@v6 still ships Node 20) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Contributor
Wheels Test Results 42 files 3 696 suites 24m 34s ⏱️ Results for commit ddf142a. ♻️ This comment has been updated with latest results. |
- Build matrix markdown into variable, write to both step summary and PR comment via gh CLI - Update existing comment on subsequent pushes (no duplicates) - Add pull-requests:write permission to test-matrix-summary job - Move FORCE_JAVASCRIPT_ACTIONS_TO_NODE24 to workflow-level env - Include engine/db prefix in JUnit XML suite names for granularity - Show failure count in matrix cells when tests fail Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Contributor
Wheels Test Matrix
Results for commit 1bb880d. |
The publish-unit-test-result-action expects true/false, not "all". Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Changes "3 696 suites" to "3,696 suites" in the PR comment. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Adobe CF containers occasionally fail startup due to transient network errors (CommandBox dependency clone failures). The previous wait logic used docker ps which can't detect crashed containers, causing a 150s timeout with no feedback. Now uses docker inspect to detect exited/dead containers and retries up to 3 times with docker compose up -d. Also adds proper error annotations and container log output on failure. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Restructures the GitHub Actions test matrix from 42 independent jobs (cfengine × dbengine) to 8 engine-grouped jobs that start each CF engine once and run all database test suites sequentially.
sleep 120replaced withsqlplushealth check loop (saves ~90s per occurrence)EnricoMi/publish-unit-test-result-action$GITHUB_STEP_SUMMARYand posted as PR commentHow it works
Each engine job:
Summary jobs download all artifacts and render a matrix grid + PR annotations.
Database exclusions (preserved)
Test plan
publish-resultsjob creates PR annotationstest-matrix-summaryrenders the grid (step summary + PR comment)🤖 Generated with Claude Code