Les Workflows Git et autres outils DevOPS

Pour une Collaboration Efficace

Jérémie Decock

23 octobre 2023

Les Workflows Git

Un workflow Git définit une série de règles et de bonnes pratiques pour organiser et gérer le travail collaboratif sur des projets de développement logiciel en utilisant Git

Concrètement

Exemples de règles définies par un workflow Git :

  • Quand et comment créer les branches
  • Nomenclature des branches
  • Quand et comment fusionner les branches
  • Quand et comment réviser le code
  • La gestion des tags
  • Comment déployer le code
  • Etc.

Problématique

Git est très flexible et n'impose pas de workflow particulier, c'est-à-dire qu'il n'impose pas de règles pour l'organisation et le cycle de vie des branches.

Intérêt

Structure le processus
Chacun sait quoi faire et quand le faire.
Clarifie les responsabilités
Les rôles de chaque membre de l'équipe sont définis clairement.
Réduit les risques de conflits
Moins de chances de modifier les mêmes parties du code simultanément.
Assure la cohérence
Le code suit les mêmes standards et pratiques à travers le projet.

Choix d'un workflow


Il n'existe pas de modèle de workflow Git universel !

Il existe plusieurs "standards" plus ou moins adaptés en fonction des équipes et des projets.

Ces standards peuvent être adaptés et combinés pour répondre aux besoins d'une équipe.

Choix d'un workflow

Quelques critères à prendre en compte

  • Un workflow doit être simple et améliorer la productivité de l'équipe
  • S'adapte-t-il à la taille de l'équipe ?
  • Est-il facile de corriger les erreurs et les fautes commises dans ce workflow ?
  • Impose-t-il à l'équipe une nouvelle charge cognitive inutile ?

Choix d'un workflow

Source : https://xkcd.com/1597/

Workflow centralisé

Workflow centralisé

Un repo centralisé (e.g. sur GitLab ou GitHub) contient l'historique partégé du projet

Workflow centralisé

La branche de développement par défaut se nomme "main" (ou "master"). Tous les changements sont intégrés dans cette branche.

Workflow centralisé

Ce workflow n'utilise pas d'autre branche.

Il peut convenir pour les petits projets avec très peu de collaborateurs.

Workflow centralisé

Workflow centralisé


							git clone ssh://bob@host/path/to/repo.git
						

Workflow centralisé


							git clone ssh://alice@host/path/to/repo.git
						

Workflow centralisé


							git add some-file
							git commit -m "Add some-file"
						

Workflow centralisé


							git push
						

Workflow centralisé


							git pull
						

Workflow centralisé


							git add some-file
							git commit -m "Add some-file" 
						

Workflow centralisé


							git push
						

Workflow centralisé


							git pull
						

Workflow centralisé

Workflow centralisé

Comme plusieurs développeurs travaillent sur la branche principale, il est difficile de trouver un moment stable pour déployer le projet (en prod).

Les développeurs doivent alors conserver les modifications instables en local jusqu'à ce qu'elles soient prêtes à être publiées.

Feature Branch Workflow

Feature Branch Workflow

La branche principale (master ou main) contient la version "distribuable" du projet.

Chaque nouvelle fonctionnalité est développée dans une branche dédiée plutôt que dans la branche principale.

Ainsi, les développeurs peuvent travailler sur leurs fonctionnalités sans modifier la branche principale.

Feature Branch Workflow

La branche principale n'est plus polluée par des fonctionnalités inachevées (moins de risques de bugs).

C'est une nécessité pour les environnements d'intégration continue (CI/CD).

Feature Branch Workflow

Feature Branch Workflow


							bob (???) $ git checkout main
						

Feature Branch Workflow


							bob (main) $ git checkout -b user-authentication
						

Feature Branch Workflow

Les branches de fonctionnalité doivent avoir des noms descriptifs, comme "sso-authentication" ou "issue-#3029".

Chaque branche doit répondre à un objectif clair et précis.

Feature Branch Workflow


							bob (user-authentication) $ git add app.py
							bob (user-authentication) $ git commit -m "Add a user authentication function."
						

Feature Branch Workflow

Les branches de fonctionnalité peuvent (et doivent) être régulièrement poussées vers le dépôt centralisé pour permettre à d'autres développeurs de travailler sur la même fonctionnalité

Feature Branch Workflow


							bob (user-authentication) $ git push -u origin user-authentication
						

Feature Branch Workflow


							alice (main) $ git fetch
							alice (user-authentication) $ git checkout -t origin/user-authentication
						

Feature Branch Workflow


							alice (user-authentication) $ git add app.py
							alice (user-authentication) $ git commit -m "Add type hints."
						

Feature Branch Workflow


							alice (user-authentication) $ git push
						

Feature Branch Workflow

