ANF Qualité Logicielle
collaboration
Outils de partage de code
Cyril L'Orphelin (CCIN2P3/CNRS)

Les thématiques des outils de partage de code

  • L'hébergement du code
  • La gestion des versions
  • La gestion des cycles de développements
  • La gestion de projet

L'hébergement de code

  • Stockage centralisé du code
  • Gestion des droits d'accès au projet
  • Gestion des membres, groupes
  • Hébergement en mode public, interne ou privé

La gestion de version

  • Enregistrer l’historique des modifications d’un ensemble de fichiers
  • Revenir à des versions précédentes d’un ou plusieurs fichiers
  • Rechercher les modifications qui ont pu créer des erreurs
  • Partager ses modifications et récupérer celles des autres
  • Proposer des modifications, les discuter, sans pour autant modifier la dernière version existante
  • Identifier les auteurs et la date des modifications
  • Travailler en parallèle et fusionner facilement du code

La gestion des cycles de développements

  • Gestion des tests
  • Gestion des déploiements
  • Intégration et déploiement continus
  • Gestion de la documentation
  • Tableaux de bords : Kanban, Scrum ...

La gestion de projet

  • Priorisation, évaluation de vos tâches
  • Suivi d’avancement des projets
  • Suivi des demandes utilisateurs
  • Gestion de configuration logiciel
  • Séparation des rôles
  • Signalement des problèmes ou proposition d'améliorations

Les principaux outils

comparatifs outils

Bitbucket vs Github vs Gitlab

Item Bitbucket GitHub GitLab
VCS supportés nativement
Repository privés Repos privés gratuits Pas de repos privés gratuits Repos privés gratuits
Repository publics Repos publics gratuits Repos publics gratuits Repos publics gratuits
Merge Request Non Oui Oui
Plateforme d'intégration continue Oui Non. Une application tierce peut être utilisée Oui
Open-Source Partiellement. Seulement quelques fonctionalités sont open-source Pas open-source Open-source platform
Large size file storage Oui Oui Oui
Integration d'outils tierces Oui Oui Oui
Points forts CI/CD - Produit Open source - Auto hébergement gratuit Communauté Open Source importante - Nombreux outils tierces Intégration native avec Jira / Trello
outil de suivi de bugs, de gestion des incidents / outil de gestion de projet
Points faibles Fonctionnalités pas aussi nombreuses que Gitlab et Github notamment sur l'interaction avec le code Repo privés payants Lenteurs possibles sur l'interface
Pour la suite de la présentation et des TPs :


  • Gestion de version


  • Gestion de projet
  • Hébergement du code
  • Gestion des cycles de développements
git logo
gitlab logo
Le choix de Git et de Gitlab s'explique par le fait que ce sont à l'heure actuelles les outils de référence. De plus le CC-IN2P3 héberge sa propre version accessible à gitlab.in2p3.fr, assurant ainsi la souveraineté des données par rapport à par exemple Github.

git logo

Caractéristiques de git
Git est défini comme un outil permettant le contrôle des versions d’un projet.
DISTRIBUTED VERSION CONTROL SYSTEM

  • Version Control: Chaque étape de développement du projet est mémorisé, comme pris en photo.

  • Distribué: Chaque dépôt, sur chaque machine est autonome. Pas besoin d’être connecté pour travailler.

  • Collaboratif: Lorsque plusieurs personnes souhaitent collaborer sur un même projet, l’utilisation d’un dépôt de référence permet de gérer les contributions de chacun : Github / Gitlab par exemple

  • Flexible: De tout petits à de très larges projets, mono ou multi contributeurs

Vocabulaire

  • Répertoire de travail : Les fichiers que l’on manipule et qui correspondent à une extraction unique d’une version du projet

  • Index, staging area : désigne tous les fichiers modifiés que vous souhaitez voir apparaître dans votre prochain commit.

  • Repository local : référentiel qui stocke les commits et les autres informations qui sont utiles à la gestion de versions du projet

  • Repository distant : référentiel distant (remote) qui sert à partager l'historique de commits ou à le synchroniser avec d’éventuels membres d’une équipe

  • origin : nom abrégé du référentiel distant à partir duquel un projet a été cloné à l'origine

