Quoi de neuf dans Ruby on Rails 8 : avec Rails 8.0 Beta 1, pas de PaaS (platform-as-a-service) requis et intégration avec Kamal 2 pour des déploiements sans soucis.

La première version bêta de Rails 8 a été officiellement publiée, apportant un ensemble passionnant de fonctionnalités, de corrections de bugs et d'améliorations. Rails 8 est préconfiguré avec Kamal 2 pour déployer votre application n'importe où. Que ce soit sur une VM dans le cloud ou sur votre propre matériel. Pour réduire le nombre de services accessoires nécessaires pour démarrer, Rails 8 introduit un trio de nouveaux adaptateurs adossés à la base de données avec SQLite, nommés Solid Cable, Solid Cache et Solid Queue.

Ruby on Rails (simplifié en Rails) est un framework d'application web côté serveur écrit en Ruby sous la licence MIT. Rails est un cadre modèle-vue-contrôleur (MVC), qui fournit des structures par défaut pour une base de données, un service web et des pages web. Il encourage et facilite l'utilisation de standards web tels que JSON ou XML pour le transfert de données et HTML, CSS et JavaScript pour l'interface utilisateur. Outre le MVC, Rails met l'accent sur l'utilisation d'autres modèles et paradigmes bien connus du génie logiciel, notamment la convention plutôt que la configuration (CoC), le principe "ne pas se répéter" (DRY) et le modèle de l'enregistrement actif.

La première version bêta de Rails 8 a été officiellement publiée, apportant un ensemble passionnant de fonctionnalités, de corrections de bugs et d'améliorations. Cette version s'appuie sur les fondations de Rails 7.2, tout en introduisant de nouvelles fonctionnalités et optimisations pour rendre le développement Rails encore plus productif et agréable.

Parmi les points forts, citons l'intégration avec Kamal 2 pour des déploiements sans souci, l'introduction de Propshaft en tant que nouveau pipeline d'actifs par défaut, et des améliorations considérables d'ActiveRecord. Rails 8 apporte également plusieurs améliorations à l'intégration de SQLite, ce qui en fait une option viable pour une utilisation en production.

Nom : 1.jpg
Affichages : 4822
Taille : 7,3 Ko

Voici l'annonce de la sortie de Rails 8.0 Beta 1 :

Le déploiement d'applications web modernes - avec toutes les dispositions nécessaires pour être rapides et sûres tout en étant facilement actualisables - est devenu si difficile que de nombreux développeurs n'osent pas le faire sans un PaaS (platform-as-a-service). Mais c'est ridicule. Personne ne devrait avoir à payer des ordres de grandeur plus élevés pour l'informatique de base juste pour rendre le déploiement convivial et utilisable. C'est un travail pour l'open source, et Rails est prêt à le résoudre.

C'était la prémisse de ma présentation ici à Rails World, et c'est la mission de Rails 8. Nous sommes donc ravis de publier la première version bêta de cette nouvelle version à l'occasion de Rails World, ici à Toronto.

Bien qu'il s'agisse d'une version bêta, la grande majorité des éléments inclus ont déjà fait l'objet de tests approfondis. Rails a la chance unique d'avoir d'énormes applications comme Shopify et GitHub, ainsi que de nombreuses autres applications de toutes tailles, qui s'exécutent directement sur la pointe du framework afin de s'assurer que les problèmes sont détectés rapidement.

De plus, tous les nouveaux outils de déploiement, ainsi que Solid Cache et Solid Queue, ont permis à 37signals de sortir du cloud depuis plus de 18 mois dans des applications telles que Basecamp et HEY.

Cependant, il y aura toujours des problèmes avec les nouveaux outils, et nous vous serions reconnaissants de nous aider à les trouver en mettant à jour vos applications vers Rails 8 avant la sortie de la version finale. Faisons en sorte que cette version soit aussi SOLIDE que possible !

Voici les principales nouveautés de cette version :

Intégration Kamal 2 + Thruster

Rails 8 est préconfiguré avec Kamal 2 pour déployer votre application n'importe où. Que ce soit sur une VM dans le cloud ou sur votre propre matériel. Kamal prend une boîte Linux fraîche et la transforme en un serveur d'applications ou d'accessoires avec une seule commande "kamal setup". Tout ce dont il a besoin, ce sont les adresses IP d'un ensemble de serveurs avec votre clé SSH déposée, et vous serez prêt à passer en production en moins de deux minutes.

Kamal peut faire cela si facilement parce que Rails est déjà livré avec un fichier Docker très efficace et réglé pour transformer votre application en une image de conteneur prête pour la production dès la sortie de la boîte. Tout ce dont vous avez besoin, c'est de votre propre compte de registre de conteneurs, comme Docker Hub ou GitHub, pour stocker les images.

