J'ai été confronté au problème de la mise à l'échelle de l'IC dans mon entreprise et en même temps, j'ai essayé de déterminer quelle approche adopter en ce qui concerne l'IC et les branches multiples. Il y a une question similaire à stackoverflow, plusieurs branches de fonctionnalités et intégration continue . J'en ai commencé un nouveau parce que j'aimerais avoir plus de discussion et fournir une analyse dans 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 ensembles d'emplois (parler de Jenkins / Hudson ici) par branche
- Rédiger des outils pour gérer les travaux supplémentaires
- Créer / modifier / supprimer des jobs en masse
- Paramètres personnalisés pour chaque travail par branche (URL SCM, duplications des dépôts de gestion des dépôts)
- Quelques exemples de personnes s'attaquant à ce problème avec les outils shell, les scripts ant et la CLI Jenkins. 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 automatiquement une tâche Hudson
- Causera plus de charge sur votre cluster CI
- Le cycle de rétroaction pour les développeurs ralentit (si l'infrastructure ne peut pas gérer la nouvelle charge)
- Rédiger des outils pour gérer les travaux supplémentaires
- Plusieurs ensembles de travaux par 2 branches (développement et stabilité)
- Gérez les deux ensembles manuellement (si vous changez la conf d'un job alors assurez-vous de changer dans l'autre branche)
- PITA mais au moins si peu à gérer
- Les autres branches supplémentaires ne recevront pas de suite de tests complète avant d'être poussées vers le développement
- Développeurs insatisfaits. Pourquoi un développeur devrait-il se soucier des problèmes de mise à l'échelle CI? Il a une simple demande, quand je branche je voudrais tester mon code. Facile.
- Gérez les deux ensembles manuellement (si vous changez la conf d'un job alors assurez-vous de changer dans l'autre branche)
Donc, il semble que si je veux fournir aux développeurs des CI pour leurs propres branches personnalisées, j'ai besoin d'outils spéciaux pour Jenkins (API ou shellscripts ou quelque chose?) Et gérer la mise à l'échelle. Ou je peux leur dire de fusionner plus souvent avec DEV et de vivre sans CI sur des branches personnalisées. Laquelle choisiriez-vous ou y a-t-il d'autres options?
la source
Je mettrais en place des emplois distincts pour chaque branche. Je l'ai déjà fait et ce n'est pas difficile à gérer et à configurer si vous avez correctement configuré Hudson / Jenkins. Un moyen rapide de créer plusieurs travaux consiste à copier à partir d'un travail existant qui a des exigences similaires et à les modifier si nécessaire. Je ne sais pas si vous voulez permettre à chaque développeur de configurer ses propres travaux pour ses propres branches, mais ce n'est pas beaucoup de travail pour une seule personne (c'est-à-dire un gestionnaire de build) à gérer. Une fois que les branches personnalisées ont été fusionnées en branches stables, les travaux correspondants peuvent être supprimés lorsqu'ils ne sont plus nécessaires.
Si vous vous inquiétez 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 exécutez Hudson / Jenkins est adéquat. J'ai utilisé Apache Tomcat et je devais simplement m'assurer qu'il disposait de suffisamment de mémoire et de puissance de traitement pour traiter la file d'attente de construction.
Il est important d'être clair sur ce que vous voulez réaliser en utilisant CI, puis de trouver un moyen de l'implémenter sans trop d'efforts manuels ni de duplication. Il n'y a rien de mal à utiliser d'autres outils ou scripts externes exécutés par votre serveur CI qui aident à simplifier votre processus global de gestion de build.
la source
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 les déplacer vers le cloud et laisser les développeurs les gérer eux-mêmes, par exemple http://cloudbees.com/dev.cb C'est la société où se trouve actuellement Kohsuke . Il existe également un outil Eclipse, donc si vous êtes sur Eclipse, vous l'aurez étroitement intégré directement dans l'environnement de développement.
la source
En fait, ce qui est vraiment problématique, c'est de créer une isolation avec des branches de fonctionnalités. Dans notre entreprise, nous avons un ensemble de projets Maven séparés qui font tous partie d'une plus grande distribution. Ces projets sont gérés par différentes équipes, mais pour chaque distribution, tous les projets doivent être publiés. Un featurebranch peut maintenant se chevaucher d'un projet à un autre et c'est à ce moment que l'isolement de la construction devient douloureux. Nous avons essayé plusieurs solutions:
En fait, la dernière solution est la plus prometteuse. Toutes les autres solutions manquent d'une manière ou d'une autre. Avec le plugin job-dsl, il est facile de configurer une nouvelle branche de fonctionnalités. Copiez et collez simplement le script groovy, adaptez les branches et laissez le job d'amorçage créer les nouveaux jobs. Assurez-vous que le travail d'amorçage supprime les travaux non gérés. Ensuite, vous pouvez facilement évoluer avec des branches de fonctionnalités sur différents projets maven.
Mais comme Tom l'a bien dit ci-dessus, il serait plus agréable de surmonter la nécessité des branches de fonctionnalités et d'apprendre aux développeurs à s'intégrer proprement, mais c'est un processus plus long et le résultat n'est pas clair avec de nombreuses parties du système héritées que vous ne toucherez plus.
mes 2 cents
la source