Aller au contenu principal

Nous sommes Entreprise à Mission

· 3 minutes de lecture
Flavien Bailleul
Flavien Bailleul
Co-fondateur engagé

Quand nous avons cofondé zatsit, nous ne voulions pas créer une énième ESN. Le marché n’en manque pas et il en existe déjà beaucoup. Trop peut-être.

Ce que nous voulions, c’était faire émerger une autre façon d’entreprendre, dans le numérique.

Une façon plus humaine, plus responsable, plus engagée.

Nous sommes convaincus que la tech peut – et doit – être un levier d’impact positif. Pour nos clients, pour la société, pour l’environnement.

C’est cette conviction qui nous a poussés à faire de zatsit, une entreprise à mission, et à inscrire noir sur blanc notre raison d’être dans nos statuts.

OpenRewrite : Automatiser les montées de version

· 6 minutes de lecture
Guillaume Gayot
Software Engineer

Le serpent de mer des montées de version

En tant que développeur·euse·s il n'est pas toujours facile de trouver le temps de maintenir à jour les versions des langages et des frameworks que l'on utilise.

Suivre le rythme des releases n'est pas toujours aisé, et on se retrouve souvent dans ce cercle vicieux : les montées de version mineures ne semblent pas suffisamment intéressantes pour que l'on prenne le temps de les faire. Alors on attend les majeures et les LTS...

Sauf qu'elles sont souvent plus coûteuses en temps et donc plus difficile à intégrer dans nos roadmaps (particulièrement quand elles n'apportent pas de plus value pour nos clients).

