La gestion simultanée de plusieurs branches de l'intégration continue
J'ai du faire avec le problème de la mise à l'échelle CI dans mon entreprise et dans le même temps à essayer de comprendre l'approche à prendre quand il s'agit de CI et de multiples branches. Il y a une question similaire à stackoverflow, De multiples branches et d'intégration continue. J'ai commencé un nouveau parce que je voudrais avoir plus de discussion et de fournir une analyse de la question.
Jusqu'à présent, j'ai trouvé qu'il y a 2 approches principales que je peux prendre (ou peut-être quelques autres???).
- Plusieurs ensemble d'emplois (en parlant de Jenkins/Hudson ici) par branche
- Écriture de l'outillage pour gérer les emplois supplémentaires
- De créer/modifier/supprimer des Emplois en vrac
- Paramètres personnalisés pour chaque emploi par branche (SCM url, dep gestion de repos duplications)
- Quelques exemples de gens qui s'attaquent à ce problème avec la coquille des outils, des scripts ant et Jenkins CLI. Voir:
- http://jenkins.361315.n4.nabble.com/Multiple-branches-best-practice-td2306578.html
- http://jenkins.361315.n4.nabble.com/Is-it-possible-to-handle-multiple-branches-where-some-jobs-should-run-on-each-one-without-duplicatin-td954729.html
- http://jenkins.361315.n4.nabble.com/Parallel-development-with-branches-td1013013.html
- Configurer ou Créer hudson travail automatiquement
- De causer plus de charge sur votre CI cluster
- Cycle de rétroaction pour les devs se ralentit, (si l'infrastructure ne peut pas gérer la nouvelle charge)
- Écriture de l'outillage pour gérer les emplois supplémentaires
- Multiples d'emplois par 2 branches (dev & stable)
- Gérer les deux ensembles manuellement (si vous changez la conf d'un emploi, puis assurez-vous de changer dans l'autre direction)
- PITA, mais au moins si peu pour gérer
- D'autres branches n'obtiendrez pas une suite de tests complète avant d'obtenir poussé à dev
- Insatisfaits devs. Pourquoi un dev se soucient de CI, de mise à l'échelle des problèmes. Il a une simple demande, quand je le branche, je voudrais tester mon code. Simple.
- Gérer les deux ensembles manuellement (si vous changez la conf d'un emploi, puis assurez-vous de changer dans l'autre direction)
Il semble donc que si je veux que les devs avec CI pour leurs propres branches j'ai besoin d'outils spéciaux pour Jenkins (API ou de scripts ou quelque chose?) et la poignée de mise à l'échelle. Ou je peux leur dire de fusionner plus souvent de DEV et de vivre sans CI sur les branches. Laquelle aimeriez-vous prendre ou existe-il d'autres options?
Vous devez vous connecter pour publier un commentaire.
Quand vous parlez de mise à l'échelle CI que vous parlez vraiment de mise à l'échelle de l'utilisation de votre serveur CI pour répondre à tous vos branches avec votre réseau principal. Au départ, cela ressemble à une bonne approche que les développeurs dans une branche bénéficiez de tous les avantages de l'automatisation des tests que le CI parmi les emplois. Cependant, vous rencontrerez des problèmes de gestion du serveur CI emplois (comme vous l'avez découvert) et, plus important encore, vous n'êtes pas vraiment en train de faire CI. Oui, vous utilisez un serveur CI, mais vous n'êtes pas en permanence intégrer le code à partir de l'ensemble de vos développeurs.
Réel CI, tous les développeurs sont en train de commettre régulièrement à la canalisation principale. Facile à dire, mais le plus dur est de le faire sans casser votre application. Je vous recommande vivement de regarder La Livraison Continue, en particulier la Garder Votre Demande Détachable section dans Chapitre 13: Gestion des Composants et des Dépendances. Les points principaux sont:
Ils sont assez explicites à l'exception de la branche par l'abstraction. C'est juste un terme de fantaisie pour:
Le paragraphe suivant de l' Branches, les Ruisseaux, et d'Intégration Continue section dans Chapitre 14: Avancée de Contrôle de Version résume les impacts.
Il faut tout un changement de mentalité à abandonner les branches et vous bénéficiez toujours de la résistance. Dans mon expérience, cette résistance est basé sur les développeurs de ne pas se sentir en sécurité commettre code le la voie principale, et c'est une préoccupation raisonnable. Ce à son tour, généralement due à un manque de connaissances, de la confiance ou de l'expérience avec les techniques mentionnées ci-dessus et, éventuellement, avec le manque de confiance avec vos tests automatisés. L'ancien peut être résolu avec de la formation et de support de développeur. Ce dernier est beaucoup plus difficile à gérer, mais la ramification ne fournit pas de supplément de sécurité réel, c'est juste reporte le problème jusqu'à ce que les développeurs se sentent suffisamment en confiance avec leur code.
Je voudrais configurer des tâches distinctes pour chaque branche. J'ai fait cela avant et il n'est pas difficile à gérer et à configurer si vous avez configuré Hudson/Jenkins correctement. Un moyen rapide de créer des emplois multiples est de copier à partir d'un travail existant qui a les mêmes exigences et les modifier au besoin. Je ne suis pas sûr si vous voulez permettre à chaque développeur de créer son propre emploi pour leurs propres branches, mais il n'est pas beaucoup de travail pour une personne (c'est à dire un build manager) pour gérer. Une fois que la coutume des branches ont été fusionnées dans la stable les branches, les emplois correspondants peuvent être enlevés lorsqu'ils ne sont plus nécessaires.
Si vous êtes inquiet au sujet de la charge sur le serveur CI, vous pourriez mettre en place des instances distinctes de l'IC ou même séparer les esclaves pour aider à équilibrer la charge sur plusieurs serveurs. Assurez-vous que le serveur vous sont en cours d'exécution Hudson/Jenkins est adéquate. J'ai utilisé Apache Tomcat et juste eu à s'assurer qu'il a suffisamment de mémoire et de puissance de traitement pour traiter l'accumulation de la file d'attente.
Il est important d'être clair sur ce que vous voulez réaliser à l'aide de l'IC, et puis trouver un moyen de la mettre en œuvre sans trop d'effort manuel ou de duplication. Il n'y a rien de mal avec l'aide d'autres outils externes ou des scripts qui sont exécutés par votre serveur CI qui contribuent à simplifier l'ensemble du processus de gestion.
J'ai choisi de dev+stable branches. Et si vous voulez toujours la coutume de branches et de la peur de la charge, alors pourquoi ne pas déplacer ces personnalisées pour le cloud et permettent aux développeurs de gérer eux-mêmes, par exemple http://cloudbees.com/dev.cb
C'est la société où kohsuke nous est maintenant.
Il y a une Éclipse de l'Outillage aussi, donc si vous êtes sur Eclipse, vous l'aurez étroitement intégré au sein de dev env.
Fait ce qui est vraiment problématique, c'est construire l'isolement avec des branches. Dans notre entreprise, nous avons un ensemble de séparer les projets maven tous 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. Un featurebranch peut maintenant se chevauchent d'un projet à l'autre et c'est alors construire l'isolement devient douloureusement. Il existe plusieurs solutions, nous avons essayé:
Comme une question de fait, la dernière solution est la plus prometteuse. Toutes les autres solutions de manque dans l'une ou l'autre manière. Avec le travail-dsl plugin, il est facile pour l'installation d'une nouvelle branche. simplement copier et coller le script groovy, adapter les branches et permettre à la graine de travail de créer de nouveaux emplois. Assurez-vous que les graines de travail supprime nonmanaged emplois. Ensuite, vous pouvez facilement échelle, avec des branches sur différents projets maven.
Mais comme tom l'a dit ci-dessus, il serait plus agréable pour surmonter la nécessité de branches et d'enseigner les développeurs à intégrer proprement, mais c'est un processus plus long et le résultat n'est pas clair avec de nombreux système d'héritage des pièces que vous ne touchez plus.
mes 2 cents