Vocabulaire - un commit

  • référence qui permet de retrouver l’état du projet à un moment donné dans le temps

  • inclut chaque fichier et dossier, avec l’ensemble des modifications qui ont été enregistrées dans l’historique du projet.

  • identifiable par un hash (SHA-1). Exemple : ecd91c9baab1e7cab9dce65fa9dbefdaf13cd34d généralement résumé aux 7 premiers caractères : ecd91c9.

Vocabulaire - une branche

  • Le chemin qui relie plusieurs commits

  • La branche par défaut se nomme master et est destinée, par convention, à être la branche principale du projet

  • Permet le développement de différentes versions en parallèle

  • 1 pointeur vers un commit (le plus récent)

Vocabulaire - un tag

  • Une étiquette/un alias identifiant un commit

  • Permet la persistance d'un commit

  • Principalement utilisé pour identifier les versions officielles d'un logiciel

  • Evènement particulier du cycle utilisable comme déclencheur dans la CI/CD

                    
 $ git tag v1.3 -m "Première version livrée à l'AIT"
                    
                

Vocabulaire - un merge

  • Fusionner 2 branches / Réconcilier 2 historiques

  • Rapatrier les modifications d'une branche dans une autre

Premiers pas avec Git

  • Git en Ligne de commande
                    
 $ git <command> <arguments>
 $ git help
 $ git help <command>
                    
                
  • Initialisation de votre identité
                    
 $git config --global user.name  "Votre nom"
 $git config --global user.email  "votre @mail"
                    
                

Démarrer un projet
  • Initialisation d’un dépôt Git dans un répertoire existant
  • Si le dossier de travail indiqué n’existe pas, git va le créer.
  • Sans paramètre, la commande crée un dépôt git pour le dossier courant
  •                     $ git init mon_projet
                        
                    
  • Clone d’un dépôt existant à partir d'une url (git@ ou https)
                    $git clone git@gitlab.in2p3.fr:ri3/ecole-info/2021/anf-qualite-logicielle.git
$git clone https://gitlab.in2p3.fr/ri3/ecole-info/2021/anf-qualite-logicielle.git
                    
                
Le fichier .gitignore
  • Git c'est très pratique pour partager du code, mais on ne veut pas toujours mettre à disposition toutes ses sources.
  • Par exemple, le fichier qui comprend les mots de passe des bases de données, des fichiers caches ou compilés, etc.
  • Git fournit bien évidemment un outil pour ça: le fichier .gitignore
  • Ce fichier se nomme forcément .gitignore (Il commence donc par un point !).
  • Il se trouve à la racine du repository
Le fichier .gitignore
*.txt
dossier/
dossier2/*.jpg
motdepasse.csv
/ressources/*
!/ressources/presentations
LigneEffet
*.txt Cette ligne permettra d'ignorer tous les fichiers textes où qu'ils soient
dossier/ Cette ligne ignorera l'ensemble du contenu de dossier et par extension, le dossier lui-même (Git ne conserve pas les dossiers vides)
dossier2/*.jpg Cette ligne ignorera les *.jpg dans le dossier2. Par contre, si dossier2 a des enfants (dossier2/sousdossier1) et des jpg à l'intérieur, il seront versionnés
motdepasse.csv Cet ligne permet d'ignorer le fichier motdepasse.csv dans le dossier principal
/ressources/*/
!/ressources/presentations
Ces ligne permettent d'ignorer le contenu du répertoire ressources sauf ce qui se trouve dans presentations
Mon premier commit
  • La commande git status permet à tout moment de connaître l'état actuel du dépôt
                    $ git status
 >> Sur la branche cyril_branch_demo  rien à valider, la copie de travail est propre
 $ echo "Ajout d'une ligne dans mon fichier" > monFichier.txt
 $ git status
 >> Sur la branche cyril_branch_demo
 >> Fichiers non suivis :
  (utilisez "git add <fichier>..." pour inclure dans ce qui sera validé)
  monFichier.txt
                    
                    
  • La commande git add permet de référencer le fichier physique dans l’index
                    $ git add monFichier.txt
 $ git status
 >> Sur la branche cyril_branch_demo
 >> Modifications qui seront validées :
    (utilisez "git restore --staged <fichier>..." pour désindexer)
    nouveau fichier: monFichier.txt
                    
                
  • Valider le nouveau fichier et, ainsi, créer le commit git commit
