Table of Contents

Je commite en 9 leçons

… ou comment faire un bon commit

Avertissement

Cette page, explique aux développeurs comment faire un bon commit. Cependant, vu l'évolution très rapide de Metafor, cette page n'est pas toujours à jour.

Cependant, n'oublie pas, cher collègue, que tu peux aussi faire de ce monde un monde meilleur! Il te suffit de cliquer à droite de cette page sur le bouton “Edit this page” et tu peux immédiatement corriger une erreur! Merveilleux, n'est-il pas?

Je te souhaite donc un bon commit!

Introduction

Commiter. Voilà un beau mot qu'il n'est pas facile d'utiliser en dehors du B52. Pourtant, en tant que développeurs de code, c'est une étape indispensable qu'il va falloir réaliser régulièrement (la notion de “régulièrement” étant très variable selon les personnes).

En effet, lorsque l'on est plusieurs à travailler sur le même code, il est indispensable d’utiliser un système de version. La version officielle de Metafor se trouve bien sagement dans le “repository”, et chaque développeur fait une copie de cette version sur son PC (“checkout”) pour pouvoir travailler dans son coin. Après avoir réalisé des développements, il arrive souvent un point où on souhaite réintégrer ceux-ci à la version officielle de Metafor (“commiter”), afin de sauvegarder son travail, d'avoir une nouvelle base de référence pour continuer à programmer, de permettre aux autres d'utiliser ses nouveaux développements…

Cependant, il ne suffit pas de brutalement aller modifier la version officielle! Avant de pouvoir commiter, il faut vérifier :

Les différentes plateformes sur lesquelles la compilation doit être possible et la batterie lancée sont les suivantes :

OS compiler nb core Bacon GUI Fichier CMake
thorgal Linux64 gcc 2*4 oui oui thorgal.cmake
spring Linux64 icc 4 oui oui spring.cmake
gaston Linux64 clang 6/12 oui oui gaston.cmake
PC Windows Win64 VS2012 - oui oui win64-vs2012.cmake

Quand on essaie de réaliser cette procédure de commit, on oublie toujours une chose ou l'autre quand on n'a pas l'habitude. Voici donc une petite marche à suivre qui détaille, étape par étape, tout ce qu'il faut faire pour faire un beau commit pas foireux.

0. Hypothèses de départ

1. Mise à jour complète

Pour pouvoir commiter sa nouvelle version, il faut évidemment être à jour et posséder la version la plus récente de Metafor. A l'heure actuelle (juin 2016), Metafor est composé de 4 différents dossiers, qui fonctionnent avec deux systèmes de version différents.

Les dossiers oo_meta et oo_nda sont gérés par “SVN”. Pour mettre à jour, il suffit de sélectionner ces deux dossiers, clic droit, SVN Update.

Le dossiers parasolid et linuxbin sont gérés par “git” (voir le commit de Romain pour installer et comprendre git). Pour mettre à jour, on sélectionne le dossier, clic droit, TortoiseGit, Pull.

La fenêtre suivante s'ouvre. On laisse bien remote : origin, remote branch : master, et on clique sur OK.

Lors de la mise à jour des sources, des conflits peuvent évidemment arriver, si jamais les modifications réalisées ne sont pas compatibles avec celles introduites dans les derniers développements commités par les collègues. Dans ce cas-là il faut résoudre les conflits à la main. Plus on attend longtemps avant de commiter, plus le nombre de ces conflits augmente, donc il est intéressant de commiter régulièrement.

Une fois les sources mises à jour, il faut faire de même avec son projet Windows, d'abord en utilisant CMake, puis en compilant sous Visual Studio. Personnellement, je préfère toujours supprimer complètement mon projet et le recréer depuis le début (créer un dossier oo_metaB ou MetaBin, ouvrir fenêtre de commande, taper cmake -C ..\oo_meta\CMake\win64-vs2012.cmake ..\oo_meta, ouvrir le projet Visual Studio et complier), mais on peut (souvent mais pas toujours) aussi simplement utiliser CMake GUI, dans les libs de Luc:

On vérifie bien que la première ligne pointe vers oo_meta, la seconde vers oo_metaB, puis on clique d'abord sur Configure, et ensuite sur Generate. Il reste ensuite à recompiler son projet Visual Studio.

2. Transférer les sources sur les stations

Une fois les sources à jour, l'idée est de les compiler et de lancer la batteries de tests sur les stations linux, spring et thorgal. Il faut donc déplacer les sources sur les stations en question.

2.1 Nettoyage

Avant de déplacer les sources, deux petites opérations de nettoyage :

2.2 Archivage

Une fois le nettoyage réalisé, on peut zipper les sources avec WinRAR. Faire un fichier qui peut s'appeler, par example, MetaforDate.zip (attention, pas un fichier .rar) avec les quatre dossiers linuxbin, oo_meta, oo_nda et parasolid.

2.3 Transfert

Ensuite, on transfère l'archive en question sur les stations en utilisant par exemple Filezilla. Pour se connecter aux stations :

Une fois connecté, il suffit alors de faire glisser l'archive zip dans un sous-dossier adapté, par exemple DateBaterry

3. Faire passer les batteries sur les stations

Maintenant qu'on a déplacé les sources sur les stations, il reste à lancer les batteries dessus. Pour cela, il faut compiler les sources et lancer la batterie sous Linux64-gcc (thorgal), Linux64-icc (spring) et Linux64-clang (gaston).

3.1 Se connecter sur les stations

On se connecte sur les stations grâce à PuTTY :

Une fois connecté, on commence par taper la commande top pour vérifier que personne n'occupe la machine. Sur l'image ci-dessous, par exemple, 4 noeuds sont déjà occupés par Marco. Il est bien aussi de se renseigner pour voir si des collègues n'ont pas un commit super urgent prévu et ne pas leur voler la priorité. C'est donc l'occasion d'aller papoter un peu dans les bureaux.

3.2 Lancer les batteries via ''comp.py''

Si personne n'est sur la machine, on lance alors le script comp.py.

Pour faire son choix dans le menu, il suffit de taper la lettre ou le chiffre précédant la commande en question dans le menu.

Parmi les lettres, seules les options 'b' et 'j' doivent être modifiées :

Les autres options, décrites ci-dessous, sont en général laissées par défaut :

Concernant les chiffres :

Dans ce cas-ci, où on vient de transférer les sources par Filezilla, on veut avoir :

Une fois qu'on est satisfaits avec les options, on appuie sur “G” et ça démarre! Pour info :

On répète ensuite l'opération avec la deuxième machine, thorgal; puis la troisième, gaston.

Une dizaine de minutes plus tard, on reçoit un mail qui indique si la compilation s'est bien passée ou non. Si non, il faut donc comprendre pourquoi. Si ça compile sous Windows mais pas sous Linux, l'erreur la plus fréquente est un problème de casse. Sous Windows, ce n'est pas grave de remplacer 'a' par 'A', mais sous Linux bien.

Si la compilation s'est bien passée, quelques heures plus tard, les fichiers de résultats de la batterie sont envoyés automatiquement par email. On recevra notamment un mail avec un fichier html reprenant les diffs sur la machine, qu'il faudra ensuite analyser.

4. Faire passer la batterie sur son PC Windows

Les batteries tournent déjà sur spring, thorgal et gaston, pour vérifier la portabilité sous Linux. Sous Windows, malheureusement, il n'y a pas de machine réservée, donc il faut faire tourner la batterie sur son propre PC. Pour ce faire:

Dans oo_metaB\bin\Release, on ouvre une invite de commande. D'abord, on tape python battery.py clean pour effacer les résultats de batteries antérieures.