Alors on attend. Et généralement, on attend jusqu'à ce que l'on soit obligé de faire cette upgrade (à cause d'une faille de sécurité, de la fin de support, etc...)

Et quand on a attendu bien longtemps, ces montées de version deviennent (parfois) des monstres de complexité, entrainant (parfois) des effets de bords en cascade sur nos dépendances et mobilisant énormément de temps et d'efforts.

Efforts parfois compliqués à justifier face à nos clients :

"Oui, j'ai passé tout le sprint sur la montée de version. Non, il n'y a aucune nouvelle fonctionnalité ou amélioration visible sur le produit. Non, je ne me fous pas de vous, pourquoi vous dites ça ?"

Comment limiter le temps et les efforts que nous demandent ces montées de versions ? Avec OpenRewrite.

OpenRewrite, c'est quoi ?

Citons la documentation officielle :

OpenRewrite est une solution open source de refactorisation automatisée, permettant aux développeurs d'éliminer efficacement la dette technique au sein de leurs dépôts. Il se compose d'un moteur de refactorisation automatique qui exécute des recettes de refactorisation préemballées et open source pour les migrations de frameworks courantes, les corrections de sécurité et les tâches de cohérence stylistique – réduisant vos efforts de codage de plusieurs heures ou jours à quelques minutes. Bien que l'accent initial ait été mis sur le langage Java, la communauté OpenRewrite ne cesse d'étendre la couverture des langages et des frameworks.

On peut donc retenir que :

  1. c'est open source
  2. ça refactorise le code en suivant des "recettes"
  3. on peut utiliser des recettes open source ou écrire les siennes

Développé au départ autour de l'environnement Java, OpenRewrite est compatible avec Maven et Gradle, permettant d'appliquer les recettes en une ligne de commande.

L'initiative propose également un système de "meta-recette" : des recettes composées de plusieurs recettes, comme celle-ci, pour passer à Spring Boot 3.4 ou encore celle-là pour passer en java 21.

astuce

Le plugin Maven OpenRewrite permet également d'ajouter des recettes ou des meta-recettes les unes à la suite des autres.

Avec un exemple, c'est plus parlant

Une rapide recherche sur Github nous a permis de trouver ce dépôt public d'une application de démo pour Spring Boot.

Le dernier commit date d'il y a 3 ans, la version de Spring Boot utilisée est la version 2.6.4 et la version de Java est la version 11.

À l'heure où nous écrivons cet article, la dernière version stable de Spring Boot est la 3.5 et la dernière LTS de Java est la version 21.

Nous avons donc une majeure à passer sur Spring Boot et dix versions sur Java !

Comme il s'agit d'un framework et d'un langage très populaires, on trouve de nombreux guides de migration. Mais grâce à OpenRewrite, nous n'avons pas besoin de regarder une vidéo de plus d'une heure avant de nous mettre à l'ouvrage !

En effet, en appliquant à la suite les commandes Maven fournies dans la recette pour passer à Spring Boot 3.4 ainsi que celle pour passer en java 21, ces deux opérations s'exécutent en quelques secondes.

mvn -U org.openrewrite.maven:rewrite-maven-plugin:run -Drewrite.recipeArtifactCoordinates=org.openrewrite.recipe:rewrite-spring:RELEASE -Drewrite.activeRecipes=org.openrewrite.java.spring.boot3.UpgradeSpringBoot_3_4 -Drewrite.exportDatatables=true
mvn -U org.openrewrite.maven:rewrite-maven-plugin:run -Drewrite.recipeArtifactCoordinates=org.openrewrite.recipe:rewrite-migrate-java:RELEASE -Drewrite.activeRecipes=org.openrewrite.java.migrate.UpgradeToJava21 -Drewrite.exportDatatables=true

Comme notre application de démo n'utilise aucune dépendance en dehors de Spring Boot, on peut directement valider que tout s'est bien passé : les tests passent encore, l'application se lance et fonctionne comme prévu !

info

On aurait également pu utiliser le plugin maven pour ajouter nos deux recettes l'une à la suite de l'autre :

<plugin>
<groupId>org.openrewrite.maven</groupId>
<artifactId>rewrite-maven-plugin</artifactId>
<version>6.10.0</version>
<configuration>
<exportDatatables>true</exportDatatables>
<activeRecipes>
<recipe>org.openrewrite.java.spring.boot3.UpgradeSpringBoot_3_4</recipe>
<recipe>org.openrewrite.java.migrate.UpgradeToJava21</recipe>
</activeRecipes>
</configuration>
<dependencies>
<dependency>
<groupId>org.openrewrite.recipe</groupId>
<artifactId>rewrite-migrate-java</artifactId>
<version>3.11.0</version>
</dependency>
<dependency>
<groupId>org.openrewrite.recipe</groupId>
<artifactId>rewrite-spring</artifactId>
<version>6.8.2</version>
</dependency>
</dependencies>
</plugin>

Certaines recettes nécessitent des paramètres, comme cette recette de changement de nom de package par exemple.

Heureux hasard ! dans notre projet, le fichier SpringdemoApplicationTests.java comporte une erreur de nom de package !

Il suffit d'ajouter à la racine de notre projet un fichier de configuration rewrite.yml comme celui-ci :

---
type: specs.openrewrite.org/v1beta/recipe
name: com.zatsit.ChangePackage
displayName: Rename package name example
recipeList:
- org.openrewrite.java.ChangePackage:
oldPackageName: com.sohamkamani.demo
newPackageName: com.sohamkamani.springdemo

Puis d'ajouter la recette dans la liste à appliquer par le plugin :

<activeRecipes>
<recipe>org.openrewrite.java.spring.boot3.UpgradeSpringBoot_3_4</recipe>
<recipe>org.openrewrite.java.migrate.UpgradeToJava21</recipe>
<recipe>com.zatsit.ChangePackage</recipe>
</activeRecipes>

Là encore, un simple mvn rewrite:run et le tour est joué !

What else ?

Cet exemple simple vous donne un aperçu de la facilité avec laquelle vous pouvez utiliser, combiner, adapter les recettes OpenRewrite por répondre à vos besoins, souvent spécifiques.

Comme précisé ci-dessus, OpenRewrite s'est d'abord développé autour de l'environnement Java, mais s'est aujourd'hui étoffé de milliers de recettes pour des technologies, langages et frameworks aussi divers que variés !

Et si jamais vous ne trouvez pas votre bonheur, comme OpenRewrite est open source, vous pouvez tout à fait écrire votre propre recette, que ce soit pour pouvoir la répliquer facilement sur plusieurs de vos projets, ou pour en faire profiter toute la communauté !

Alors ? Prêt à effectuer vos montées de versions de manière sereine ?

La tyrannie de la commodité

· 10 minutes de lecture
Guillaume Gayot
Software Engineer

Grafiti on a wall saying tyranny is already there

La tyrannie de la commodité : ce que nous coûte la facilité

La Tyrannie de la commodité, qu'est-ce que c'est ?

Traduction littérale de l'Anglais "tyranny of convenience", le concept n'est pas si récent. Evan Williams, co-fondateur de Twitter, le déclarait déjà en 2018 : « la commodité décide de tout ». Clef de voûte du marketing, certaines marques en ont même fait leur argument principal : "Pratique et intuitif", "Tous vos outils au même endroit". Pourtant, on devrait le savoir, un argument marketing est rarement un argument rationnel.

Crossplane - Présentation des concepts

· 10 minutes de lecture
Germain Lefebvre
OSS Ambassador

Crossplane est une extension open-source à Kubernetes qui permet aux équipes plateforme d'assembler l'infrastructure provenant de plusieurs cloud providers, et d'exposer des APIs de plus haut niveau pour que les équipes d'applicatives puissent les consommer.

Crossplane Logo

Hacktoberfest 2024 : l'engagement de zatsit

· 6 minutes de lecture
Germain Lefebvre
OSS Ambassador
Ludovic Dussart
Deputy CTO & Developer Advocate

Le mois d'octobre est LE mois de l'année pour tous les amoureux de l'open source, c'est le mois du Hacktoberfest ! La communauté open source a besoin d'aide (d'idées, de compétences, de temps) pour faire avancer ses projets.

Il était donc évident pour nous de participer activement à cet événement, en contribuant sur des projets qui nous tiennent à cœur, ou que nous utilisons au quotidien.

hacktoberfest banner

Realworld, ou la mère des applications démo

· 2 minutes de lecture
Lucas Perreau
Developer

Hello, world! Et voilà ! Je sais comment développer avec Vue | Java | Rust | GoLang ! 🤓 Faire de la veille sur un projet technologique nécessite de trouver des cas d'implémentation, ce qui n'est jamais vraiment simple à trouver, non ?

Ca tombe bien, on a la solution pour vous : Realworld !

Faites maigrir votre JavaScript

· 3 minutes de lecture
Nicolas Fourré
Software Engineer

Dans l’écosystème JavaScript, rien de plus facile que d’ajouter une nouvelle librairie à son projet, qu’il soit front-end ou back-end. NPM est là pour nous aider, un simple “npm install @theultimatelib” et hop, le tour est joué.

Mais dans une démarche d’éco-conception et de performance, comment savoir si la librairie que l’on vient d’installer est la meilleure ? Ou la plus adaptée ? A-t-elle un impact sur le poids de mon application ?