Drop EOL Ruby and Rails from CI - #90
Merged
Merged
Conversation
Ruby 3.2 reached EOL on 2026-03-31 and Rails 7.1 (2025-10-01) and
7.2 (2026-08-09) are both past EOL, so testing them no longer tells
us anything we act on. New matrix is a plain product:
ruby: ['3.3', '3.4', '4.0']
rails: ['8.0.0', '8.1.0']
ActiveAdmin keeps all four entries. The old
exclude:
- rails: '8.0.0'
activeadmin: '3.2.0'
is deleted rather than carried over: it dates from before AA 3.2.x
supported Rails 8, and `~> 3.2.0` now resolves to activeadmin 3.2.5,
which installs and passes the full suite on both Rails 8.0 and 8.1.
Nothing in the new matrix needs excluding, so the matrix has no
`exclude:` key at all.
The dummy app generator gains --skip-javascript. Rails 8.1's app
template emits `stale_when_importmap_changes` in ApplicationController
whenever importmap is in use, but the specs boot the dummy app under
*this gem's* Gemfile, which has no importmap-rails, so every example
died with:
NameError: undefined local variable or method
'stale_when_importmap_changes' for class ApplicationController
The dummy app's asset pipeline comes from sprockets-rails/sass-rails in
the gem's Gemfile, so it never needed a JS bundler of its own.
Coverage-badge steps now gate on ruby 4.0 / rails 8.1.0 / AA 3.5.1 --
the newest cell in the new matrix, and exactly 1 of the 24 legs, so
still exactly one badge artifact.
Gemfile's local default Rails drops to 8.0.0 for the same EOL reason;
CI always sets RAILS explicitly, so this only affects a bare `bundle`.
required_ruby_version was '>= 3.1.0', but Ruby 3.1 (EOL 2025-03-26) and 3.2 (EOL 2026-03-31) are no longer in CI, so that floor claimed support we do not test. 3.3 is the oldest Ruby the matrix exercises. The activeadmin dependency stays at ">= 3.0", "< 4.0": no ActiveAdmin version was dropped from the matrix (all four of 3.2.0, 3.3.0, 3.4.0 and 3.5.1 install and pass on Rails 8.0 and 8.1), and narrowing a runtime floor would be a breaking change for consumers regardless. No version bump and no release.
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 CI and raises the gemspec Ruby floor to match. No gem version bump, no release.
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.1']['3.2.0', '3.3.0', '3.4.0', '3.5.1'](unchanged)rails 8.0.0 x activeadmin 3.2.0Why these versions (endoflife.date)
Removed:
Kept / added:
Rails 8.2 is not released (
mainis8.2.0.alpha, no tag or pre-release), so it is not added.ActiveAdmin versions dropped: none
Dropping Rails <= 7.2 can strand old ActiveAdmin versions that never supported Rails 8, so every AA entry was re-checked against both Rails 8.0 and 8.1 rather than assumed. All four resolve, install, and pass the full suite:
(Ruby 3.4.10, each leg with a freshly generated dummy app.)
So the existing
is deleted, not carried over. It dates from before AA 3.2.x supported Rails 8;
~> 3.2.0now resolves to activeadmin 3.2.5, which installs and goes 10/10 on both Rails 8.0 and 8.1. Keeping it would have silently skipped three working legs.bundle installnever refused an AA version, so none was dropped and theactiveadmingemspec dependency stays">= 3.0", "< 4.0".The new matrix has no
exclude:key at all.On the Ruby 3.3 x Rails 8.1 cell: deliberately NOT excluded
This gem does pull actionview, so the known actionview 8.1 parse bug was in scope and was checked rather than assumed:
actionview 8.1.4
capture_helper.rb:50forwards anonymous rest args inside a block, which is aSyntaxErroron Ruby 3.3.0 — but only on 3.3.0, the very first 3.3 release. Later 3.3 patches lifted the parser restriction, andruby/setup-rubywithruby-version: '3.3'installs the newest 3.3 patch (3.3.12), so CI never sees it. Verified here, including the full suite on 3.3.12 x Rails 8.1:The same local-interpreter artifact showed up independently in simplecov: on Ruby 3.3.0,
simplecov/result_merger/resultset_store.rb:38(LOCK_MONITOR.synchronize { with_flock(&) }) fails to parse on every simplecov release tried — 1.2.0, 1.3.0, 1.3.1 and 1.3.2 — which is what rules out "a bad gem release" and confirms it is the 3.3.0 interpreter. simplecov 1.3.2 parses fine on 3.3.12 and 3.4.10. Accordingly no simplecov pin, no conditionalgem "rails", RUBY_VERSION >= ...line, and no matrix exclude were added; nothing in the repo was changed to accommodate 3.3.0.Rails 8.1 dummy-app fix (
--skip-javascript)Adding Rails 8.1 to the matrix surfaced a genuine failure in the dummy app, not a version-support problem. Rails 8.1's app template emits
stale_when_importmap_changesinApplicationControllerwhenever importmap is in use, but the specs boot the dummy app under this gem'sGemfile, which has noimportmap-rails:The dummy app's asset pipeline comes from
sprockets-rails/sass-railsin the gem's Gemfile, so it never needed a JS bundler of its own.rails new ... --skip-javascriptmakesusing_importmap?false and the line is no longer generated. Rails 8.0 legs are unaffected (its template has no such line) and stay green.Local verification
Run on this machine with rbenv;
CI=trueis set because Rails 8's generatedconfig/environments/test.rbhasconfig.eager_load = ENV["CI"].present?, and ActiveAdmin needs the eager load for resource registration — without it thefilter_form_specexamples 500 withundefined method 'values' for nilinbatch_actions. That reproduces identically on unmodified master, on the Rails 8.0.0 / AA 3.5.1 leg CI already reports green, so it is a local-only artifact of this harness and not a regression from this PR.Primary leg — Ruby 3.4.10 / Rails 8.1.0 / AA 3.5.1 (newest Rails in the matrix):
Corners:
Resolved versions on the ceiling leg:
rails (8.1.4),actionview (8.1.4),activeadmin (3.5.2),simplecov (1.3.2).Flake, locally: none. These are JS-heavy cuprite feature specs, but across roughly 20 local suite runs here no example flaked — every failure seen was deterministic and reproducible, and each was traced to a cause above (importmap,
eager_load, or the 3.3.0 parser).CI result
All 24/24 legs pass.
deploy-coverageshowsskipping, which is expected: it is gated ongithub.ref == 'refs/heads/master' && github.event_name == 'push'.The first run had 23/24 with one failure on
Ruby 4.0 / Rails 8.1.0 / AA 3.2.0, and it was the flake already documented inspec/support/capybara.rbrather than a real failure:9 of 10 examples passed in that leg; only the first one to launch Chrome died, and the job took 2m40s against ~1m50s for its siblings. That comment in
capybara.rbsays a rerun is currently the answer, so the job was rerun and passed in 57s with no code change. Flagging it because it is a pre-existing intermittent condition on GitHub runners that this PR neither causes nor fixes — expect the occasional rerun.Coverage badge gating
Generate badge.jsonandUpload badge artifactmoved fromruby 3.4 / rails 8.0.0 / AA 3.5.1toruby 4.0 / rails 8.1.0 / AA 3.5.1— the newest cell in the new matrix. Checked against the parsed workflow so the badge is neither dropped nor duplicated:gemspec
required_ruby_version'>= 3.1.0'->'>= 3.3'. Ruby 3.1 (EOL 2025-03-26) and 3.2 are no longer tested, so the old floor claimed untested support. Rails/activesupport dependency floors and theactiveadmindependency are left alone, and the gem version is unchanged.There is no CHANGELOG in this repo, so none was created.
Nothing to change for
.ruby-version,.rubocop.ymlor the README: the repo has no.ruby-versionand no.rubocop.yml(so noTargetRubyVersionto keep in sync withrequired_ruby_version), and the README has no badges or supported-versions table naming a Ruby or Rails version.