Skip to content

Drop EOL Ruby and Rails from CI - #20

Merged
Fivell merged 3 commits into
masterfrom
chore/drop-eol-ruby-rails
Oct 1, 2026
Merged

Fivell merged 3 commits into
masterfrom
chore/drop-eol-ruby-rails

Conversation

@Fivell

@Fivell Fivell commented Oct 1, 2026 •

Copy link
Copy Markdown
Member

Drops end-of-life Ruby and Rails from CI and moves the gemspec's Ruby floor to match. No version bump, no release.

Matrix

Before — 3 Ruby x 4 Rails x 2 AA = 24, minus the 6 legs the 2 exclude rules matched = 18 legs

ruby ['3.2', '3.3', '3.4']
rails ['7.1.0', '7.2.0', '8.0.0', '8.1.0']
activeadmin ['3.2.0', '3.5.0']
exclude AA 3.2.0 x Rails 8.0.0, AA 3.2.0 x Rails 8.1.0

After — 3 Ruby x 2 Rails x 2 AA, no excludes = 12 legs

ruby ['3.3', '3.4', '4.0']
rails ['8.0.0', '8.1.0']
activeadmin ['3.2.0', '3.5.0']
exclude none

What went, and why

Per endoflife.date/ruby and endoflife.date/rails:

Dropped EOL
Ruby 3.2 2026-03-31
Rails 7.1 2025-10-01
Rails 7.2 2026-08-09

Kept: Ruby 3.3 (2027-03-31, security-only — this is the floor), 3.4 (2028-03-31), 4.0 (2029-03-31); Rails 8.0 (2026-11-07) and 8.1 (2027-10-10). Rails 8.2 is not released (main is 8.2.0.alpha, no tag), so it is not added.

No ActiveAdmin version was dropped

The two existing excludes were annotated "Active Admin 3.2 predates Rails 8 support", which implied AA 3.2.0 had no valid pairing left once Rails 7.x went and should come out of the matrix with them.

That comment is not what actually happens. AA 3.2 installs and passes the full suite on both Rails 8 releases:

$ RBENV_VERSION=3.4.10 RAILS=8.0.0 AA=3.2.0 bundle install
Bundle complete! 13 Gemfile dependencies, 108 gems now installed.
$ RBENV_VERSION=3.4.10 RAILS=8.0.0 AA=3.2.0 bundle list | grep -E 'activeadmin|rails '
  * activeadmin (3.2.5)
  * rails (8.0.5.1)
$ RBENV_VERSION=3.4.10 RAILS=8.0.0 AA=3.2.0 bundle exec rspec spec
23 examples, 0 failures

$ RBENV_VERSION=3.4.10 RAILS=8.1.0 AA=3.2.0 bundle install
Bundle complete! 13 Gemfile dependencies, 109 gems now installed.
$ RBENV_VERSION=3.4.10 RAILS=8.1.0 AA=3.2.0 bundle list | grep -E 'activeadmin|rails '
  * activeadmin (3.2.5)
  * rails (8.1.4)
$ RBENV_VERSION=3.4.10 RAILS=8.1.0 AA=3.2.0 bundle exec rspec spec
23 examples, 0 failures

So the excludes were suppressing coverage that works. Both AA versions stay, both stale rules are deleted, and the matrix is left with no excludes. Because nothing was dropped, the gemspec's activeadmin "~> 3.2" floor is left alone too.

gemspec

It did already declare a Ruby floor — required_ruby_version = ">= 3.2", added in #15 — so this is a move to ">= 3.3", not a new declaration.

Deliberately untouched: activeadmin "~> 3.2" (no AA version dropped) and railties ">= 7.1". Narrowing the tested Rails range is not evidence the gem broke on older Rails, and raising a runtime floor is a breaking change for consumers for no gain.

No .ruby-version and no .rubocop.yml in this repo, so there is no TargetRubyVersion to keep in step. No CHANGELOG either, so none was created. The README's compatibility section is updated and the Gemfile's local default_rails_version moves 7.1.0 -> 8.0.0 so a bare bundle install no longer resolves an EOL Rails.

Local verification

Ruby via rbenv, Chrome for cuprite, suite driven with bundle exec rake setup then bundle exec rspec spec.

Ruby Rails AA Result
3.3.12 8.1.4 3.5.2 23 examples, 0 failures
3.3.12 8.0.5.1 3.2.5 23 examples, 0 failures
3.4.10 8.1.4 3.5.2 23 examples, 0 failures
3.4.10 8.1.4 3.2.5 23 examples, 0 failures
3.4.10 8.0.5.1 3.2.5 23 examples, 0 failures
4.0.6 8.1.4 3.5.2 23 examples, 0 failures

Required leg, Ruby 3.4.10 with the newest Rails in the new matrix:

$ RBENV_VERSION=3.4.10 RAILS=8.1.0 AA=3.5.0 bundle install
Bundle complete! 13 Gemfile dependencies, 109 gems now installed.
$ RBENV_VERSION=3.4.10 RAILS=8.1.0 AA=3.5.0 bundle exec rake setup
$ RBENV_VERSION=3.4.10 RAILS=8.1.0 AA=3.5.0 bundle exec rspec spec
.......................

