Exceller dans la CI grâce aux branches de fonctionnalités et à Bamboo

La création de branches facilite la livraison d'une version au pied levé, mais il y a un hic.

Sepideh Setayeshfar Sepideh Setayeshfar

Ce n'est un secret pour personne que les développeurs ont besoin de liberté pour apporter des changements et exécuter des tests sans craindre de perturber la ligne de code principale. Et ils peuvent le faire grâce à la création de branches, l'élément magique qui permet de modifier, développer et tester des parties du code de manière isolée et en parallèle.

Grâce à Git et Mercurial, la création de nombreuses branches est passée du rêve à la réalité, comme nous l'avons expliqué en détail dans Cinq conseils sur les dépôts Git compatibles avec la CI. Pourtant, malgré tous leurs avantages, l'utilisation de branches dans un pipeline de livraison continue peut créer deux problèmes distincts :

Exigences

Durée :

30 minutes

Public :

Vous êtes novice en matière de déploiement continu et/ou vous débutez dans Bitbucket Pipelines.

Prérequis :

Essayez-le gratuitement

Duplication et dérive de la configuration de build

  • Lorsqu'un développeur crée une branche, quelques configurations de build sur le serveur de CI doivent être clonées manuellement. Étant donné qu'il s'agit d'une étape manuelle, certains développeurs ne s'en préoccupent pas, et aucun test n'est donc exécuté lors du développement de la fonctionnalité. Même lorsque nous prenons la peine de copier les configurations de CI pour nos branches de fonctionnalités, nous apportons souvent de petits changements ça et là. Ensuite, nous clonons les configurations modifiées pour notre prochaine fonctionnalité, nous apportons d'autres changements et, finalement, la configuration de build s'éloigne de la configuration originale à partir de laquelle elle a été clonée, ce qui cause des maux de tête à l'administrateur (et des surprises désagréables lorsque la branche est mergée dans la branche principale).

Incertitude sur l'état de l'intégration

  • À moins d'être constamment en train de merger les changements de la branche principale (que j'appellerai principale) dans la nôtre et d'exécuter les tests, il y a toujours une incertitude quant à savoir si nos changements fonctionnent ou non, au moins jusqu'à ce que la branche soit mergée dans la principale. Naturellement, les changements ne fonctionnent pas souvent comme prévu, et la branche principale est alors polluée par du code non fonctionnel, ce qui va à l'encontre de l'objectif des branches de fonctionnalités et de la CI !

Bamboo a traité et résolu ces deux problèmes avec une fonctionnalité que nous appelons « branches de plan », qui sera décrite en détail ici. Poursuivez votre lecture !

Branches de plan pour les branches de fonctionnalités

