I. Contexte▲
Plusieurs projets sont en cours au niveau d'OpenJDK. L'objectif d'un projet est de fournir un travail collectif pour produire un artefact spécifique. Celui-ci peut être du code, de la documentation, ou n'importe quel matériel. Commençons par le projet Skara.
En effet ce dernier est sous les feux des projecteurs avec deux JEP dans le JDK 16 :
Via ces deux JEP, nous pouvons voir que le projet a procédé par étape : choix vers un nouveau gestionnaire (si besoin), puis d'un hébergeur.
II. Historique▲
Le projet a été créé en septembre 2018 (Welcome to skara-dev).
L'objectif du projet est d'étudier les alternatives à Mercurial pour le gestionnaire de sources et les différents fournisseurs. Ce qui est intéressant dans la démarche, c'est qu'il dissocie le choix de gestionnaire de sources et le choix de l'hébergeur. Le choix de Mercurial avait été fait par Sun Microsystems en 2006.
Il faut noter qu'il y a eu la JEP 296 incluse dans le JDK 10 (mars 2018) sur la consolidation des dépôts en un seul. En effet, le code du JDK était réparti sur différents dépôts : racine, corba, hotspot, jaxp, jaxws, jdk, langtools et nashorn.
L'objectif de ce regroupement est de simplifier le travail des développeurs. En effet, un correctif impliquait très souvent plusieurs dépôts. Les développeurs devaient réaliser plusieurs 'commit' sur différents dépôts. Cela compliquait leur travail et pouvait être une source d'erreurs.
Il est à noter que Nashorn introduit dans le JDK 8 n'est plus fourni dans le JDK depuis la version 15, mais il reste en tant que projet autonome (dépôt du projet).
III. Passage de Mercurial à Git (Objectifs)▲
III-A. Migration de tous les référentiels OpenJDK▲
Cela consiste à migrer tous les référentiels monorepo vers Git. Cela signifie que les dépôts à partir du JDK 10 sont disponibles sous GIT (cf. la section Historique).
Nous retrouvons l'intérêt du travail préparatoire consistant à fusionner plusieurs dépôts en un seul (JEP 296).
III-B. Préserver l'historique▲
Au-delà, de déposer l'ensemble des sources sur le nouveau gestionnaire de sources, la préoccupation de l'équipe a été de préserver l'historique. Dans ce sens, un outil de traduction de hash Mercurial vers un hash Git a été développé (cf. section suivante).
III-C. Porter les outils▲
C'est aussi les modifications des outils utilisés par le projet afin qu'ils fonctionnent avec git.
- git-jcheck : outil jcheck pour être compatible avec GIT ;
- git-webrev : outil webrev pour être compatible avec GIT ;
- git-defpath : outil defpath pour être compatible avec GIT ;
- git-skara : informations sur les outils Skara CLI ;
- git-info : montrer les informations OpenJDK au sujet des commits : lien avec les fiches JBS, les auteurs, les contributeurs.
C'est aussi des nouveaux outils, avec par exemple des outils pour échanger avec un fournisseur externe
- git-fork : « Forker » un projet d'un fournisseur externe vers un espace personnel, et le cloner optionnellement ;
- git-sync : synchroniser le « fork » personnel avec l'état courant du dépôt d'origine ;
- git-pr : interagir avec les « pull requests » avec un fournisseur externe GIT ;
- git-token : interagir avec le gestionnaire pour obtenir un token d'accès ;
- git-translate : traduire un hash Mercurial en Hash GIT (cf. section précédente) ;
- git-trees :exécuter une commande GIT dans une arborescence de dépôts ;
- git-publish : publier une branche locale vers un dépôt distant.
L'équipe a rendu disponibles les différents outils de Skara sous licence GPL 2.0. Ils sont accessibles à l'adresse sur le dépôt GIT du projet. Cela permet d'y contribuer, de l'utiliser ou de s'en inspirer pour ses propres projets.
Parmi les outils, il existe aussi des outils côté serveur. Voici quelques exemples :
- mlbridge : pont entre les messages de liste de diffusion et les « pull requests » ;
- notify : envoyer des mails de notifications quand les dépôts sont mis à jour ;
- pr : ajouter le support du workflow OpenJDK pour les « pull requests » ;
- forward : faire suivre les commits sur plusieurs dépôts ;
- mirror : faire un dépôt miroir ;
- merge : fusionner des commits entre différents dépôts et/ou branches.
IV. Passage de Mercurial à Git (Motivations)▲
IV-A. Taille des métadonnées▲
Les métadonnées sont de plus en plus volumineuses (1.2 Go sous Mercurial, 300 Mo sous Git seulement lors des tests). Cela devenait de plus en plus contraignant pour les développeurs, notamment sur les phases de synchronisation.
IV-B. Outils▲
De nombreux outils supportent GIT comme les éditeurs Emacs, Vim ou VSCode qui le supportent nativement. De même, l'ensemble des IDE (Eclipse, Netbeans et Intellij) le prennent en charge. Là encore, si je prends Eclipse IDE, le support de GIT est disponible tout de suite après l'installation, sans la nécessité d'un plugin supplémentaire.
IV-C. Hébergement▲
Il existe plusieurs solutions d'hébergement comme Gitlab, Sourceforge et Github.
IV-D. Communauté▲
Mercurial est aussi considéré comme un frein à la contribution. Au-delà des aspects techniques, ce gestionnaire de sources est peu répandu. Donc, les nouveaux contributeurs doivent passer par une étape supplémentaire en apprenant l'usage de l'outil.
V. Migration sous Github▲
Comme vu précédemment, une des forces de GIT est d'avoir plusieurs fournisseurs.
V-A. Le fournisseur retenu▲
Le projet Skara a donc évalué les différentes solutions d'hébergement. C'est Github qui a été retenu. La grande communauté d'utilisateurs et le partenariat entre Oracle et Microsoft (propriétaire de Github) ont notamment joué en faveur de cette décision.
Il est important de noter que le choix du fournisseur n'implique pas d'adhérence. Nous pouvons voir que :
- l'équipe Skara s'est assurée du bon fonctionnement avec Gitlab par exemple ;
- le gestionnaire de ticket reste Java Bug System (JBS) ;
- les liens sont neutres (sans usage de github.com). Par exemple, l'URL officielle est https://git.openjdk.java.net/jdk. Elle redirige vers https://github.com/openjdk/jdk. Ce type d'URL est utilisé dans le workflow du projet. Ci-dessous un exemple de mail suite à un « commit ».
En cliquant sur le lien https://git.openjdk.java.net/jdk/commit/db5da961, nous arrivons finalement sur la page de commit de github.
De même, une URL neutre est utilisée pour réaliser la revue de code d'une « pull request ». Cette dernière redirige vers la page correspondant à la « pull request ».
- Les outils cités plus haut permettent d'interagir avec le fournisseur externe, github en l'occurrence.
V-B. Étapes préparatoires▲
Certains projets sont passés sous github en avance de phase. Cela a permis de tester en condition réelle les outils et les workflows mis en œuvre. Ainsi, le projet a bénéficié de retours d'expérience et des ajustements ont pu être réalisés. Par exemple, le projet Loom a été l'un des premiers projets en août 2019
V-C. La bascule▲
La migration a été effectuée du 4 au 5 septembre 2020. Voici un résumé avant et après les opérations :
-
avant la migration du 4 septembre :
- Mercurial : lecture / écriture
- Github : lecture seule ;
-
après la fin des opérations le 5 septembre :
- Mercurial : lecture seule,
- Github : lecture / écriture.
Nous pouvons le voir clairement au niveau des dépôts. Il est bien indiqué que le dépôt jdk11u reste un dépôt miroir du dépôt Mercurial. En revanche le dépôt JDK n'est plus un miroir, mais bel et bien le dépôt principal :
Depuis cette date, toutes les modifications passent par des « pull request » depuis github (via l'interface ou les outils). La première PR n'a pas tardé, car elle a été réalisée dès le 6 septembre 2020 :
Suite à la bascule, voici le lien vers la première « pull request » https://github.com/openjdk/jdk/pull/23.
VI. Conclusion▲
Même si nous ne sommes pas contributeur d'OpenJDK, c'est intéressant de voir comment fonctionne l'équipe et tout le travail qui est réalisé.
Dans ce sens, la PR #1891 est intéressante, car elle permet de voir le workflow et les outils mentionnés dans ce billet :
- bot openjdk ;
- mlbridge (outil côté serveur mentionné plus haut) pour la revue de code ;
- revue de code (hors github) : https://openjdk.github.io/cr/?repo=jdk&pr=1891&range=00 ;
- revue de code (depuis github) : https://github.com/openjdk/jdk/commit/334bdd2aecdc77324a090e0b5086a2ba071da48c.
Cela permet aussi de mieux comprendre les étapes de la sortie d'un nouveau JDK. En effet, nous avons plusieurs paliers comme « Rampdown », « Release Candidate ». Par exemple, l'agenda prévu pour le JDK 16 est le suivant :
Nous pouvons lire qu'au niveau du « Rampdown Phase1 », nous avons une précision « Fork from main line ». Et c'est bien ce qui se passe, un « fork » du dépôt principal jdk est réalisé pour créer un nouveau dépôt spécifique jdk16.
Nous pouvons espérer que le passage à Git et notamment à Github permette d'avoir de nouveaux contributeurs. Pourquoi pas vous ?
VII. Remerciements▲
Cet article a été publié avec l'aimable autorisation de Lilian Benoit. L'article original (Projet Skara, C’est quoi donc ?) peut être vu sur le blog https://www.lilian-benoit.fr/.
Nous tenons à remercier Claude Leloup pour sa relecture attentive de cet article et Winjerome pour la mise au gabarit.
VIII. Références▲
- Projet JDK 16
- JEP 296 Consolidate the JDK Forest into a Single Repository
- JEP 357 Migrate from Mercurial to Git
- JEP 369 Migrate to GitHub
- Premier mail de la liste de diffusion skara-dev
- Mail pour rappel pour la bascule vers github
- Mail de fin des opérations de la bascule vers github
- Dépôt GIT du JDK
- Dépôt GIT du projet Nashorn
- Dépôt GIT du projet Skara
- Java Bug System (JBS)
- Exemple de commit
- Première PR après la bascule
- Exemple de PR
- Article LeMagIT sur Oracle migre OpenJDK vers Git et Github