$ git commit -m “message pour expliquer ce que j’ai fait”
$ git status
>> Sur la branche cyril_branch_demo, rien à valider, la copie de travail est propre

                    

Bonnes pratiques

  • Faire des commits fréquents

  • Ecrire des messages de commits clairs

  • Un formalisme peut être adopté pour cette partie

    • [func] mon commentaire pour l’ajout d’une fonctionnalité
    • [edit] pour la modification d’une fonctionnalité
    • [del] pour la suppression d’une fonctionnalité ou fichier
    • [fix] pour la correction d’un bug
    • [refa] pour du refactor de code
    • [misc] quand aucun des tags précédant ne correspond à la tâche
Dépot distant
  • Transférer les commits locaux vers le dépôt distant: git push
git push <remote> <branche>
git push <remote> --all # Permet d'envoyer toutes les branches
  • Git ne permet pas de push si le dépôt distant est en décalage , l'option --force est nécessaire dans ce cas
git push <remote> --force
  • Importer les informations du dépôt distant: git fetch
git fetch <remote> <branche>
git fetch <remote>  # Récupère toutes les branches et tous les commits
  • git pull : cette commande récupère le contenu distant (fetch) puis tente de mettre à jour le contenu local par fusion (merge)
    • Dans une grosse collaboration il faut régulièrement utiliser cette commande pour éviter les conflits
git pull <remote> <branche>
git pull <remote>
Dépot distant : Gitlab
  • Pour cloner / pull / push un projet sur gitlab 2 protocoles possibles : HTTPS et SSH
  • l'avantage principale de la clé SSH avec la sécurité est le fait de ne pas re-saisir son login/mdp à chaque opération distante


    La configuration pour le ssh se déroule en 2 temps
  1. Génération ou récupération d'une clé SSH
  2. Ajout de la clé dans Gitlab : https://gitlab.in2p3.fr/-/profile/keys
Une collaboration basé sur les branches
  • Interagir sur un dépot distant : la base pour un outil collaboratif

  • Par contre interagir sur la même branche peut poser problème

    • on peut vouloir intégrer des fonctionnalités différentes et les tester individuellement
    • on peut vouloir faire des tests de développement
    • on peut vouloir garder une branche de référence propre et testée
  • Il est donc nécessaire de créer des branches et de bien les organiser

Bonnes pratiques
  • Par convention, au départ d'un projet il existe une seule branche : master (ou main)

  • Mais idéalement on ne fait jamais de git push sur cette branche master

  • Il est nécessaire de créer des branches qui correspondent à des unités de développement

Les branches
  • Ajout, listing, suppression, renommage : git branch
git branch              # Permet de lister les branches
git branch <branche>    # Permet de créer une nouvelle branche <branche>
git branch -m <branche> # Renomme la branche courante en <branche>
git branch -d <branche> # Permet de supprimer une branche
  • Se placer sur une branche: git checkout
  • Nouvelle version (git v2.23) : git switch
git checkout <branche>
git switch <branche>  # Se placer sur la branche <branche>

git checkout -b <branche>
git switch -c <branche>  # Créer la branche <branche> et se positionner dessus
                
Fusionner des branches
  • Le merge permet de ramener une branche sur une autre et ainsi de la fusionner. La fusion de 2 branche se fait toujours à partir de la branche principale.
    • La branche "source" sera affectée en récupérant l'historique de la branche ou un commit de fusion
    • La branche fusionnée ne sera pas affectée
    • l'étape de fusion peut se faire directement dans Gitlab
    
    git merge <branche> # Fusionne la branche <branche> avec la branche courante
                            
                            
    $ git checkout -b ma_feature
      Switched to branch 'ma_feature'
    [ .... Travail sur la branche, successions de commits .... ]
    
    $ git checkout develop
      Switched to branch 'develop'
    
    $ git merge ma_feature
      Updating ea1b82a..05e9557
      (Summary of changes)
    
    $ git branch -d ma_feature
      Deleted branch ma_feature (was 05e9557).
    
    $ git push origin develop
                            
                            
  • En cas de conflit de fusion (mêmes sections de fichier ayant été modifiées différemment dans les deux branches fusionnées), lancez git status pour connaître les fichiers concernés, éditez-les pour régler les problèmes entourés par <<<<<<< et >>>>>>> puis indexer de nouveau ces fichiers pour signifier que le conflit a été résolu.