Finished in 9.17 seconds (files took 1.57 seconds to load)
23 examples, 0 failures

Line coverage: 5 / 5 (100.00%)

New floor leg, Ruby 3.3 x Rails 8.1 — the newest pairing on the oldest supported Ruby:

$ RBENV_VERSION=3.3.12 RAILS=8.1.0 AA=3.5.0 bundle list | grep -E 'actionview|simplecov|activeadmin \('
  * actionview (8.1.4)
  * activeadmin (3.5.2)
  * simplecov (1.3.2)
$ RBENV_VERSION=3.3.12 RAILS=8.1.0 AA=3.5.0 bundle exec rspec spec
.......................

Finished in 10.95 seconds (files took 1.51 seconds to load)
23 examples, 0 failures

Ceiling leg, Ruby 4.0.6 x Rails 8.1:

$ RBENV_VERSION=4.0.6 RAILS=8.1.0 AA=3.5.0 bundle install
Bundle complete! 13 Gemfile dependencies, 108 gems now installed.
$ RBENV_VERSION=4.0.6 RAILS=8.1.0 AA=3.5.0 bundle exec rspec spec
.......................

Finished in 10.22 seconds (files took 1.96 seconds to load)
23 examples, 0 failures

A note on Ruby 3.3 patch levels

An earlier revision of this PR excluded Ruby 3.3 x Rails 8.1 and pinned simplecov to < 1.1 on Ruby < 3.4. Both were wrong and have been removed.

actionview-8.1.4/lib/action_view/helpers/capture_helper.rb:50 and simplecov-1.3.2/lib/simplecov/result_merger/resultset_store.rb:38 both forward anonymous args from inside a block. That is rejected by Ruby 3.3.0 only — the restriction was lifted in a later 3.3 patch:

$ for v in 3.3.0 3.3.12 3.4.10; do
    RBENV_VERSION=$v ruby -e 'def f(*,**); [1].each { g(*,**) }; end; puts RUBY_VERSION + " OK"'
  done
3.3.0   -e: compile error (SyntaxError)
3.3.12  3.3.12 OK
3.4.10  3.4.10 OK

ruby/setup-ruby resolves ruby-version: '3.3' to 3.3.12, so CI was never affected either way. The diagnosis came from a local rbenv default of 3.3.0. Re-measured on 3.3.12 the cell passes with stock, unpinned simplecov 1.3.2 and actionview 8.1.4 (table above), so the matrix keeps all 12 legs and the Gemfile keeps plain gem 'simplecov', require: false.

rake setup behaved: the dummy-app cache key already accounts for AA on master (#18), and each leg rebuilt its own app. It prints noise on Rails 8.1 (Could not find gem 'kamal', Unrecognized command "solid_cache:install") from the generator's post-install hooks; rails new still exits 0 and config/environment.rb is written, so the suite boots. Pre-existing and unrelated to this change — not touched here.

There is no coverage-badge job in this workflow, so no if: gating needed updating.

Fivell added 2 commits October 1, 2026 13:31
Ruby 3.2 reached end of life on 2026-03-31; Rails 7.1 on 2025-10-01 and
7.2 on 2026-08-09 (endoflife.date). The matrix now covers Ruby 3.3/3.4/4.0
against Rails 8.0 and 8.1.

Both Active Admin versions stay and the matrix has no excludes at all. The
two it carried claimed "Active Admin 3.2 predates Rails 8 support", which is
not what happens: AA 3.2.5 installs and the full suite passes on both Rails
8.0.5.1 and 8.1.4, so the rules were removing real coverage.

The Gemfile's local default Rails is now 8.0.0 so a bare `bundle install`
no longer resolves an EOL Rails.
required_ruby_version moves from >= 3.2 to >= 3.3 to match what CI tests now
that Ruby 3.2 is end of life.

The activeadmin and railties dependency ranges are untouched. No Active Admin
version was dropped from the matrix, and narrowing the tested Rails range is
not evidence the gem stopped working on older Rails — raising a runtime floor
would break consumers for nothing.

No version bump, no release.
@Fivell
Fivell force-pushed the chore/drop-eol-ruby-rails branch from 465fd48 to 7aefd2f Compare October 1, 2026 11:31
The matrix now stops at Rails 8.0, but the gemspec still declared
railties >= 7.1 and the README still promised "Rails 7.1 or newer". That
left the declared floor untested, which is the exact gap the explicit
floors were added to close -- the paragraph directly below the claim says
so, about Active Admin's own railties >= 6.1.

The same question was already answered the other way in this branch for
Ruby: CI moved to 3.3+, so the floor moved to 3.3. Rails gets the same
treatment.

Every Rails 7.x series is out of support -- 7.1 since October 2025, 7.2
since August 2026 -- so nothing being dropped was receiving security fixes.

Dropping a supported version is user-visible, so bump the minor to 0.4.0 in
both the gem and the npm package, and say in the README that 0.3.x is where
Rails 7 users stay.
@Fivell
Fivell merged commit 51d6027 into master Oct 1, 2026
12 checks passed
@Fivell
Fivell deleted the chore/drop-eol-ruby-rails branch October 1, 2026 12:35
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