Skip to content

Upgrade Ruby 3.3.11 -> 3.4.9 and DRY the version pins#73

Merged
JuanVqz merged 3 commits into
mainfrom
feature/ruby-3.4
Jul 7, 2026
Merged

Upgrade Ruby 3.3.11 -> 3.4.9 and DRY the version pins#73
JuanVqz merged 3 commits into
mainfrom
feature/ruby-3.4

Conversation

@JuanVqz

@JuanVqz JuanVqz commented Jul 7, 2026

Copy link
Copy Markdown
Member

What

Single-minor Ruby hop: 3.3.11 → 3.4.9 (latest 3.4 patch). Rails stays 8.0.5 on both boots. Follows #72 (Ruby 3.3, merged).

Ruby 3.4 makes Prism the default parser (ruby -v now shows +PRISM). For standard syntax this is invisible; it caught nothing here (boot + full suite green).

Also: collapse the version pins to one source of truth

Per review — the exact patch version was previously duplicated across 6 files. Now:

  • .ruby-version is the single source.
  • Gemfile reads it: ruby file: ".ruby-version".
  • CI reads it: ruby/setup-ruby ruby-version-file: ".ruby-version".
  • Removed .ruby-version.sample (redundant — .ruby-version is tracked, so a fresh clone always has it) and the now-dead bin/setup block that copied the sample into place.
  • .tool-versions (asdf) and Dockerfile (base image tag) still carry the literal version — neither can read .ruby-version at the point it's needed — so the version now lives in 3 places instead of 6.

Lockfiles

Relocked on 3.4.9: RUBY VERSION3.4.9p82, PLATFORMS stays ruby only, BUNDLED WITH2.6.9 (bundler shipped with Ruby 3.4.9).

Verification (host, asdf ruby 3.4.9, Postgres 16.13)

  • Deprecation sweep on 3.3.11 (RUBYOPT="-W:deprecated"): completely clean, zero warnings.
  • Ruby-floor audit: bundle lock resolved with no gem required_ruby_version conflicts.
  • Bundler resolves the ruby file: directive from .ruby-version.
  • Boot smoke: dev and production both boot clean.
  • Suite: green — 16 runs, 52 assertions, 0 failures, 0 errors.

JuanVqz added 3 commits July 7, 2026 15:05
Single-minor Ruby hop to the latest 3.4 patch (already on the latest 3.3
patch, so no pre-step bump). Rails stays 8.0.5 on both boots. 3.4 makes
Prism the default parser (ruby -v now shows +PRISM) -- an internal change
for standard syntax; caught nothing here (boot + suite green).

Also collapse the Ruby version to a single source of truth per review:
- .ruby-version is now the one place the exact patch lives.
- Gemfile reads it: `ruby file: ".ruby-version"`.
- CI reads it: ruby/setup-ruby `ruby-version-file: ".ruby-version"`.
- Removed .ruby-version.sample (redundant: .ruby-version is tracked, so a
  fresh clone always has it) and the now-dead bin/setup block that copied
  the sample into place.
- .tool-versions (asdf) and Dockerfile (base image tag) still carry the
  literal version -- neither can read .ruby-version at the point it's
  needed -- so the version now lives in 3 places instead of 6.

Locks relocked on 3.4.9 (RUBY VERSION 3.4.9p82, PLATFORMS ruby only,
BUNDLED WITH -> 2.6.9 from the bundler shipped with 3.4.9).

Verified on the host (asdf ruby 3.4.9):
- Deprecation sweep on 3.3.11: completely clean, zero warnings.
- bundle lock: no gem required_ruby_version conflicts.
- Bundler resolves the `ruby file:` directive from .ruby-version.
- Dev and production boot clean; suite green (16 runs, 52 assertions,
  0 failures, 0 errors).
CI lint failed on the Ruby 3.4 hop with `RuboCop found unknown Ruby
version: 3.4` -- rubocop 1.59.0 (Dec 2023) predates Ruby 3.4 and, with
no explicit TargetRubyVersion, infers 3.4 from the bumped Ruby and
aborts.

`bundle update rubocop rubocop-ast rubocop-rails rubocop-rails-omakase`
in both lockfiles: rubocop 1.59.0 -> 1.88.1, rubocop-rails 2.23.1 ->
2.35.5, rubocop-rails-omakase 1.0.0 -> 1.1.0. `bundle exec rubocop -c
./.rubocop_with_todo.yml .` now runs clean -- 42 files, no offenses (no
new cops flagged existing code).
autoprefixer-rails (Sprockets asset compile) needs a JS runtime, and
ExecJS auto-detects one off PATH. On a machine with a Bun shim on PATH
(e.g. asdf), it picks Bun, which autoprefixer-rails rejects:
"Your ExecJS runtime Bun.sh isn't supported by autoprefixer-rails".
This hit `bin/dev` locally; it's not Ruby-version-specific.

Pin EXECJS_RUNTIME=Node in .env.sample (dotenv-rails loads it before
assets compile) so the app uses Node -- already the intended runtime
(nodejs is in .tool-versions). .env is gitignored, so apply the same
line to your local .env (bin/setup seeds a fresh one from this sample).
@JuanVqz JuanVqz merged commit 079bb4f into main Jul 7, 2026
2 checks passed
@JuanVqz JuanVqz deleted the feature/ruby-3.4 branch July 7, 2026 21:15
@JuanVqz JuanVqz linked an issue Jul 7, 2026 that may be closed by this pull request
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.

Upgrade to Ruby 3.4

1 participant