Création d'une merge request

Feature Branch Workflow

Bob indique que le merge la feature branch est prête à être fusionnée dans la branche principale

Feature Branch Workflow

Le reviewer rejete la requête et demande un développement supplémentaire

Feature Branch Workflow

Il peut préciser les modifications à apporter dans le code

Feature Branch Workflow


							bob (user-authentication) $ git pull
						

Feature Branch Workflow


							bob (user-authentication) $ git add app.py
							bob (user-authentication) $ git commit -m "Add documentation"
						

Feature Branch Workflow


							bob (user-authentication) $ git push
						

Feature Branch Workflow

Revue de la merge request

Feature Branch Workflow

Approbation du merge par le reviewer

Feature Branch Workflow


							bob (user-authentication) $ git pull
						

Feature Branch Workflow

On supprime la branche de fonctionnalité quand la fonctionnalité est achevée et mergée dans la branche principale.

							bob (user-authentication) $ git checkout main
							bob (user-authentication) $ git pull
							bob (user-authentication) $ git branch -d user-authentication
							bob (user-authentication) $ git push origin --delete user-authentication
							bob (user-authentication) $ git fetch -p
						

Feature Branch Workflow

On supprime la branche de fonctionnalité quand la fonctionnalité est achevée et mergée dans la branche principale.

							alice (user-authentication) $ git checkout main
							alice (user-authentication) $ git pull
							alice (user-authentication) $ git branch -d user-authentication
							alice (user-authentication) $ git fetch -p
						

Feature Branch Workflow

Feature Branch Workflow

Idéalement, une branche de fonctionnalité devrait avoir une durée de vie courte : quelques jours voir quelques heures.

Plus la durée de vie de la branche est longue, plus le risque de trouver des conflits d'intégration lors de la fusion avec la branche principale est élevé.

Personal branching Git workflow

Personal branching Git workflow

Chaque développeur a une branche personnelle sur le dépôt centralisé.

La branche principale reflète l'état du projet en production.

Les développeurs poussent leurs modifications de leur branche personnelle vers la branche principale quand les features ajoutées sont prètes.

Personal branching Git workflow

Les développeurs peuvent travailler sur des fonctionnalités sans "polluer" la branche principale avec des fonctionnalités inachevées.

On a les mêmes avantages que le feature branching mais avec moins de branches (pour les petites équipes) donc plus facile à gérer.

Personal branching Git workflow

Ça peut être une option si tous les développeurs travaillent sur des fonctionnalités différentes.

Ça peut être utile pour les développements longs qui ne tiennent pas sur un sprint.

Gitflow Workflow

Gitflow Workflow

Adapté dans le cadre d'un workflow de logiciel basé sur la livraison.

Gitflow fournit un canal dédié pour les hotfix vers la production.

Gitflow Workflow

Il a perdu en popularité.

Difficile à utiliser avec l'intégration et le développement continus.

Gitflow Workflow

Utilise des branches de fonctionnalité et plusieurs branches primaires.

Dans ce modèle, les développeurs créent une branche de fonctionnalité et attendent que la fonctionnalité soit terminée pour la merger à la branche « trunk » principale.

Outre les branches de fonctionnalité (feature), le workflow utilise des branches individuelles pour la préparation, la maintenance et l'enregistrement des livraisons.

Gitflow Workflow

Le flux global de Gitflow :
  1. Une branche develop est créée à partir de main.
  2. Une branche release est créée à partir de la branche develop.
  3. Des branches feature sont créées à partir de la branche develop.
  4. Lorsqu'une fonctionnalité est terminée, elle est mergée dans la branche develop.
  5. Lorsque la branche release est terminée, elle est mergée dans la develop et dans main.
  6. Si un problème est détecté dans la branche main, une branche hotfix est créée à partir de main.
  7. Une fois la branche hotfix terminée, elle est mergée dans develop et dans main.

Feature Branch Workflow

Workflow de duplication ("Fork & Pull")

Workflow de duplication ("Fork & Pull")

Modèle de Référentiel Partagé

Workflow de duplication ("Fork & Pull")

Modèle de "Fork & Pull"

Workflow de duplication ("Fork & Pull")

Modèle de "Fork & Pull"

Workflow de duplication ("Fork & Pull")

Modèle de "Fork & Pull"


							git clone ssh://bob@host/path/to/repo.git
						

Workflow de duplication ("Fork & Pull")

Modèle de "Fork & Pull"

Workflow de duplication ("Fork & Pull")

Modèle de "Fork & Pull"


							git clone ssh://alice@host/path/to/repo.git
						

Workflow de duplication ("Fork & Pull")

Modèle de "Fork & Pull"


							git add bob_file
							git commit -m "Bob's update."
						

Workflow de duplication ("Fork & Pull")

