Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Draft: Prochaine version de LinuxFr avec Rails7 #383

Draft
wants to merge 70 commits into
base: master
Choose a base branch
from
Draft

Draft: Prochaine version de LinuxFr avec Rails7 #383

wants to merge 70 commits into from

Conversation

Trim
Copy link
Member

@Trim Trim commented Mar 8, 2024

Je crée cette pull request en brouillon pour suivre le plan de ce commentaire.


Hello,

J'ai regardé en vitesse les premiers fichiers et ça à l'aire bien (decaffeinate semble avoir bien marché, merci pour l'ajout des commits avec les fixes des suggestions).

Comme il y a beaucoup de changements tout comme la migration de rails prévue par @echarp, ça va demander beaucoup de temps pour tester.

Je propose de fusionner les 2 développements ensemble et de ne faire les tests qu'une seul fois sur tout le site.

Le plan serait de:

  • Créer une branche "rails-7" depuis la master actuelle
  • Fusionner la PR Remove coffeescript, use plain javascript instead #378 dans celle-ci
  • Fusionner la PR Migration rails 7 #375
  • Fusionner ma branche qui met à jour les Dockerfile pour Ruby 3 / Rails 7
  • Publier une nouvelle version de board-linuxfr avec la mise à jour de Goliath (je vais publier sur le repository de Github j'ai publié sur rubygems.org avec le nom board-sse-linuxfr.org) pour que ça fonctionne avec Ruby 3
  • Ajouter un commit pour utiliser cette nouvelle version de board-linuxfr dans les Docker
  • Corriger l'insertion des images pour utiliser le service img-linuxfr (la méthode wikify ne semble plus fonctionner, les images des liens restent sur la source)
  • Utiliser par défaut le port 9000 pour ne plus avoir besoin de CAP réseau élevée (allow to use custom HTTP public port to permit rootless run #395)
  • Mettre à jour le fichier INSTALL.md
  • Faire le merge sur master (ou au moins faire un rebase et geler master)
  • Installer tout ça sur le domaine alpha.linuxfr.org
  • Demander aux différents acteurs de tester (admin, animateur, moderateur, mainteneur, visiteur) sur cette instance.

@Trim Trim marked this pull request as draft March 8, 2024 19:43
@Trim
Copy link
Member Author

Trim commented Mar 10, 2024

Pour la publication de la gem board-linuxfr sur Github Package Repository, j'ai réussi, mais c'est inutile: pour pouvoir télécharger la gem, il faut être connecté à Github, même si la gem est publique. Apparemment, Github ne compte pas changer ça.

Comme on n'a pas prévu de passer à Gitlab (qui sait faire ça, en tout cas pour node), je vais demander à Bruno les accès aux gems sur rubygems.org.

@Trim
Copy link
Member Author

Trim commented Mar 22, 2024

J'ai publié aujourd'hui la nouvelle version de la gem board-linuxfr sous le nom de board-sse-linuxfr.org sur rubygems.org

J'avais essayé le Github Package Repository, mais on n'est obligé d'avoir un token Github pour télécharger la gem, même si elle est publique. C'était donc inutile 👎

J'ai mis à jour les fichiers container pour utiliser cette nouvelle gem et nouvelle version.

Enfin, j'ai rebasé la branche sur master pour récupérer les derniers changements fusionnés ces dernières semaines.

J'ai voulu contrôler que les nouvelles fonctionnalités pour "les images externes bloquées" fonctionnent encore, mais j'ai l'impression qu'il y a un soucis avec le pipeline qui transforme le markdown en HTML (le tag src des balises <img> n'est pas mis à jour et les images n'apparaissent pas dans la liste des "images externes").

J'ai donc ajouté une tâche pour fixer ça avant de pousser sur alpha.

J'ai profité d'ajouter une deuxième tâche pour exécuter par défaut sans privilège root/réseau LinuxFr.

  • Corriger l'insertion des images pour utiliser le service img-linuxfr (la méthode wikify ne semble plus fonctionner, les images des liens restent sur la source)
  • Utiliser par défaut les ports 8080 et 4443 pour ne plus avoir besoin de CAP réseau élevée

@Trim
Copy link
Member Author

Trim commented Mar 23, 2024

Ouf, ce n'était pas le pipeline de Markdown vers HTML qui était à modifier, mais juste le modèle Image qui utilisait la méthode URI.encode (alias URI.escape) qui n'existe plus en Ruby 3.

Dépendant de la gemme rails-sass-images qui n'est plus développée
Ajout de "optional: true" pour les modèles qui permettent une valeur "null".

Document du comportement belongs_to:
https://sipsandbits.com/2015/09/21/whats-new-in-rails-5/#belongs_toisrequiredbydefault
Il y avait deux classes pour dynamiquement chercher des templates entre
les espaces de rédaction et modération, après tests et recherches il
semble que ça ne soit pas (ou plus?) nécessaire.
Tests et validations nécessaires, mais en pause car migration vers 7 prévue
La méthode est maintenant nommée File.exist?
(en tous cas du code testé d'après la gemme simplecov...)
Image caching were not working because the Image model silently decided
all image were "internal": the URI.encode (aka URI.escape) method does
not exist anymore in Ruby 3, which raised an error which where ignored
by the "rescue" line.

Instead of doing "URI.parse(URI.encode(str))", we are just doing
"URI.join(str)", because the join method converts firt the str to
RFC3986.

As this method does not raise error, the "rescue" part has been removed
too.
@Trim
Copy link
Member Author

Trim commented Mar 24, 2024

Aujourd'hui, j'ai mis à jour le fichier docker-compose.yaml de la branche master pour inclure les commandes healthchek qui vérifient l'état des services.

J'ai aussi mis à jour sur la branche master les Dockerfile pour ne plus utiliser Debian Stretch, parce que j'y avais un problème qui m'empêchait d'exécuter correctement npm ci pour installer les dépendances (le processus ne rendait jamais la main). Tant qu'à faire, je les ai moderniser directement (les commandes RUN avec le bash "strict mode").

Du coup, pour la branche rails7, j'ai donc fait un rebase depuis master pour être à jour avec l'état de master (pour les déploiements avec container). Quelques commits qui modernisaient les Dockerfile/Containerfile ont disparu, parce qu'ils avaient déjà été backportés dans master.

J'ai ajouté aussi quelques commits sur la branche rails7 pour:

  1. faire en sorte que le service linuxfr-img utilise Debian Bookworm pour exécuter le service img-Linuxfr.org écrit en go
  2. Réintégrer explicitement nodejs qui est nécessaire pour uglify les codes javascripts

Pour ce dernier point, LinuxFr n'a pas beaucoup de JavaScript et les moteurs modernes sont très efficaces pour avoir du code très réactif. Est-ce que vous pensez vraiment que c'est encore nécessaire ?

Je serai pour enlever la gem uglifier et donc nodejs et servir directement le JavaScript. Ça sera plus proche de la philosophie open source, car le code source sera lisible depuis la console JavaScript.

@echarp
Copy link
Member

echarp commented Mar 24, 2024

Bonne idée. Moins de dépendance c'est mieux!

@Trim
Copy link
Member Author

Trim commented Mar 27, 2024

Je serai pour enlever la gem uglifier et donc nodejs et servir directement le JavaScript. Ça sera plus proche de la philosophie open source, car le code source sera lisible depuis la console JavaScript.

Alors, j'ai essayé dans ma branche remove-nodejs-and-uglifier et en fait la taille a pas mal grossi, parce qu'on inclus jQuery v2.

Comme uglifier supprime les fonctions non utilisées de jQuery, il est quand même capable de bien réduire la taille totale de JavaScript à télécharger (230 Ko de moins).

Pour comparaison, voilà la taille du fichier JavaScript généré pour les 3 environnements:

Description Branche rails7 Branche remove-nodejs-and-uglifier Production actuelle (ruby 2)
Taille JS (kio) KO 145Ko (**) 370 Ko 147 Ko

(**): J'ai forcé l'utilisation de uglifier terser dans config/environments/develop.rb pour ce test , mais uglifier n'est pas compatible avec EcmaScript 6 et decaffeinate a justement fait des scripts au format EcmaScript 6. (terser est compatible avec EcmaScript 6).

@Oumph: si on enlève uglifier + nodejs de la stack, le fichier application.js grossis de 230Ko, est-ce que ce serait un problème pour la bande passante ?

@echarp
Copy link
Member

echarp commented Mar 27, 2024

Pour info, jquery ui est très utile? :-)

@echarp
Copy link
Member

echarp commented Mar 27, 2024

J'ai jeté un coup d'œil rapide, a priori il s'agit de jQuery avec jquery_ujs, c'est un peu indispensable en l'état :)

Zut zut, je pensais qu'on pourrait simplifier cette partie là.

Alors on peut envisager une autre direction: l'uglification se fait au moment de la précompilation des assets. On peut faire cette précompilation ailleurs que sur le serveur de prod. Et dans ce cas les assets précompilés peuvent être mis dans git ou poussés avec un autre mécanisme genre rsync... Je ne suis pas sûr que ça simplifie beaucoup.

@Trim
Copy link
Member Author

Trim commented Mar 27, 2024

J'aurai voulu enlever jquery, parce qu'on utilise une version majeur obsolète (v2 au lieu de v3) et parce qu'avec JavaScript moderne on peut faire plein de choses sans jquery.

Mais ça sera un projet complet, parce que c'est jquery qui fait l'éditeur Markdown actuel de LinuxFr :)

Pour l'instant, l'uglifier ne fonctionne plus avec la branche rails7 et donc le seul choix est de livrer le JavaScript avec 200Ko de plus.

Ce n'est pas non plus la mer à boire de nos jours ces 200Ko de plus 🙂

Si ce n'est pas ok pour l'hébergement, alors j'investirais plus de temps pour voir s'il y aurait une autre gem qui minifie et qui est compatible EcmaScript 6 (je crois en avoir vu un dans une des documentations que j'ai lu récemment).

Par contre, ce qui est bien, c'est que Nodejs ne devrait pas être un pré-requis pour l'environnement de dev, parce que uglifier y est désactivé pour pouvoir debugger.

@Trim
Copy link
Member Author

Trim commented Mar 27, 2024

Si ce n'est pas ok pour l'hébergement, alors j'investirais plus de temps pour voir s'il y aurait une autre gem qui minifie et qui est compatible EcmaScript 6 (je crois en avoir vu un dans une des documentations que j'ai lu récemment).

Ah je viens de tester terser pour remplacer la gem uglifier et ça fonctionne très bien et redonne une taille de 145Ko. Je met ce changement sur la branche rails7 en attendant de voir si on enlève complètement nodejs et la minisation du code javascript.

Trim and others added 8 commits March 27, 2024 21:51
The minimization of JavaScript files is useful, because LinuxFr.org
includes jQuery and jQeury UI and certainly don't use all the tools
provided by them.

The decaffeinate process to build JavaScript files from old
coffee script files has built EcmaScript 6 files.

As uglifier is not compatible with EcmaScript 6, it has been replaced by terser
which is recommended by the uglifier project itself.
La nouvelle version supprime quelques helper, dont `list_of` qui était
utilisée ici et là et qui est maintenant rajoutée dans
`application_helper`.

Méthodes supprimées:
  block_is_haml?, capture_haml, escape_once, find_and_preserve, flatten, haml_concat,
  haml_indent, haml_tag, haml_tag_if, html_attrs, html_escape, init_haml_helpers, is_haml?,
  list_of, non_haml, precede, succeed, surround, tab_down, tab_up, with_tabs

Référence: https://github.com/haml/haml/releases/tag/v6.0.0
Still maintained, will require an upgrade to dart-sass at some point.
This commit updates several gem dependencies in the Gemfile and
Gemfile.lock, including Rails and related gems. The version constraint
for the sitemap_generator gem has been removed, allowing the latest
version to be used.

The sitemap configuration has been updated to match the new usage of
sitemap_generator. The encoding comment and an extra line have been
removed, and the `add_links` method has been replaced with `create`.

Extra lines have been added before `sitemap.add` calls for readability.
feat: Update gem dependencies and sitemap generator
@Trim
Copy link
Member Author

Trim commented Sep 21, 2024

Quand j'ai configuré une nouvelle machine, j'ai ce message d'avertissement à la création des bases de données:

$ podman-compose exec linuxfr.org bin/rails db:setup
podman-compose version: 1.0.6
['podman', '--version', '']
using podman version: 4.3.1
podman exec --interactive --tty linuxfrorg-rails7_linuxfr.org_1 bin/rails db:setup
Created database 'linuxfr_rails'
Created database 'linuxfr_test'
NOTE: nokogumbo: Using Nokogiri::HTML5 provided by Nokogiri. See sparklemotion/nokogiri#2205 for more information.
exit code: 0

This commit introduces two new global constants MY_PUBLIC_URL and
IMG_PUBLIC_URL which should be used now to build URLs.

For alpha and production Ruby environments, they are fixed with their real
values directly in the `config/environments/*.rb` files.

For the development Ruby environment, they are defined by default to
`http://dlfp.lo` and `http://image.dlfp.lo`. You can customize either by
updating the `config/environments/development.rb` file or by setting the
*process* environment variables `DOMAIN`, `DOMAIN_HTTP_PORT`, `IMAGE_DOMAIN`
and `IMAGE_DOMAIN_HTTP_PORT`.

For containers, you can set these variables in the `deployment/default.env`
file.
@Trim
Copy link
Member Author

Trim commented Sep 22, 2024

Quand je lance les tests, j'ai aussi ces avertissements:

podman exec --interactive --tty linuxfrorg-rails7_linuxfr.org_1 bin/rails test -v
DEPRECATION WARNING: Rails.application.secrets is deprecated in favor of Rails.application.credentials and will be removed in Rails 7.2. (called from <top (required)> at /linuxfr.org/config/environment.rb:5)
DEPRECATION WARNING: Rails.application.secrets is deprecated in favor of Rails.application.credentials and will be removed in Rails 7.2. (called from <top (required)> at /linuxfr.org/config/environment.rb:5)
DEPRECATION WARNING: Rails.application.secrets is deprecated in favor of Rails.application.credentials and will be removed in Rails 7.2. (called from block in <top (required)> at /linuxfr.org/config/initializers/secrets.rb:2)
DEPRECATION WARNING: Rails.application.secrets is deprecated in favor of Rails.application.credentials and will be removed in Rails 7.2. (called from block in <top (required)> at /linuxfr.org/config/initializers/secrets.rb:3)

allow to use custom HTTP public port to permit rootless run
@echarp
Copy link
Member

echarp commented Sep 22, 2024

Le warning nokogiri semble être lié à des dépendances intermédiaires. À voir si ça évolue avec les mises à jour.

Pour les credentials, c'est une autre évolution de rails, qui sont passés sur un autre mécanisme de stockage des secrets. Comme on utilise, il me semble, des variables d'environnement passées par le serveur web, on devrait pouvoir remplir sans utiliser... ou quelque chose de plus approprié, à voir ce qu'on veut faire.

@Trim
Copy link
Member Author

Trim commented Sep 24, 2024 via email

@Trim
Copy link
Member Author

Trim commented Sep 24, 2024

Pour les credentials, c'est une autre évolution de rails, qui sont passés sur un autre mécanisme de stockage des secrets. Comme on utilise, il me semble, des variables d'environnement passées par le serveur web, on devrait pouvoir remplir sans utiliser... ou quelque chose de plus approprié, à voir ce qu'on veut faire.

J'ai essayé de regarder hier et je crois qu'on l'utilise pour générer des secrets aléatoires au démarrage du service. Après, ça ne bloque pas cette mise à jour, ça sera à penser pour la mise à jour vers rails 7.2.

Alors je me suis trompé, les valeurs sont fixes pour les environnements development et tests. Comme tu l'as relevé, ce sont des variables d'environnement pour la production.

J'ai lu un peu la documentation du nouveau système et c'est intéressant parce que:

  1. ça évite de mettre des clés privées / secrets dans les environnements de variables (ces variables sont accessibles depuis /proc).
    • bon, LinuxFr est hébergé sur ses propres serveurs, c'est du coup moins important. Dans ce cas, ça permet d'éviter qu'un bug dans un autre logiciel qui tourne sur le même serveur révèle les secrets des variables d'environnement, par exemple dans un dump.
  2. on peut versionner la configuration complète dans le git: les secrets sont chiffrés avec ce système et seul les personnes / logiciels qui ont accès à la clé privée "master.key" peut révéler et éditer les secrets.

Cette évolution est à réfléchir, je ne sais pas si elle est souhaitée par les admins de LinuxFr. On pourra le faire dans un second temps en se coordonnant avec eux.

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.

3 participants