ci: drop EOL Ruby and Rails from the matrix - #28
Merged
Merged
Conversation
Ruby 3.2 reached EOL 2026-03-31; Rails 7.1 on 2025-10-01 and Rails 7.2 on
2026-08-09 (endoflife.date). The matrix is now a plain product of Ruby
3.3/3.4/4.0 against Rails 8.0.0/8.1.0, with no version excludes.
All four ActiveAdmin entries are kept, and the stale `rails: 8.0.0 /
activeadmin: 3.2.0` exclude is deleted. Its premise no longer holds: the
Gemfile pins `~> #{ENV['AA']}`, so the '3.2.0' leg resolves to activeadmin
3.2.5, which does support Rails 8. Every AA x Rails 8.x pair was checked
with a real bundle install plus the full suite and all eight are green, so
the rule was only hiding a working cell.
The dummy-app generator needed --skip-javascript. rails_template.rb
discards the generated app's Gemfile and boots the app under this gem's
sprockets bundle, so importmap-rails is never present, while Rails 8.1's
`rails new` emits `stale_when_importmap_changes` in ApplicationController.
Without the flag every Rails 8.1 leg fails to boot with:
app/controllers/application_controller.rb:6:in '<class:ApplicationController>':
undefined local variable or method 'stale_when_importmap_changes' (NameError)
The coverage badge and Pages deploy now gate on the newest cell in the new
matrix, Ruby 4.0 / Rails 8.1.0 / AA 3.5.0, which matches exactly one of the
24 legs.
Ruby 3.1 and 3.2 are both EOL and no longer in CI, so `>= 3.1.0` advertised support for versions nothing tests. The activeadmin dependency stays at `>= 3.0, < 4.0`: no ActiveAdmin version was dropped from the matrix, and narrowing a runtime floor would be a breaking change for consumers regardless.
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.
Drops end-of-life Ruby and Rails from the CI matrix and raises the gemspec Ruby floor to match.
Matrix: before / after
['3.2', '3.3', '3.4']['3.3', '3.4', '4.0']['7.1.0', '7.2.0', '8.0.0']['8.0.0', '8.1.0']['3.2.0', '3.3.0', '3.4.0', '3.5.0']['3.2.0', '3.3.0', '3.4.0', '3.5.0'](unchanged)rails: 8.0.0×activeadmin: 3.2.036 legs minus 3 excluded = 33 before; 3 × 2 × 4 = 24 after, no excludes.
Why each removal
Source of truth: endoflife.date/ruby, endoflife.date/rails.
Kept: Ruby 3.3 (EOL 2027-03-31, security-only — the new floor), Ruby 3.4 (2028-03-31), Ruby 4.0 (2029-03-31), Rails 8.0 (EOL 2026-11-07, oldest still supported), Rails 8.1 (2027-10-10). Rails 8.2 is not released (
mainis8.2.0.alpha, no tag or pre-release), so it is not added.ActiveAdmin versions: none dropped
Dropping Rails ≤ 7.2 looked like it would strand the old ActiveAdmin entries, and the existing
excludesuggested AA 3.2.0 could not run Rails 8. That turned out to be false, so all four AA versions stay.The Gemfile pins
gem 'activeadmin', "~> #{ENV['AA'] || default}", so the3.2.0leg means~> 3.2.0→>= 3.2.0, < 3.3.0, which resolves to activeadmin 3.2.5 — a release that postdates theexcludeand does support Rails 8. The rule was only hiding a cell that works.bundle installevidence, Ruby 3.4.10, every AA × Rails 8.x pair — all resolved, nothing refused:And the full suite on each of those eight pairs:
No Ruby 3.3 × Rails 8.1 exclude
This PR was originally briefed to exclude Ruby 3.3 × Rails 8.1, because actionview 8.1.4 contains
which forwards anonymous rest args inside a block. The exclude is not needed and is not here. That parser restriction exists only in Ruby 3.3.0, the very first 3.3 release, and was lifted in later 3.3 patches. Measured locally:
ruby/setup-rubywithruby-version: '3.3'installs the newest 3.3 patch (3.3.12 today), so CI never sees it. The same applies tosimplecov 1.3.2(def synchronize(&)forwarded inside a block), which also only fails to parse on 3.3.0. Nothing was pinned or conditionalised to work around it. The Ruby 3.3 × Rails 8.1 cell is verified green below.This gem does pull actionview, so the exclude would have applied had it been real:
Coverage badge / Pages gating
The badge and
gh-pagesdeploy were gated onruby == '3.4' && rails == '8.0.0' && activeadmin == '3.5.0'. Rails 8.0.0 is no longer the newest Rails in the matrix, so bothif:conditions now point at the newest cell that exists:With no excludes in play that matches exactly one of the 24 legs, so the run still produces exactly one
coverage-badgeartifact — not zero, not several. Ruby 4.0 / Rails 8.1 / AA 3.5 is verified green locally (see below).One real fix was needed:
--skip-javascriptAdding Rails 8.1 to the matrix exposed a genuine break in the test harness, not just a matrix edit.
spec/support/rails_template.rbends withrun "rm -f Gemfile Gemfile.lock"— the generated dummy app's own Gemfile is discarded and the app boots under this gem's bundle, which hassprockets-rails/sass-railsand noimportmap-rails. Rails 8.1'srails newemits an importmap-dependent line intoApplicationController, so every 8.1 leg died at boot:Fixed at the source in
tasks/test.rakeby passing--skip-javascripttorails new, so the generator never adds the importmap dependency in the first place (rather than patching the generated file afterwards). The suite is sprockets-driven, so nothing is lost. Verified still green on Rails 8.0 as well.gemspec
required_ruby_version:>= 3.1.0→>= 3.3. Ruby 3.1 (EOL 2025-03-26) and 3.2 are both EOL and untested.add_dependency "activeadmin", ">= 3.0", "< 4.0"— left alone. No AA version was dropped, and narrowing a runtime floor is a breaking change for consumers.There is no
.rubocop.yml, no.ruby-versionand noCHANGELOGin this repo, and the README has no supported-versions table or version-pinned badge, so nothing else needed updating. (With no.rubocop.ymlthere is noGemspec/RequiredRubyVersioncop to keep in sync.)Local verification
Ruby versions used: rbenv 3.3.0, 3.3.10, 3.3.12, 3.4.10, 4.0.6. Chrome present; suite is Capybara + cuprite.
Required run — Ruby 3.4.10 / Rails 8.1.0 / oldest AA kept (3.2.0):
The two new matrix corners, plus the cell the retracted exclude would have deleted:
Every leg run locally — 17 combinations across 5 interpreters — is green. No matrix leg was dropped to make anything pass.
One local-only gotcha worth recording
A bare local
rspecrun fails 11 of 13 examples withundefined method 'values' for nilinsideActiveAdmin::BatchActions::ResourceExtension#batch_actions. This is not a bug in the gem and not a Rails 8.1 issue — it reproduces identically on unmodifiedmasterat the combination CI runs green. Rails generatesconfig.eager_load = ENV["CI"].present?into the dummy app'sconfig/environments/test.rb, so withoutCIset, ActiveAdmin'sbefore_loadhooks have not run when the specs callActiveAdmin.register, and@batch_actionsis stillnil. SettingCI=true(as the GitHub runner does) gives 13/13. All runs above were made withCI=true.