Toujours dans la fenêtre de commande, on tape à présent python battery.py -j 4 -l run. Cela lance la batterie de tests sur 4 processeurs (-j 4), en priorité faible (-l, pour continuer à pouvoir utiliser l'ordinateur en même temps).

Je lance la batterie sur mon PC Windows

Une fois la batterie finie, toujours dans l'invite de commande, on tape python battery.py verif puis python battery.py diff. Cela génère, dans le dossier oo_metaB\bin\Release\verif, un fichier Windows-diffs.html qui contient toutes les différences entre les résultats des tests lancés ici et ceux de la version officielle. Le fichier ressemble à l'image ci-dessous :

J'examine le fichier diff obtenu.

5. Obtenir des résultats de batterie satisfaisants

5.1 Analyse des résultats de batterie

A présent, on a donc lancé les batteries sur thorgal, spring, gaston et son PC. On a donc reçu 3 fichiers diffs par email, et le troisième se trouve dans oo_metaB\bin\Release\verif. Il faut maintenant comprendre ces fichiers pour décider si on peut commiter ou non.

Première chose à regarder : les “FAILED”. C'est assez simple, tant que au moins un des trois fichiers de diff commence par la section 'FAILED' on ne commite pas! Cela veut dire que certains tests n'ont pas réussi à tourner jusqu'au bout (d'où le nom de failed). Il faut donc comprendre pourquoi, modifier son code et/ou ses tests, et relancer les tests.

Deuxième chose à regarder, le rouge! Un résultat est affiché en rouge si la donnée que l'on est censé observé est manquante. Il y a deux cas possibles :

Troisième chose à regarder, les diffs proprement dites. Une fois qu'on n'a plus de tests dans les failed, et qu'on a compris tout ce qui est en rouge, on regarde les valeurs. C'est ici que c'est difficile, et que ça demande de l'expérience pour vraiment comprendre, car beaucoup de tests changent légèrement selon les machines. La machine spring est normalement la plus stable; je conseille donc de d'abord regarder les changements sur cette machine-là.

Quelques conseils:

Il faut noter qu'il y a des tests qui sont connus pour être instables. Il est assez fréquent que, les tests “mtFrequencyAnalysis”, “mtSuperElement”, “apps.XFEM” et d'autres présentes des diffs sans raison apparente. Petit conseil pour distinguer les “vrais diffs” des autres, lancer deux séries de batteries, une avec la version officielle de Metafor à laquelle on ne touche pas, une avec la version de développement. Ça permet de détecter les diffs à prendre en compte et celles qui ne sont pas graves (si pas de diff entre les diffs de Offi et Dev, on peut commiter)

5.2 Relancer certains tests

Très souvent, on n'est pas prêt à commiter du premier coup. Que faire donc si la batterie n'est pas bonne? Cela dépend de si le code source de Metafor a dû être modifié. Si oui, alors on doit relancer toutes les batteries. Oui, toutes ! On recommence donc à l'étape deux, à savoir transférer les sources sur les stations, et on relance les batteries dessus et sur son PC.

