Gestion de plusieurs branches en intégration continue

j'ai été confronté au problème de la mise à l'échelle de CI dans mon entreprise et en même temps essayer de comprendre quelle approche à adopter quand il s'agit de CI et de plusieurs succursales. Il y a une question similaire à stackoverflow, Plusieurs branches et d'intégration continue . J'en ai commencé un nouveau parce que j'aimerais avoir plus de discussion et fournir une certaine analyse dans la question.

Jusqu'à présent, j'ai trouvé qu'Il ya 2 approches principales que je peux prendre (ou peut-être d'autres???).

donc il semble que si je veux fournir aux devs Des CI pour leurs propres branches personnalisées j'ai besoin d'un outillage spécial pour Jenkins (API ou shellscripts ou autre chose?) et la poignée de mise à l'échelle. Ou je peux leur dire de fusionner plus souvent à DEV et de vivre sans CI sur les branches personnalisées. Laquelle aimeriez-vous prendre ou existe-il d'autres options?

84
demandé sur Community 2011-04-10 15:14:58

4 réponses

quand vous parlez de mettre à l'échelle CI, vous parlez vraiment de mettre à l'échelle l'utilisation de votre serveur CI pour gérer toutes vos branches de fonctionnalité avec votre ligne principale. Au départ, cela semble être une bonne approche puisque les développeurs d'une direction générale obtiennent tous les avantages des tests automatisés que les tâches de CI comprennent. Cependant, vous rencontrez des problèmes dans la gestion des tâches du serveur de CI (comme vous l'avez découvert) et, plus important encore, vous ne faites pas vraiment de CI. Oui, vous utilisez un serveur CI, mais vous n'êtes pas intégration continue du code de tous vos développeurs.

exécuter Real CI signifie que tous vos développeurs s'engagent régulièrement sur la ligne principale. Facile à dire, mais le plus dur est de le faire sans casser votre application. Je vous recommande vivement de consulter la section livraison continue , en particulier la section maintien de la diffusion de votre Application dans la section chapitre 13: gestion des composants et des dépendances . Les principaux points sont:

  • Cacher la nouvelle fonctionnalité jusqu'à ce qu'elle soit terminée (A. K. A options ).
  • faire tous les changements progressivement sous forme d'une série de petits changements, dont chacun est diffusable.
  • utiliser branche par abstraction pour apporter des changements à grande échelle à la base de codes.
  • utilisez des composants pour découpler les parties de votre application qui changement à des taux différents.

ils sont assez explicites sauf branche par abstraction. C'est juste un terme fantaisiste pour:

  1. créez une abstraction sur la partie du système que vous devez changer.
  2. Refactoriser le reste du système à l'utilisation de la couche d'abstraction.
  3. Créer une nouvelle mise en œuvre, qui ne fait pas partie de la chemin du code de production jusqu'à son achèvement.
  4. mettez à jour votre couche d'abstraction pour déléguer à votre nouvelle implémentation.
  5. Supprimer l'ancienne implémentation.
  6. Enlever la couche d'abstraction si elle n'est plus appropriée.

le paragraphe suivant du Branches, flux, et L'Intégration Continue section dans Chapitre 14: avancé Le contrôle de Version résume les impacts.

l'approche progressive exige certainement plus de discipline et de soin - et en fait plus de créativité - que la création d'une branche et la plongée gung-ho dans la ré-architecture et le développement de nouvelles fonctionnalités. Mais il réduit de manière significative le risque de vos changements de briser l'application, et économisera votre et votre équipe beaucoup de temps de fusion, de réparation des bris, et de mettre votre application dans un déployable de l'état.

il faut tout un changement d'esprit pour abandonner les branches caractéristiques et vous obtiendrez toujours de la résistance. D'après mon expérience, cette résistance est basée sur le fait que les développeurs ne se sentent pas en sécurité en commettant le code de la ligne principale et c'est une préoccupation raisonnable. Ceci à son tour provient généralement d'un manque de connaissance, de confiance ou d'expérience avec les techniques énumérées ci-dessus et peut-être avec le manque de confiance avec vos tests automatisés. Le premier peut être résolu avec formation et assistance aux développeurs. Ce dernier est un problème beaucoup plus difficile à traiter, cependant brancher ne fournit pas de sécurité réelle supplémentaire, il ne fait que retarder le problème jusqu'à ce que les développeurs se sentent assez en confiance avec leur code.

69
répondu Tom Howard 2014-03-04 11:45:00

je mettrais en place des emplois distincts pour chaque branche. J'ai déjà fait ça et ce n'est pas difficile à gérer et à configurer si vous avez mis en place Hudson/Jenkins correctement. Un moyen rapide de créer plusieurs emplois est de copier à partir d'un emploi existant qui a des exigences similaires et de les modifier au besoin. Je ne suis pas sûr si vous voulez permettre à chaque développeur de configurer leurs propres travaux pour leurs propres branches, mais ce n'est pas beaucoup de travail pour une seule personne (c.-à-d. un gestionnaire de construction) à gérer. Une fois que les branches personnalisées ont été fusionnées en branches stables, les emplois correspondants peuvent être supprimés lorsqu'ils ne sont plus nécessaires.

si vous êtes inquiet de la charge sur le serveur CI, vous pouvez configurer des instances distinctes du CI ou même des esclaves séparés pour aider à équilibrer la charge sur plusieurs serveurs. Assurez-vous que le serveur sur lequel vous utilisez Hudson/Jenkins est adéquat. J'ai utilisé Apache Tomcat et je devais juste m'assurer qu'il avait assez de mémoire et de puissance de traitement pour traiter la file d'attente de compilation.

il est important d'être clair sur ce que vous voulez accomplir en utilisant L'assurance-récolte et ensuite de trouver un moyen de le mettre en œuvre sans trop de travail manuel ou de duplication. Il n'y a rien de mal à utiliser d'autres outils ou scripts externes qui sont exécutés par votre serveur de CI et qui aident à simplifier votre processus de gestion globale de la construction.

4
répondu Bernard 2011-04-12 15:27:48

je choisirais dev+branches stables. Et si vous voulez toujours des branches personnalisées et que vous avez peur de la charge, alors pourquoi ne pas déplacer ces branches personnalisées vers le nuage et laisser les développeurs le gérer eux-mêmes, par exemple http://cloudbees.com/dev.cb C'est la compagnie où Kohsuke est maintenant. Il y a aussi un outil Eclipse, donc si vous êtes sur Eclipse, vous l'aurez étroitement intégré directement dans dev env.

3
répondu Anton Safonov 2011-04-14 10:51:06

en fait, ce qui est vraiment problématique est de construire l'isolement avec des branches de fonctionnalité. Dans notre société, Nous avons un ensemble de projets maven distincts faire partie d'une plus grande distribution. Ces projets sont gérés par différentes équipes, mais pour chaque distribution de tous les projets doivent être libérés. Une caractéristique peut maintenant se chevaucher d'un projet à l'autre et c'est quand construire l'isolement devient douloureusement. Il y a plusieurs solutions que nous avons essayées:

  • dépôts de snapshots dans nexus pour chaque branche de fonctionnalité
  • partager des dépôts locaux sur des esclaves dédiés
  • utiliser le dépôt-serveur-plugin avec des dépôts en amont
  • construire tout en un seul emploi avec un dépôt privé

en fait, la dernière solution est la plus prometteuse. Toutes les autres solutions manquent d'une façon ou d'une autre. Avec le plugin job-dsl, il est facile de configurer nouvelle branche. il suffit de copier et coller le script groovy, d'adapter les branches et de laisser la tâche seed créer les nouveaux emplois. Assurez-vous que la tâche d'ensemencement supprime les tâches non manuelles. Ensuite, vous pouvez facilement passer à l'échelle avec les branches de fonctionnalité sur différents projets maven.

mais comme tom l'a dit bien au-dessus, il serait plus agréable de surmonter la nécessité des branches de fonctionnalité et d'enseigner aux devs à intégrer proprement, mais c'est un processus plus long et le résultat n'est pas clair avec de nombreuses parties de système d'héritage vous ne touche plus.

my 2 cents

1
répondu prosailor 2015-03-05 11:49:09