Skip to content

ci: drop EOL Rails 7.2 from the matrix - #228

Merged
Fivell merged 1 commit into
masterfrom
chore/drop-eol-rails
Oct 1, 2026
Merged

Fivell merged 1 commit into
masterfrom
chore/drop-eol-rails

Conversation

@Fivell

@Fivell Fivell commented Oct 1, 2026 •

Copy link
Copy Markdown
Member

Drops end-of-life Rails 7.2 from CI and removes two stale exclude: rules that were suppressing working coverage.

Why

  • Rails 7.2 reached EOL on 2026-08-09 (endoflife.date/rails). CI should not gate on a release that receives no security fixes.
  • Rails 8.0 goes EOL on 2026-11-07, five weeks out. It is kept for now as the oldest still-supported release, but the PostgreSQL jobs have been moved to 8.1 so the DB-backed coverage is not sitting on a branch that is about to die.

Ruby stays ['3.3', '3.4', '4.0'] and the gemspec is untouched (required_ruby_version is already >= 3.3.0; the activeadmin and activerecord-import runtime constraints are unchanged). No version bump, no release.

Matrix: before / after

Before After
ruby 3.3, 3.4, 4.0 unchanged
rails 7.2.0, 8.0.0, 8.1.0 8.0.0, 8.1.0
activeadmin 3.2.0, 3.3.0, 3.4.0, 3.5.1 unchanged
exclude 8.0.0 x 3.2.0, 8.1.0 x 3.2.0 none
include AA 4.0.0.beta22 on Rails 7.2.0, 8.0.0, 8.1.0 AA 4.0.0.beta22 on Rails 8.0.0, 8.1.0
total legs 37 26

Standalone jobs:

Job Before After
test-mysql (MySQL 8.0, AA 3.5.1) RAILS: '8.0.0' RAILS: '8.1.0'
test-postgres (PostgreSQL 16, AA 3.5.1) RAILS: '8.0.0' RAILS: '8.1.0'
test-postgres-aa4 (PostgreSQL 16, AA 4.0.0.beta22) RAILS: '8.0.0' RAILS: '8.1.0'
coverage standalone, no matrix unchanged

No exclude: was added. In particular there is no Ruby 3.3 x Rails 8.1 exclude: the anonymous-parameter-forwarding SyntaxError that motivates one exists only in Ruby 3.3.0, the first 3.3 release, and ruby/setup-ruby with ruby-version: '3.3' installs the newest 3.3 patch. Ruby 3.3 x Rails 8.1 is a valid cell.

The ActiveAdmin 3.2.0 excludes were wrong — evidence

The two removed rules claimed "ActiveAdmin 3.2.0 predates Rails 8 support". The Gemfile pins ~> #{ENV['AA']}, so the 3.2.0 matrix entry resolves to activeadmin 3.2.5, which supports Rails 8. Resolved locally:

$ RAILS=8.0.0 AA=3.2.0 bundle install   # Bundle complete! 10 Gemfile dependencies, 108 gems
  * activeadmin (3.2.5)
  * rails (8.0.5.1)
  * railties (8.0.5.1)

$ RAILS=8.1.0 AA=3.2.0 bundle install   # Bundle complete! 10 Gemfile dependencies, 109 gems
  * activeadmin (3.2.5)
  * rails (8.1.4)
  * railties (8.1.4)

Both suites pass:

$ CI=true RBENV_VERSION=3.4.10 RAILS=8.0.0 AA=3.2.0 rbenv exec bundle exec rspec spec
66 examples, 0 failures        Line coverage: 285 / 287 (99.30%)

$ CI=true RBENV_VERSION=3.4.10 RAILS=8.1.0 AA=3.2.0 rbenv exec bundle exec rspec spec
66 examples, 0 failures        Line coverage: 285 / 287 (99.30%)

So the rules are deleted rather than widened — they were excluding six green legs (3 Rubies x 2 Rails).

Standalone DB jobs

test-postgres and test-postgres-aa4 moved to Rails 8.1.0, both verified locally against a real PostgreSQL 17 instance with the same DB/DB_HOST/DB_PORT/DB_USERNAME/DB_PASSWORD wiring the workflow uses. The 67th example is spec/import_spec.rb's if ENV['DB'] == 'postgres' native-upsert case, so the adapter-specific path really did run:

$ CI=true RBENV_VERSION=3.4.10 RAILS=8.1.0 AA=3.5.1 DB=postgres ... rbenv exec bundle exec rspec spec
67 examples, 0 failures        Line coverage: 285 / 287 (99.30%)