Dans Rails 8, ce fichier Docker a été mis à jour pour inclure un nouveau proxy appelé Thruster, qui se trouve devant le serveur web Puma pour fournir l'accélération X-Sendfile, la mise en cache des actifs et la compression des actifs. Cela signifie qu'il n'est pas nécessaire de mettre un Nginx ou tout autre serveur web devant. Le conteneur Rails par défaut est prêt à accepter le trafic de l'internet immédiatement.

Kamal 2 inclut également un proxy, cette fois une unité sur mesure appelée Kamal Proxy pour remplacer l'option générique Traefik utilisée au lancement. Ce proxy fournit des déploiements super rapides sans temps d'arrêt, des certificats SSL automatisés via Let's Encrypt, et un support pour de multiples applications sur un seul serveur sans aucune configuration compliquée.

Avec une stratégie révisée pour gérer les secrets (avec une intégration intégrée pour 1password, Bitwarden, et LastPass) et une nouvelle fonctionnalité d'alias pour obtenir des commandes comme "kamal console" pour démarrer une session de console Rails à distance, il fournit un ensemble complet pour gérer non seulement le déploiement mais aussi l'exploitation de votre application en production.


Une solide réduction des dépendances

Pour faciliter le déploiement de Rails, il faut notamment réduire le nombre de services accessoires nécessaires pour démarrer. Dans le passé, Rails avait besoin de MySQL ou PostgreSQL ainsi que de Redis pour profiter pleinement de toutes ses fonctionnalités, comme les jobs, la mise en cache et les WebSockets. Désormais, tout cela peut être fait avec SQLite grâce à un trio de nouveaux adaptateurs adossés à la base de données, nommés Solid Cable, Solid Cache et Solid Queue.

Ces adaptateurs sont tous créés à partir du même principe : les disques sont devenus suffisamment rapides pour que nous n'ayons plus besoin de RAM pour autant de tâches. Cela permet de récolter les avantages de la simplification des disques SSD et NVMe qui sont des ordres de grandeur plus rapides que la bonne vieille rouille tournante.

  • Solid Cable

    Solid Cable remplace Redis en tant que serveur pubsub pour relayer les messages WebSocket de l'application aux clients connectés à différents processus. Il utilise un polling rapide, mais il reste presque aussi rapide que Redis, lorsqu'il est exécuté par le même serveur sur SQLite. C'est bien assez rapide pour la plupart des applications. En prime, Solid Cable conserve par défaut les messages envoyés dans la base de données pendant une journée, ce qui peut faciliter le débogage des problèmes délicats de mise à jour en direct.

  • Solid Cache

    Solid Cache remplace Redis ou Memcached pour le stockage des caches de fragments HTML en particulier. En plus de se débarrasser de la dépendance du service accessoire, il permet également de disposer d'un cache beaucoup plus grand et moins cher grâce à l'utilisation d'un disque plutôt que de la mémoire vive. Cela signifie que votre cache peut vivre plus longtemps et couvrir encore plus de requêtes en dehors de la planche du 95e ou 99e percentile. En outre, ce cache peut être crypté et géré par une limite de rétention explicite (comme 30 ou 60 jours). Il est ainsi plus facile de respecter les politiques et les attentes modernes en matière de protection de la vie privée.

    Solid Cache est en production chez Basecamp depuis plus d'un an. Il stocke 10 téraoctets de données, permet une fenêtre de rétention de 60 jours et a réduit de moitié les temps de rendu du P95 après son introduction.

  • Solid Queue

    Solid Queue remplace non seulement Redis, mais aussi un cadre d'exécution de tâches distinct, comme Resque, Delayed Job ou Sidekiq, pour la plupart des gens. Pour les installations de haute performance, il est construit sur le nouveau mécanisme FOR UPDATE SKIP LOCKED introduit pour la première fois dans PostgreSQL 9.5, mais maintenant aussi disponible dans MySQL 8.0 et au-delà. Pour des besoins plus modestes, il fonctionne également avec SQLite, ce qui le rend idéal pour ce chemin sans dépendance vers le premier coup de dopamine HELLO WORLD que vous obtenez en voyant votre travail en production immédiatement.

    Solid Queue peut être exécuté en tant que plugin puma, ce qui est le cas par défaut sur une installation à serveur unique, ou en utilisant la nouvelle commande bin/jobs pour démarrer un répartiteur dédié. Il est possible de faire fonctionner plusieurs répartiteurs traitant des files d'attente dédiées en fonction d'un réglage de performance sur mesure, le tout avec un schéma de configuration flexible qui ne demande aucun réglage à la sortie de la boîte, mais qui vous donne tous les cadrans une fois que vous en avez besoin.

    Il possède pratiquement toutes les fonctionnalités que l'on peut attendre d'un système moderne de mise en file d'attente des travaux. Il comprend des contrôles robustes de la concurrence, des tentatives d'échec et des alertes, la planification de tâches récurrentes, et bien plus encore. En HEY, il a remplacé pas moins de 6 ( !) différents Resque gems, en tant que solution intégrée unique.


