[2.x] ci: rebuild the backend matrix around declared database support - #4959
Merged
Conversation
This was referenced Aug 21, 2026
imorland
force-pushed
the
im/ci-db-matrix-revamp
branch
from
August 21, 2026 22:17
8837e28 to
7bc7daa
Compare
12 tasks
imorland
force-pushed
the
im/ci-db-matrix-revamp
branch
from
August 21, 2026 23:43
7bc7daa to
6362185
Compare
12 tasks
imorland
force-pushed
the
im/ci-db-matrix-revamp
branch
from
August 22, 2026 00:10
6362185 to
ca07559
Compare
imorland
marked this pull request as ready for review
August 22, 2026 07:33
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.
Changes proposed in this pull request:
The backend matrix had drifted away from what Flarum declares it supports.
DatabaseRequirementsnames a MINIMUM and RECOMMENDED version per driver, and CI tested neither for most of them:mariadb— unpinned, so:latestSo the primary MySQL was a version that had gone EOL, MariaDB's tested version drifted silently with Docker Hub, and none of the recommended versions were exercised at all — we were warning admins to be on versions we never tested.
The matrix now covers, per driver, the declared minimum, the declared recommendation, and the newest long-term release: MySQL 5.7 / 8.4 / 9.7, MariaDB 10.3 / 11.8 / 12.3, PostgreSQL 10 / 15 / 18, plus SQLite. Every image is pinned so a run is reproducible.
The
excludeblock is gone. It carried a warning that it had to be kept in sync by hand with the size ofphp_versions, and it grew as the product of drivers and PHP versions. The base matrix is nowlatest_php × db_versions, with older PHP versions and the prefixed runs added as explicitincludeentries. Adding a database is one line; adding a PHP version no longer needs an entry per database.db_versionskeeps its existing meaning, so a repo passing a custom list still gets exactly that list.That produces 14 jobs, against 11 before:
PHP coverage is deliberately not crossed with every database. A PHP-version bug is not specific to a database engine, so those combinations could only fail alongside another job. The three PHP versions instead run against the recommended MySQL, which also moves that axis off the EOL 8.0 it was pinned to.
Prefixed runs are now aimed at what they are for. They exist to catch identifier length limits, but the prefix was
flarum_— seven characters, which will not reach a limit. It is now 19, and applied to the newest MySQL and PostgreSQL rather than to four engines, since those are where the limits bite: 64 characters on MySQL/MariaDB, 63 bytes on PostgreSQL, which truncates silently instead of erroring. That is also why PostgreSQL is the interesting case — a collision after truncation produces no error at all.Two pre-existing bugs fixed along the way.
ini-valuesread${{ matrix.php_ini_values }}, and that matrix key was set to[inputs.php_ini_values]— a literal string rather than an expression. The last run on2.xconfirms what setup-php actually received:So
error_reporting=E_ALLhas never been applied, and notice and deprecation level diagnostics have been suppressed relative to intent across the whole suite. Now taken from the input directly.The
mariadbservice was also unpinned, so that job silently followed:latest. All images are pinned now.Capacity. Concurrent job limits are account-wide, and this account's limit is 20 on the Free plan. A push currently requests 15 jobs (11 backend, 3 static analysis, 1 frontend); this takes that to 18. To make room, all three entry workflows gain a
concurrencygroup so superseded runs are cancelled rather than holding slots until they finish —cancel-in-progressis disabled on2.xso each merge commit still gets its own result.fail-fast: falseis also set, so one database failing no longer cancels the rest and costs us the run.SQLite cannot be pinned, since it is compiled into PHP rather than run as a service. There is now a step that reports the runner's version and fails if it ever drops below
SQLITE_MINIMUM, so at least we know what was tested.Reviewers should focus on:
mysql:8.4,mysql:9.7andpostgres:18explicitly, so a repo passing adb_versionslist without those still gets those four jobs. Harmless but surprising. Fixing it properly needs a job that computes the matrix before the tests run, which felt like more machinery than this is worth.Necessity
db_versionswith a richer input, which would have broken the ability of extension repos to specify their own database set.Confirmed