Bonnes pratiques pour ne pas se perdre
  • Savoir où vous en êtes avec l'état de vos fichiers
    git status

  • Identifier les différences entre vos fichiers, branches
    git diff

  • Identifier les contenus des commits
    git show, git log

Git diff
  • Visualisez les modification entre l'index et votre répertoire de travail courant - changements non comités : git diff
                    $ touch monAutreFichier.txt
$ git diff
$ git add monAutreFichier.txt
$ echo "une nouvelle ligne" > monAutreFichier.txt
$ git diff
diff --git a/monAutreFichier.txt b/monAutreFichier.txt
index 0fe633e..10a5e3d 100644
--- a/monAutreFichier.txt
+++ b/monAutreFichier.txt
@@ -1 +1 @@
-ll
+une nouvelle ligne
$ git commit
$ git diff
  • Visualisez les différences entre 2 commits
  • git diff <commit1> <commit1>
  • Visualisez les différences entre 2 branches
  • git diff <branche1> <branch2>
  • Visualisez les différences entre la branche locale et distante
  • git diff develop origin/develop
Git log
  • Consultez l'historique des commits : git log
  • $ git log
    
    commit 27329d3afac51fbf2762428e12f2635d1137c549 (origin/master, origin/HEAD, master)
    Author: Administrator <admin@example.com>
    Date:   Mon Feb 15 15:52:52 2021 +0000
        Update README.md
    
    commit b362ea7aa65515dc35ff3a93423478b2143e771d
    Author: Administrator <admin@example.com>
    Date:   Mon Feb 15 15:52:03 2021 +0000
        Initial commit
  • pour un affichage concis utilisez l'option --oneline
  • $ git log --oneline
    
    27329d3 (origin/master, origin/HEAD, master) Update README.md
    b362ea7 Initial commit
    $ git log --all --decorate --oneline --graph 
Git show
  • pour le détail d'un commit : git show <commitId>
  • $ git show 27329d3
    
    commit 27329d3afac51fbf2762428e12f2635d1137c549 (origin/master, origin/HEAD, master)
    Author: Administrator <admin@example.com>
    Date:   Mon Feb 15 15:52:52 2021 +0000
    
        Update README.md
    
    diff --git a/README.md b/README.md
    index 9ff40b5..047477f 100644
    --- a/README.md
    +++ b/README.md
    @@ -1,2 +1,8 @@
     # Sample GitLab Project
    
    +This sample project shows how a project in GitLab looks for demonstration purposes.
    It contains issues, merge requests and Markdown files in many branches,
    +named and filled with lorem ipsum.
    +You can look around to get an idea how to structure your project and, when done, you can safely delete this project.
    
                        
Git en mode avancé
git en mode avancé
git stash
  • Sauvegarder les modifications du working directory dans une zone tampon pour rendre le working directory propre.

  • Possibilité de rejouer les modifications stashées sur la branche en cours OU sur une autre branche

  • Peut être vu comme une zone de brouillons

  • Cette commande peut être utile en cas de développement avec des changements de contextes réguliers

  • #on bloque les modifs dans la zone tampon
    $ git stash
    
    # on récupère les modifs stashées
    $ git stash apply # garde le stash pour une utilisation future
    $ git stash pop # jette le stash
    
    # pour plusieurs stashs
    $ git stash list
    $ git stash apply stash@{id}
    
    # Pour effacer un stash
    $ git stash drop stash@{id}
    # pour effacer toute la liste
    $ git stash clear
                        
La fusion des historiques : git merge
Par défaut et si c'est possible suite à un git merge, git va opter pour un merge avec fast-forward
  • un chemin linéaire est construit entre les deux branches à fusionner
  • les commits de la feature sont fusionnées dans la branche de destination


Sinon si il y a conflit ou si l'option --no-ff est utilisée, un commit de fusion est crée en plus des commits de la feature
  • avec l'historique de résolution si conflit
  • avec un historique des commits de chaque branche