Modèle de "Fork & Pull"


							git push -u origin main
						

Workflow de duplication ("Fork & Pull")

Modèle de "Fork & Pull"

Workflow de duplication ("Fork & Pull")


Exemple : le GitHub flow

https://docs.github.com/fr/get-started/quickstart/github-flow

GitLab Workflow

GitLab Workflow

Similaire au feature branch workflow

Les branches sont créées directement sur GitLab (i.e. sur le dépôt distant) via l'intégration au gestionnaire d'"Issues".

GitLab Workflow

GitLab offre un workflow intégré, depuis le codage jusqu'à la production.

  • Issues : Pour suivre les tâches et les bugs.
  • Merge Requests : Pour la révision du code et l'intégration des changements.
  • CI/CD : Pour l’intégration continue et la livraison continue.

GitLab encourage l'utilisation des branches feature, des merge requests pour la révision du code, et des pipelines CI/CD pour l'automatisation des tests et du déploiement.

GitLab VS Code Extension

Extension VSCode

FLO

Outils et Bonnes Pratiques

Outils et Bonnes Pratiques

Restreindre les droits d'écriture dans la branche principale

Outils et Bonnes Pratiques

Utilise des GitHooks et les GitLab Webhooks pour imposer la conformité des commits à des règles préétablies via des linters et outils d'analyse de code statique

Outils et Bonnes Pratiques

Adopter une approche systématique dans l'utilisation de tests unitaires et outils de converture de code pour éviter les régressions

Bonnes pratiques

Cohérence et taille des commits

Un commit doit contenir des changements cohérents qui vont ensemble.

Les corrections de deux bugs différents doivent se retrouver dans deux commits différents.

Les petits commits sont plus faciles à relire pour les autres développeurs.

En cas de problème, il est plus facile de revenir en arrière avec des commits atomiques.


Source: Git à 100%, R. Hertzog, P. Habouzit. Ed Eyrolles

Bonnes pratiques

Rythme des commits

Faites des commits fréquents et prévenez les conflits.

Partagez votre code avec les autres développeurs le plus tôt possible.

Pour prévenir les conflits qui arrivent plus régulièrement en cas d'intégration tardive dans une branche.

Faire des commits peu fréquents et de grande taille augmente le risque de conflits et génère des conflits plus difficiles à résoudre.


Source: Git à 100%, R. Hertzog, P. Habouzit. Ed Eyrolles

Bonnes pratiques

N'enregistrez pas un travail à moitié fini

Un commit doit contenir un travail complet.

Pour autant que possible, un commit doit être atomique i.e. pas trop volumineux.

Il ne s'agit pas de faire en un seul commit une fonctionnalité compliquée, mais de découper la fonctionnalité en plusieurs petites tâches, et de faire un commit pour chacune de ces tâches.

Ne faites pas un commit le soir avant de quitter le bureau juste pour avoir un répertoire de travail synchronisé. Pour ça, utilisez git stash nom / git stash apply.


Source: Git à 100%, R. Hertzog, P. Habouzit. Ed Eyrolles

Bonnes pratiques

Écrivez de bons messages de commit

Les messages s'adressent tant aux autres qu'à vous-même, ils seront lus par toutes les personnes qui vont ausculter l'historique et ses demander invariablement "pourquoi ce changement ? Qu'est-ce qui a changé ?" plutôt que "Comment fonctionne le code ?"

Un bon message de commit commence par un résumé d'une cinquantaine de caractères qui décrit le changement. Suit une ligne vide qui le sépare du message détaillé, qui sera aussi long que nécessaire.

Un bon message précise donc :

  • ce qui a motivé le changement (bug, nouvelle fonctionnalité, nettoyage, optimisation, ...)
  • ce qui a changé par rapport à la version précédente.
  • ce n'est pas le lieu pour décrire l'implémentation en détail, elle doit l'être dans le code sous forme de commentaires.

Source: Git à 100%, R. Hertzog, P. Habouzit. Ed Eyrolles

Bonnes pratiques

Écrivez de bons messages de commit

Source : https://xkcd.com/1296/

Bonnes pratiques

N'enregistrez jamais de changements non fonctionnels

Testez votre code avant de publier un commit.

Bonnes pratiques

Testez tous les commits

Don’t wait to test until everything has been merged into master. Test commits along the way to catch problems earlier in the process. And run all tests on all the commits, even if you have to run tests in parallel. Code reviews > merging into master. Why wait? "Don’t test everything at the end of the week," Sid writes. "Do it on the spot, because you'll be more likely to catch things that could cause problems, and others will also be working to come up with solutions."

https://about.gitlab.com/blog/2020/03/05/what-is-gitlab-flow/#follow-the-rules

Question ouverte

Qui fait les revues de code ?