Si par contre les erreurs proviennent des tests eux-mêmes (donc que l'on a modifié les tests mais pas le code source), il suffit alors de relancer juste les tests en question.

La moindre erreur de manipulation à ce stade conduit très vite à effacer tous les résultats de votre batterie! Attention donc, quand ça arrive, on râle…

Sur les stations. Plusieurs façons de faire, j'en présente une qui me semble la plus simple:

Une fois que les quelques tests ont tourné, on reçoit par email un nouveau fichier diff que l'on peut analyser.

Sur le PC. On suit la même logique, une fois les tests modifiés, on supprime les .res correspondants dans oo_metaB/bin/Release, puis on ouvre une fenêtre de commande dans ce même dossier et on tape simplement python battery.py -j 4 -l run. Seuls les tests qui n'ont pas de .res seront relancés. On retape ensuite python battery.py verif et python battery.py diff et on a un nouveau fichier de diff dans le dossier verif.

Cette étape est à répéter jusqu'à ce que les trois fichiers de diff soient bons. Pour les nouveaux, c'est bien de demander confirmation à ce stade, pour pas mettre certaines personnes de mauvaise humeur après. Une fois qu'on est bon, on arrive enfin au commit proprement dit.

6. Le commit proprement dit

Le moment tant attendu arrive enfin: on commite !

6.1 Commiter sur son PC

D'abord, on parcourt l'ensemble des fichiers modifiés pour écrire proprement sa page de commit. Cette page a pour but de garder des traces des changements et d'expliquer aux collègues le travail réalisé. Il faut donc qu'elle soit suffisamment détaillée pour donner une idée précise de ce qui a été fait.

Si on modifie dans son commit des fonctions qui sont utilisés pour construire un cas-test, il faut le préciser dans sa page de commit, sur cette page et également mettre une petite bombe à coté de son commit !

Ensuite, on clique droit successivement sur oo_meta, oo_nda, puis on va sur “Tortoise SVN” et sur “Check for modifications”. Dans la fenêtre qui s'ouvre, on coche “show unversioned files” et “show ignored files”.

Je regarde mes fichiers modifiés.

Je regarde mes fichiers modifiés.

Concernant les “non-unversioned” (c'est à dire les nouveaux fichiers que l'on a créé), on rajoute ceux qu'il faut ajouter. Cela se fait par clique droit sur les fichiers, tortoise svn add, sans oublier d'indiquer \$Id\$ au début de chaque fichier.

J'ajoute mes nouveaux fichiers.

Ensuite, on clique droit sur oo_meta, oo_nda (seulement ceux où des modifications doivent être commitées) et on clique sur “SVN commit”. On prend note des fichiers ajoutés, supprimés et déplacés avant de fermer la fenêtre SVN pour vérifier que se page de commit est bien complète Je commite mes brols!

6.2 Commiter sur spring

On se connecte avec PuTTy et on tape :

cd /home/$USER/Metafor/oo_meta/apps/verif
svn commit *Linux64-icc.txt

L'éditeur de texte vi vi Tutorial se lance dans l'invite de commande. Si on ne désire pas ajouter de commentaires supplémentaires dans le fichier texte ouvert, on tape

:wq

c'est-à-dire “write” et “quit”.

Ensuite, il suffit de choisir l'option “continue”, c'est-à-dire taper “c”, et d'insérer son mot de passe “svn” pour effectuer le commit.

Log message unchanged or not specified
(a)bort, (c)ontinue, (e)dit : 
c
Password:
Sending    CPU-Linux64-icc.txt
Sending    EXT-Linux64-icc.txt 
Sending    EXW-Linux64-icc.txt
Sending    INW-Linux64-icc.txt
Sending    ITE-Linux64-icc.txt
Sending    LKS-Linux64-icc.txt
Sending    MEM-Linux64-icc.txt 
Sending    STP-Linux64-icc.txt
Transmitting file data ........
Committed revision 1677.

6.3 Commiter sur thorgal et gaston

Faire la même chose sur thorgal (*Linux64-gcc.txt) et gaston (*Linux64-clang.txt).

7. Vérifications

A présent, le commit est supposé terminé, les étapes suivantes sont de la vérification.

Le checkout via comp.py nécessite de pouvoir se connecter sans mot de passe. Sinon, on va juste se faire bannir, ce qui n'a pour seul intérêt que de mettre Luc de mauvais humeur… Procédure alternative

Je vérifie que tout compile encore sur les stations.

8. Informer les autres

Une fois que le commit est terminé et qu'on a vérifié que tout fonctionne bien comme on le voulait, il est temps d'envoyer un petit mail au groupe Google du service, avec le lien vers sa page de commit et des commentaires éventuels.

Si par contre on se rend compte qu'on a fait une boulette, on prend son courage à deux mains, on fait ses adieux à ses proches, on met son armure et on va trouver Luc…

En théorie, il faut ensuite mettre à jour l'image d'évolution du temps CPU de la batterie sur le site (obligatoire si on a ajouté des nouveaux cas-tests). Bon, j'avoue que ça j'ai jamais fait… Pour le faire, on va dans oo_meta et :

9. Fêter ça

Amener de la tarte ou du gâteau pour fêter son commit réussi. Malheureusement, il s'agit d'une tradition qui se perd, on ne mange plus du gâteau que pour les anniversaires. C'est bien triste, surtout quand on voit comme ils étaient heureux à l'époque:

Youpi! J'ai fini mon commit!