merge fast forward
La linéarisation des historiques : git rebase
  • Dans le cas où la branche principale a évolué, on ne peut appliquer un git merge en mode fast-forward

  • On peut en revanche faire un git rebase

  • les commits de la branche feature vont être appliqués un par un sur et dans l'ordre sur la branche principale

  • On garde un historique linéaire et lisible

# Sur la branche feature
$ git rebase develop
$ git checkout develop
$ git merge feature
                
merge fast forward
git merge VS git rebase
  • Mettre à jour une branche complètement indépendante, une branche de travail local: git rebase ou git merge en mode fast forward

    • Évite l’introduction de bruit.

    • Conserve un historique linéaire

  • Mettre à jour une branche partagée ou une branche qui risque d'être "conflictuelle": git merge --no-ff sans fast-forward.

    • Tous les merges sont représentés par un commit de fusion.

    • Isolation simple des régressions

Pour aller plus loin ...

Gitlab

gitlab logo
Principales fonctionnalités
  • Planification, ordonnancement, gestion de tâches, d’équipe ….

  • Hébergement, sauvegarde et mise à disposition du code

  • Suivi de problèmes, tests et intégration continue

  • Partage de l’information, espace d’échange (wiki …), notifications

  • Hébergement, génération de pages web

Instance utilisée
stats gitlab
Page principale : listing des projets
  1. Gestion des groupes et projets (listing à gauche et ajout au centre)

  2. Issues, tasks, merge requests

  3. Info à propos de Gitlab dont l'aide

  4. Accès à votre compte / préférences

DEMO
Creation d'un nouveau projet
Lorsque vous créez un nouveau projet
  • il peut résider soit dans votre espace personnel :
    https://gitlab.in2p3.fr/votre_nom/nom-du-projet
  • il peut résider soit dans un groupe existant:
    https://gitlab.in2p3.fr/mon_equipe/nom-du-projet
  • avec plusieurs options de visibilité


VisibilitéScope
PrivéVous serez le seul à pouvoir accéder au projet et à donner des permissions à l'unité
InterneSeuls les utilisateurs authentifiés peuvent voir le projet
Public N'importe qui, même non authentifié peut voir le projet
Dépot / Repository
  • Vous pouvez gérer les membres et visualiser l'activité générale dans la partie projets

  • Visualisez les fichiers, les commits , les branches ... toutes les infos liées au repository

  • Comparez les branches / commits

DEMO
issues Les Issues
    Avec les issues vous pouvez
  • Assigner, estimer des tâches

  • Organiser votre travail avec les labels, et les milestones

  • Gérer des roadmaps

  • Commenter et discuter

  • Recevoir des notifications

DEMO
logo merge Merge Request
  • Une Merge Request désigne la demande faite au responsable d’un dépôt Git de prendre en compte les modifications que vous avez effectuées et que vous souhaitez partager

  • En gros, il s'agit d'un git merge avec validation dans les interfaces gitlab

  • Une Merge Request peut être commentée ligne par ligne par un ou plusieurs relecteur

  • Elle offre un aperçu de toutes les différences entre la branche à merger et la branche cible.

  • La fonctionnalité équivalente dans GitHub s'appelle une Pull Request

DEMO
Gitlab CI / CD
  • Gitlab permet de faire facilement de l’intégration continue. Il suffit d’ajouter, au dépôt Git, un fichier .gitlab-ci.yml décrivant les “jobs” du “pipeline” à exécuter lors des modifications de code

  • La CI CD permet de mettre en place des étapes automatisées de test, d'analyse de code, de déploiement de l'application ou mêmes des pages statiques : les Gitlab pages

    • cela permet facilement de créer et d'exposer un site web statique
      • page perso
      • documentation d'un projet
      • UI
  • Plus de détails dans la présentation
    "Outils de construction du code final, d'intégration et de déploiement continus"

Settings / Paramètres
    Vous allez retrouver dans ce menu tous les paramètres / préférences liées aux menus précédents, dans les choses à retenir:
  • Modification de la visibilité / des droits du projet

  • L'archivage, le renommage, le transfert du projet

  • la gestion des tokens d'accès au repository, à la registry et l'API

  • la gestion des tokens et clé de déploiements

  • la gestion de la protection des branches

  • sur la partie CI/CD : la gestion des runners, des artefacts de build, des variables

Ressources complémentaires