Skip to content

ci: drop EOL Ruby and Rails from the matrix - #2

Merged
Fivell merged 2 commits into
mainfrom
chore/drop-eol-ruby-rails
Oct 2, 2026
Merged

Fivell merged 2 commits into
mainfrom
chore/drop-eol-ruby-rails

Conversation

@Fivell

@Fivell Fivell commented Oct 1, 2026 •

Copy link
Copy Markdown
Member

Drops the end-of-life Ruby and Rails legs from CI and raises the gemspec Ruby floor to match what is actually tested.

Matrix

Before After
ruby ['3.2', '3.4'] ['3.3', '3.4', '4.0']
rails ['7.2.0', '8.0.0'] ['8.0.0', '8.1.0']
activeadmin ['3.5.0'] ['3.5.0'] (unchanged)

4 legs before, 6 after.

Why each removal

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

Removed EOL
Ruby 3.2 2026-03-31
Rails 7.2 2026-08-09

And what stays:

Kept EOL
Ruby 3.3 2027-03-31 (security-only — the new floor)
Ruby 3.4 2028-03-31
Ruby 4.0 2029-03-31
Rails 8.0 2026-11-07
Rails 8.1 2027-10-10

Rails 8.0 goes EOL on 2026-11-07 — about five weeks out. It is kept for now as the oldest
still-supported release, but 8.1 is the only long-lived leg in this matrix, which is why it had to
be added rather than just swapped in later.

Rails 8.2 is not released (main is 8.2.0.alpha, no tag or pre-release on RubyGems), so it is not
added.

No exclude: rules were added. In particular Ruby 3.3 x Rails 8.1 is a good cell: the
anonymous-parameter-forwarding-in-a-block SyntaxError that affects actionview 8.1 exists only in
Ruby 3.3.0, the first 3.3 release, and is fixed in later patches. ruby/setup-ruby with
ruby-version: '3.3' installs the newest 3.3 patch, so CI never sees it — and it is verified green
locally on 3.3.12 below.

The ActiveAdmin dimension is left exactly as it was; adding an AA 4.0 line is out of scope here.

Also in this PR

  • tasks/test.rake generates the sample app with --skip-javascript. Rails 8.1's app generator
    writes stale_when_importmap_changes into ApplicationController, and rails_template.rb
    deliberately discards the generated Gemfile so the app runs under this gem's own sprockets bundle
    with no importmap-rails. Without the flag, every Rails 8.1 leg dies before the first example:

    Failure/Error: stale_when_importmap_changes
    NameError:
      undefined local variable or method 'stale_when_importmap_changes' for class ApplicationController
    0 examples, 0 failures, 1 error occurred outside of examples
    

    Fixed at the generator rather than by patching the generated file afterwards.

  • required_ruby_version → ">= 3.3". ">= 3.0" claimed support for three Rubies that are all
    out of support and none of which is tested.

  • README no longer advertises Rails 7.2 as a tested target.

The activeadmin runtime dependency (>= 3.5, < 4) is untouched — narrowing the tested range is not
evidence the gem broke on older Active Admin, and raising a runtime floor is a breaking change for
consumers. The gem version is not bumped and nothing is released.

The separate "Generate the sample app" CI step is kept as-is, so a generation failure still is not
reported as a failure of the first example.

Local verification

All runs with CI=true (the dummy app's config/environments/test.rb carries
config.eager_load = ENV["CI"].present?, and ActiveAdmin needs eager loading before the specs call
ActiveAdmin.register).

Primary leg — Ruby 3.4.10 / Rails 8.1.0 / AA 3.5.0 (resolved Rails 8.1.4):

$ CI=true RBENV_VERSION=3.4.10 RAILS=8.1.0 AA=3.5.0 rbenv exec bundle install
Bundle complete! 11 Gemfile dependencies, 107 gems now installed.

$ CI=true RBENV_VERSION=3.4.10 RAILS=8.1.0 AA=3.5.0 rbenv exec bundle exec rake setup
setup exit=0

$ CI=true RBENV_VERSION=3.4.10 RAILS=8.1.0 AA=3.5.0 rbenv exec bundle exec rspec spec
...........................................

Finished in 2.95 seconds (files took 1.18 seconds to load)
43 examples, 0 failures

New floor — Ruby 3.3.12 / Rails 8.0.0 / AA 3.5.0 (resolved Rails 8.0.5.1):

$ rbenv exec ruby -v
ruby 3.3.12 (2026-07-16 revision 0581089df9) [arm64-darwin24]

...........................................

Finished in 5.9 seconds (files took 1.94 seconds to load)
43 examples, 0 failures

Ceiling — Ruby 4.0.6 / Rails 8.1.0 / AA 3.5.0:

$ rbenv exec ruby -v
ruby 4.0.6 (2026-07-14 revision 03b6d3f889) +PRISM [arm64-darwin24]

...........................................

Finished in 3.42 seconds (files took 1.6 seconds to load)
43 examples, 0 failures

Three legs green, 43 examples each, bundle install and rake setup exit 0 on all three. The 8.0
leg generated spec/rails/rails-8.0.5.1 and the 8.1 leg spec/rails/rails-8.1.4, confirming the
Gemfile's three-segment ~> 8.0.0 pin really tests Rails 8.0 and does not drift up to 8.1.

Fivell added 2 commits October 1, 2026 13:45
Ruby 3.2 reached end of life on 2026-03-31 and Rails 7.2 on 2026-08-09, so
neither belongs in CI any more. The new matrix is Ruby 3.3/3.4/4.0 against
Rails 8.0 and 8.1 - Rails 8.0 itself goes EOL on 2026-11-07, which leaves 8.1
as the only long-lived leg, so it has to be there.

Rails 8.1's app generator writes `stale_when_importmap_changes` into
ApplicationController, and rails_template.rb discards the generated Gemfile,
so the sample app boots with no importmap-rails and raises NameError before
any example runs. Generating with --skip-javascript keeps the fix at the
generator instead of patching a generated file.
Ruby 3.0 through 3.2 are all out of support and none of them is tested any
more, so claiming ">= 3.0" overstates what the gem is known to run on.

The activeadmin dependency is untouched: narrowing the tested Rails range is
not evidence the gem broke on older Active Admin, and raising a runtime floor
would be a breaking change for consumers.
@Fivell Fivell self-assigned this Oct 1, 2026
@Fivell
Fivell merged commit d042c4a into main Oct 2, 2026
6 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