Une branche de plan est un élément de votre plan de build dans Bamboo qui correspond à une branche dans votre dépôt. Elle hérite de toute la configuration définie par le plan parent, sauf qu'au lieu de builder à partir de la principale, elle builde à partir d'une branche. Ensuite, lorsque le build de la branche réussit, les changements peuvent être mergés automatiquement de la branche vers la principale. Il est également possible de déployer les builds de branche réussis dans un environnement de test en utilisant les fonctionnalités de déploiement de Bamboo (plus d'informations à ce sujet seront disponibles dans un autre billet).

Comme vous pouvez le voir dans la capture d'écran ci-dessous, notre plan appelé « A CI Tests » ne builde pas seulement la branche principale, mais aussi la branche d'intégration et quelques branches dédiées à des tickets Jira (BDEV-10045-bump-tomcat-plugin-5-1, par exemple). Bamboo permet de repérer facilement les plans comportant des branches grâce à l'affichage du symbole de branche.

Capture d'écran de branches de plan dans le tableau de bord de build de Bamboo

Pour configurer cette fonctionnalité pour un plan existant...

  • Connectez-vous en tant qu'utilisateur disposant de privilèges d'administrateur pour ce plan.
  • Accédez à l'écran de configuration en cliquant sur l'icône représentant un crayon sur le tableau de bord de Bamboo ou en utilisant le menu Actions sur l'écran des résultats de build.
  • Sur l'écran de configuration, cliquez sur l'onglet Branches.

À partir de là, nous pouvons configurer Bamboo pour qu'il détecte automatiquement les nouvelles branches dans le dépôt et crée la branche de plan correspondante. Notez que la détection automatique des branches n'est actuellement disponible que pour les dépôts Git, Mercurial et Subversion. Mais ne vous sentez pas exclu si vous utilisez un autre système de contrôle de version comme TFS ou Perforce. Vous avez également la possibilité de créer une branche de plan manuellement.

Conseil de pro : vous ne voudrez probablement pas builder chaque branche que vous créez. Si vous utilisez une convention d'appellation où toutes les branches que vous souhaitez tester commencent par exemple par « feature-* », vous pouvez configurer Bamboo de sorte à ne créer que les branches de plan qui correspondent à ce préfixe. (Vous pouvez également utiliser des expressions régulières dans ces configurations.)

Capture d'écran de la gestion de branches dans la configuration Bamboo

Comme la plupart des branches de fonctionnalités ont une durée limitée (3-4 jours tout au plus), vous pouvez configurer le plan de manière à supprimer la branche et ses résultats de build de Bamboo après un certain nombre de jours d'inactivité. Vous pouvez désactiver cette fonctionnalité pour chaque branche si vous souhaitez la conserver pour une durée indéterminée, après quoi vous devrez la supprimer manuellement. Ne vous inquiétez pas : que vous supprimiez une branche de plan automatiquement ou manuellement, Bamboo ne supprimera pas la branche elle-même de votre dépôt. Nous vous laissons le soin de prendre cette décision. Cela dit, la désactivation pure et simple du nettoyage automatique pour certaines branches est une bonne idée dans les cas où vous maintenez une branche « stable » au long cours de votre projet.

Buildez simplement chaque branche

Bien que nous recommandions vivement d'utiliser Git, il est possible de créer une branche de plan pour tout système de contrôle de version pris en charge par Bamboo. Pour créer une branche de plan manuellement...

  • Accédez à l'écran des résultats de build de votre plan et sélectionnez Configure plan (Configurer le plan) dans le menu Actions.
  • Cliquez sur l'onglet Branches, puis sur le bouton Create branch (Créer une branche).
  • Pour Git et Mercurial, une boîte de dialogue apparaîtra, répertoriant toutes les branches disponibles dans le dépôt qui ne disposent pas encore d'une branche de plan correspondante dans Bamboo.
  • Choisissez une branche et appuyez sur Create (Créer).
  • Les utilisateurs des dépôts du système de version centralisé devront simplement choisir un nom, une description et la branche qu'ils souhaitent utiliser (pour Subversion, il s'agit de l'URL de la branche) avant d'appuyer sur Créer.
Capture d'écran de la création d'une branche de plan

Vous pouvez maintenant désactiver le nettoyage automatique pour la branche de plan actuelle si vous le souhaitez, et dans le cas des dépôts DVCS, configurer une stratégie de merge. Les stratégies de merge permettent à Bamboo de merger automatiquement le code entre les branches lors des builds réussis (nous y reviendrons plus tard). Il est également possible à ce stade de remplacer les informations sur le dépôt (si vous utilisez les branches de plan avec Subversion, vous pouvez remplacer l'URL SVN de « trunk » par cette branche-ci) ou remplacer les variables de build. Par exemple, vous pouvez avoir une variable qui spécifie, si vous allez déployer en production, que vous souhaitez peut-être changer pour la branche de plan.

Capture d'écran des configurations de branches dans la configuration Bamboo

Étant donné que les étapes de build pour les builds de plan parent et les builds de branche de plan fonctionnent exactement de la même manière, les configurations telles que les déclencheurs et les notifications seront héritées du plan parent. Toutefois, vous pouvez écraser ces paramètres (et d'autres) pour chaque branche dans la configuration de chaque branche de plan.

Merge automatique de branches

Étant donné que vous ne savez pas vraiment si tout fonctionne tant que vous n'avez pas mergé les changements vers (ou depuis) la branche principale, Bamboo fournit deux façons de le faire automatiquement dans les dépôts DVCS. Nous appelons ces options « Branch updater » et « Gatekeeper », et vous pouvez utiliser l'une ou l'autre méthode sur n'importe quelle branche de plan. Avant que le build ne soit lancé, Bamboo mergera les derniers changements de la principale dans la branche si vous utilisez branch updater, ou exécutera la commande checkout main et mergera les changements de votre branche si vous utilisez gatekeeper. (Plus d'informations sur le choix d'un modèle de merge dans les documents Bamboo.) Bamboo exécute ensuite le build.

Capture d'écran du merge de branches

Si le build est réussi et que vous avez activé l'option Push on success (Faire un push en cas de réussite), le merge est automatiquement commité et pushé vers le dépôt. Si vous utilisez le modèle gatekeeper, cela signifie que les changements sur la branche sont pushés vers la branche principale. Si vous utilisez le modèle branch updater, la branche de fonctionnalité est mise à jour avec les changements qui se produisent sur la principale.

Capture d'écran des informations d'intégration dans les résultats de build Bamboo

C'est vraiment ce que j'appelle une intégration continue !

Comme je l'ai mentionné précédemment, les branches de plan peuvent être connectées à des projets de déploiement et faire partie de cette phase du cycle de livraison continue. Poursuivez votre lecture pour en savoir plus à ce sujet.