Préparer SQLite pour la production

En plus du trio d'adaptateurs Solid qui permet à SQLite d'alimenter Action Cable, Rails.cache et Active Job, beaucoup de travail a été effectué pour rendre l'adaptateur SQLite et le pilote Ruby adaptés à une utilisation en production réelle dans Rails 8.

Chez 37signals, ils construisent une suite croissante d'applications qui utilisent SQLite en production avec ONCE. Il y a maintenant des milliers d'installations de Campfire et de Writebook qui tournent dans la nature et qui utilisent toutes SQLite. Cela signifie qu'il y a beaucoup de pression dans le monde réel pour s'assurer que Rails (et Ruby) fonctionne aussi bien que possible avec cette merveilleuse base de données basée sur des fichiers. Grâce à des paramètres par défaut comme WAL et le mode IMMEDIATE.


Remplacer les pignons par des arbres de transmission

Mais Rails 8 ne se limite pas à une meilleure histoire de déploiement et à des adaptateurs adossés à des bases de données. Rails 8 fait également de Propshaft le nouveau pipeline d'actifs par défaut. Propshaft est un dividende de la mission de se concentrer sur #NOBUILD comme chemin par défaut dans Rails 7 (et de décharger les configurations JavaScript plus compliquées vers bun/esbuild/vite/etc). En tant que nouveau pipeline d'actifs, il remplace l'ancien système Sprockets, qui date de 2009. Une époque où les transpileurs JavaScript et les pipelines de construction tels que nous les connaissons aujourd'hui n'existaient pas encore. Et bien avant que nous puissions imaginer des navigateurs avec des implémentations JavaScript stellaires, des cartes d'importation, et sans contraintes de nombreux petits fichiers grâce à HTTP/2.

C'est un excellent exemple de la nécessité de prendre de temps en temps une nouvelle feuille de papier et d'examiner à nouveau un problème familier à partir des premiers principes. Et il s'avère que, dans le nouveau monde #NOBUILD, le pipeline d'actifs n'a besoin de faire que deux choses principales : Fournir un chemin de chargement pour les actifs et les estampiller avec des digests pour permettre une expiration lointaine. C'est à peu près tout. Sprockets a fait un million d'autres choses, la plupart d'entre elles d'une manière qui était depuis longtemps tombée en désuétude, et dans un état de délabrement qui avait peu de contributeurs désireux ou capables d'aider à y remédier.

Sprockets a été en service pendant 15 ans, mais le futur du pipeline d'actifs dans Rails s'appelle Propshaft. Et c'est maintenant la solution par défaut pour toutes les applications Rails 8, bien que Sprockets reste supporter pour les applications existantes.


Générer les bases de l'authentification

Enfin, faciliter le passage à la production signifie également faciliter la sécurité. Rails assemble depuis longtemps des abstractions de haut niveau pour les composants clés d'un excellent système d'authentification afin d'apporter cette facilité. Il y a has_secure_password depuis Rails 5, mais récemment introduit, il y a generates_token_for :password_reset avec authenticate_by dans Rails 7.1. Maintenant, avec Rails 8, toutes les pièces se rassemble dans un générateur de système d'authentification complet, ce qui crée un excellent point de départ pour un système d'authentification basé sur la session, réinitialisable par mot de passe et avec suivi des métadonnées.

Lancez simplement bin/rails generate authentication et vous obtiendrez des modèles de base pour Session et User, ainsi qu'un PasswordsMailer, un SessionsController et un groupe Authentication. Tout ce que vous avez à apporter est un flux d'inscription de l'utilisateur (puisque ceux-ci sont généralement adaptés à chaque application). Vous n'avez pas à craindre de mettre en place votre propre configuration d'authentification avec ces bases fournies ou de payer un fournisseur pour cela.


Et tout le reste

Rails 8 sort quelques mois seulement après Rails 7.2, mais en plus de tous ces nouveaux outils incroyables présentés ci-dessus, il inclut également une multitude de corrections et d'améliorations.


Source : "Rails 8.0 Beta 1: No PaaS Required"

Et vous ?

Que pensez-vous de cette mise à jour ?

Voir aussi :

Pourquoi Ruby on Rails ne serait pas encore mort, d'après Patrick Helm, développeur back-end

RubyMine 2024.2 est disponible : Mises à jour pour Rails, prise en charge intégrée du framework JavaScript Stimulus et bien d'autres améliorations

La version 3.3 du langage de programmation Ruby est disponible avec un nouvel analyseur "Prism" et un compilateur JIT purement Ruby