$ CI=true RBENV_VERSION=3.4.10 RAILS=8.1.0 AA=4.0.0.beta22 DB=postgres ... rbenv exec bundle exec rspec spec
67 examples, 0 failures        Line coverage: 285 / 287 (99.30%)

test-mysql moved to RAILS: '8.1.0' as well, so no job is left on Rails 8.0 (EOL 2026-11-07).

This one could not be verified locally — no MySQL server was reachable on the dev machine (Homebrew mysql installed but stopped, and standing up an isolated mysqld was not possible there). Rather than push it unverified, it was proved on the runner first, in a throwaway branch and draft PR (#229, closed without merging): job log — 66 examples, 0 failures, with mysql2 0.5.7 built with native extensions and the dummy app configured for MySQL through ENV['DB'] in spec/support/rails_template.rb. The 67-example counts in the PostgreSQL rows below are the ENV['DB'] == 'postgres' native-upsert spec, so the numbers line up.

Only after that result did the change land here.

The service blocks themselves (mysql:8.0, postgres:16, their env, ports and health-check options) are unchanged and are independent of the Rails version.

Other checks

  • tasks/test.rake already passes --skip-javascript for the AA 3 dummy app, so the Rails 8.1 stale_when_importmap_changes trap is already handled at the generator; nothing to add.
  • The coverage job is a standalone job with no matrix and no if: on matrix values, so it runs exactly once; deploy-coverage's if: only gates on master + push. Unchanged.
  • README has no supported-versions table and no Rails-version badge — only build/coverage/Code Climate/gem/license badges. Nothing to update.
  • No CHANGELOG file exists in this repo, so no changelog entry was added.

Local verification

All runs are CI=true (the dummy app's config.eager_load = ENV["CI"].present? makes it mandatory locally), Ruby via rbenv, SQLite unless noted.

Ruby Rails AA DB Result
3.4.10 8.1.0 3.5.1 sqlite 66 examples, 0 failures
3.4.10 8.0.0 3.2.0 sqlite 66 examples, 0 failures
3.4.10 8.1.0 3.2.0 sqlite 66 examples, 0 failures
4.0.6 8.1.0 3.5.1 sqlite 66 examples, 0 failures
3.4.10 8.1.0 4.0.0.beta22 sqlite 66 examples, 0 failures
3.4.10 8.1.0 3.5.1 PostgreSQL 67 examples, 0 failures
3.4.10 8.1.0 4.0.0.beta22 PostgreSQL 67 examples, 0 failures
3.4.10 8.1.0 3.5.1 MySQL 66 examples, 0 failures — on the runner, not locally (see above)

Required run, verbatim:

$ CI=true RBENV_VERSION=3.4.10 RAILS=8.1.0 AA=3.5.1 rbenv exec bundle install
Bundle complete! 10 Gemfile dependencies, 109 gems now installed.

$ CI=true RBENV_VERSION=3.4.10 RAILS=8.1.0 AA=3.5.1 rbenv exec bundle exec rspec spec
Finished in 3.19 seconds (files took 12.62 seconds to load)
66 examples, 0 failures

Coverage report generated for RSpec to coverage/index.html
Line coverage: 285 / 287 (99.30%)

Rails 7.2 reached end of life on 2026-08-09 (endoflife.date/rails), so the
SQLite matrix now tests Rails 8.0 and 8.1 only. The ActiveAdmin 4 include
leg that pinned Rails 7.2.0 goes with it.

Both `exclude:` rules are also removed. Their stated reason -- "ActiveAdmin
3.2.0 predates Rails 8 support" -- is stale: the matrix pins `~> 3.2.0`,
which resolves to activeadmin 3.2.5, and that installs and passes the suite
on both Rails 8.0.5.1 and 8.1.4 (66 examples, 0 failures each). The rules
were hiding working coverage.

The two PostgreSQL jobs move from Rails 8.0.0 to 8.1.0, both verified
locally against a real PostgreSQL. The MySQL job stays on 8.0.0, which is
supported until 2026-11-07, so one DB-backed job still covers the oldest
supported Rails.
@Fivell
Fivell force-pushed the chore/drop-eol-rails branch from 7589336 to 0807b1d Compare October 1, 2026 12:14
@Fivell
Fivell merged commit 6ae6a63 into master Oct 1, 2026
31 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant