Skip to content

Upgrade Rails from 7.1 to 8.1 - #919

Open
jsuchal wants to merge 13 commits into
mainfrom
rails-8-upgrade
Open

jsuchal wants to merge 13 commits into
mainfrom
rails-8-upgrade

Conversation

@jsuchal

@jsuchal jsuchal commented Oct 15, 2026

Copy link
Copy Markdown
Member

The problem

Aplikácia beží na Rails 7.1.6. Chceme na 8.x (bezpečnostné záplaty, podpora). Upgrade ale neblokujú len samotné Rails — bez zmeny sa nedajú vyriešiť tieto závislosti a zmeny správania:

  • rails-i18n mal v locku railties (< 8), view_component 3.10 activesupport (< 8.0), annotate 3.2.0 activerecord (< 8.0) (novšia verzia neexistuje).
  • Rails 8.0 odstránil keyword formu enum status: {…}.
  • Rails 7.2 začali testy rešpektovať config.active_job.queue_adapter z application.rb (:good_job), čo by zhodilo job testy.
  • Rails 7.2 zmenil viazanie polí v PostgreSQL (ARRAY[?] skončilo ako integer[] && text[]).
  • ViewComponent 4 zakazuje vyrenderovať tú istú inštanciu komponenty dvakrát (mobilný aj desktopový sidebar ju zdieľali).
  • Rails 8.1 sprísnil JSON escapovanie a zmenil znenie ParameterMissing (viditeľné v API).

Solution

Postupný upgrade 7.1 → 7.2.4 → 8.0.5.1 → 8.1.4, každý krok samostatný commit a config.load_defaults s príslušným new_framework_defaults_* (7.2/8.0/8.1); bin/rails app:update som zámerne nespúšťal, zmeny v configu som preniesol ručne.

Konkrétne zmeny v kóde/configu:

  • enum :status, {…} v message_drafts_import.rb (keyword forma je v 8.0 preč).
  • config.active_job.queue_adapter = :test v test env + test/helpers/good_job_helper.rb pre testy, ktoré reálne spúšťajú GoodJob frontu (7.2 prestal adaptér prebíjať).
  • ARRAY[?]::integer[] v searchable/message_thread.rb a filter_subscription.rb + regresný test (7.2 zmenil typovanie bindov).
  • SidebarMenu#menu skladá menu pre každý render zvlášť — inak ViewComponent 4 padá na znovupoužití inštancie medzi mobilným a desktopovým sidebarom.
  • good_job_control_concurrency_with a API znenie ParameterMissing zachované (klientmi viditeľný string).
  • JSON escapovanie zámerne držím bezpečné: action_controller.escape_json_responses = true a active_support.escape_js_separators_in_json = true (Rails 8.1 default je false) + regresný test v test/integration/boxes_api_test.rb, ktorý overuje escapovanie <>& a U+2028/2029. Obe nastavenia sú v Rails 8.2 deprecated, takže bude treba revíziu — je to poznamenané v new_framework_defaults_8_1.rb.
  • annotate → annotaterb (lib/tasks/annotate_rb.rake + .annotaterb.yml) a good_job 4.19 → 4.22 vrátane nových migrácií (indexy + good_job_concurrency_claims) a testu GoodJob.migrated?, ktorý zabráni tichému zaostávaniu schémy pri ďalšom bumpu.

Zámerne mimo rozsahu: nemigroval som db/schema.rb naslebo a nemenil poradie stĺpcov; public/openapi.yaml ostáva bez zmeny. Tento PR neobsahuje Tailwind ani Ruby — tie idú v samostatných PR.

Overenie: celá sada na Ruby 3.3.12 (teda bez Ruby upgradu).

Demo

Not applicable — ide o upgrade frameworku bez vizuálnej zmeny. Dôkazom je zelená sada:

sada pred (7.1.6) po (8.1.4)
bin/rails test 587 / 0F / 3S 590 / 0F / 3S
bin/rails test:system 85 / 0F 85 / 0F
bin/rails test:integration 137 / 0F 138 / 0F

(Počty rastú o nové regresné testy: array-tag scope a JSON escaping v API.)

Poznámka: test:system má občasný pre-existing flake (sign_in_as/export preview timing) — padá rovnako na main, nie je to regresia tohto PR.

Comment thread app/controllers/api_controller.rb Outdated
@jsuchal
jsuchal requested a review from celuchmarek October 15, 2026 11:57
@celuchmarek

Copy link
Copy Markdown
Member

@jsuchal nemali by sa pri takomto upgrade upgradnúť aj veci v bin adresári? Napr. v rails 8 je už v docker entrypoint aj ten jemalloc.

A druhá otázka - potrebujeme tu v GO ešte ten yarn a package.json? V AGP sa používa tw4 aj turbo aj stimulus a žiadny yarn ani package.json tam nie je. Používa sa tam importmap a vybavené. Toto nechceme tiež meniť?

@jsuchal

jsuchal commented Oct 16, 2026

Copy link
Copy Markdown
Member Author

@jsuchal nemali by sa pri takomto upgrade upgradnúť aj veci v bin adresári? Napr. v rails 8 je už v docker entrypoint aj ten jemalloc.

A druhá otázka - potrebujeme tu v GO ešte ten yarn a package.json? V AGP sa používa tw4 aj turbo aj stimulus a žiadny yarn ani package.json tam nie je. Používa sa tam importmap a vybavené. Toto nechceme tiež meniť?

dobra poznamka. dal som agentovi spravit bokom vanilla rails 8.1 app a nech najde zmeny a spravi tak aby dobre bolo. pushujem.

Removing jsbundling-rails while adopting importmap assets dropped the
yarn install that used to run before the tests, so puppeteer (a
package.json runtime dependency used by Grover) was no longer present on
the runner. MessageObjectsApiTest#test_can_get_PDF_visualization then hit
Grover::DependencyError and returned 500.

Install node dependencies explicitly with npm ci instead of relying on
the asset pipeline to do it as a side effect.
@jsuchal
jsuchal requested a review from a team as a code owner October 16, 2026 15:30

This branch has not been deployed

No deployments
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.

2 participants