Bon flux de travail pour le développement de logiciels avec scrum et intégration continue

16

J'étudie une approche pour mieux comprendre comment le flux de travail d'intégration continue s'intègre mieux dans une entreprise de développement de logiciels avec la méthode Scrum.

Je pense à quelque chose comme ça:

entrez la description de l'image ici

Serait-ce un bon flux de travail?

Daniel Ribeiro
la source

Réponses:

11

Vous êtes sur la bonne voie, mais j'élargirais un peu votre diagramme:

Une version étendue du flux de travail CI.  C'est assez difficile à expliquer dans une courte balise alt.

Fondamentalement (si votre contrôle de version le permet, c'est-à-dire si vous utilisez hg / git), vous voulez que chaque paire développeur / développeur ait sa propre branche "personnelle", qui contient une seule histoire utilisateur sur laquelle ils travaillent. Une fois la fonctionnalité terminée, ils doivent entrer dans une branche centrale, la branche "Release". À ce stade, vous voulez que le développeur obtienne une nouvelle branche, pour la prochaine chose sur laquelle il doit travailler. La branche de fonction d'origine doit être laissée telle quelle, de sorte que toutes les modifications qui doivent y être apportées peuvent être apportées isolément (ce n'est pas toujours applicable, mais c'est un bon point de départ). Avant qu'un développeur ne revienne travailler sur une ancienne branche de fonctionnalité, vous devez tirer sur la dernière branche de version, pour éviter des problèmes de fusion étranges.

À ce stade, nous avons un candidat de version possible sous la forme de la branche "Release", et nous sommes prêts à exécuter notre processus CI (sur cette branche, vous pouvez évidemment le faire sur chaque branche de développeur, mais c'est assez rare dans les grandes équipes de développement, il encombre le serveur CI). Cela peut être un processus constant (c'est idéalement le cas, le CI doit s'exécuter chaque fois que la branche "Release" est modifiée), ou il peut être nocturne.

À ce stade, vous voudrez exécuter une build et obtenir un artefact de build viable à partir du serveur CI (c'est-à-dire quelque chose que vous pourriez déployer de manière faisable). Vous pouvez ignorer cette étape si vous utilisez un langage dynamique! Une fois que vous êtes construit, vous allez vouloir exécuter vos tests unitaires, car ils sont la base de tous les tests automatisés du système; ils sont susceptibles d'être rapides (ce qui est bien, car tout l'intérêt de CI est de raccourcir la boucle de rétroaction entre le développement et les tests), et il est peu probable qu'ils aient besoin d'un déploiement. S'ils réussissent, vous souhaiterez déployer automatiquement votre application sur un serveur de test (si possible) et exécuter tous les tests d'intégration dont vous disposez. Les tests d'intégration peuvent être des tests d'interface utilisateur automatisés, des tests BDD ou des tests d'intégration standard utilisant un cadre de tests unitaires (c'est-à-dire "unité"

À ce stade, vous devriez avoir une indication assez complète de la viabilité de la construction. La dernière étape que je configurerais normalement avec une branche "Release" consiste à la faire déployer automatiquement la version candidate sur un serveur de test, afin que votre service d'assurance qualité puisse effectuer des tests de fumée manuels (cela se fait souvent tous les soirs au lieu de chaque enregistrement afin de pour éviter de gâcher un cycle de test). Cela donne juste une indication humaine rapide de savoir si la version est vraiment adaptée à une version en direct, car il est assez facile de manquer des choses si votre pack de test est moins complet, et même avec une couverture de test à 100%, il est facile de manquer quelque chose que vous pouvez 't (ne devrait pas) tester automatiquement (comme une image mal alignée ou une faute d'orthographe).

Il s'agit vraiment d'une combinaison d'intégration continue et de déploiement continu, mais étant donné que dans Agile, l'accent est mis sur le codage simplifié et les tests automatisés en tant que processus de première classe, vous souhaitez viser à obtenir une approche aussi complète que possible.

Le processus que j'ai décrit est un scénario idéal, il existe de nombreuses raisons pour lesquelles vous pouvez en abandonner certaines parties (par exemple, les branches de développement ne sont tout simplement pas réalisables dans SVN), mais vous souhaitez viser autant que possible .

En ce qui concerne la façon dont le cycle de sprint Scrum s'inscrit dans cela, idéalement, vous voulez que vos versions se produisent aussi souvent que possible, et ne pas les laisser jusqu'à la fin du sprint, car obtenir un retour rapide pour savoir si une fonctionnalité (et la construction dans son ensemble) ) est viable pour un passage à la production est une technique clé pour raccourcir votre boucle de rétroaction à votre Product Owner.

Ed James
la source
1
Je suis d'accord avec beaucoup de ce que vous dites, mais j'essaierais (personnellement) d'encourager les gens ensemble dans la même branche chaque fois que possible.
William Payne
@WilliamPayne En réalité, si vous utilisez un DVCS, les gens ne sont jamais dans la même branche (à moins qu'ils ne travaillent littéralement sur la même machine), puisque vous "branchez" chaque fois que vous clonez. La "Branche" équivalente à ce que vous auriez dans un VCS standard est la branche de fusion que vous aurez par fonctionnalité (donc les Dev B et Dev C pourraient travailler sur les branches de la Branche C puis s'enregistrer dans la Branche C au fur et à mesure, si ils travaillaient tous les deux sur la fonction C). Les avantages d'avoir plus de branches sont moins de temps passé à résoudre les problèmes de fusion, car la fusion dans HG / Git est presque totalement indolore, mais pas une course push / pull.
Ed James
1
Au risque que cela se transforme en une guerre de flammes, je crois que les problèmes dus aux conflits de fusion sont souvent exagérés (bien que j'admette qu'ils existent). En outre, je pense que le passage aux outils DVCS (bien que justifié par d'autres considérations) ne devrait pas être justifié uniquement sur la base de l'évitement des conflits de fusion - Dans autre chose qu'un effort de développement ouvert / communautaire, ceux-ci sont symptomatiques d'une mauvaise communication et coordination dans l'équipe de développement. Le passage à un DVCS masque uniquement un problème plus profond et plus important avec la communication d'équipe.
William Payne
1
Je crois toujours fermement à la nécessité d'un repo "quotidien" (tronc) auquel les développeurs s'engagent lorsqu'ils travaillent. L'intégration continue de votre travail est ce qu'est l'intégration continue, après tout. Pour moi, le branchement est quelque chose qui se fait en dernier recours - non pas à cause du danger de conflits de fusion, mais parce que les développeurs perdent la trace de ce que fait l'autre, et commencent à travailler en silos. Il s'agit du travail d'équipe, de la communication et des facteurs humains, et non des limites des outils que nous utilisons. Pour effectuer une intégration continue, vous avez besoin d'une communication continue, que la branche ne prend pas en charge.
William Payne
1
@WilliamPayne Je ne vais pas débattre avec vous des avantages relatifs du DVCS et du VCS (du moins pas via les commentaires), il y a des avantages significatifs à utiliser un DVCS si vous obtenez le bon workflow, alors qu'avec un workflow plus traditionnel, un VCS fera un excellent travail (d'après mon expérience). Je vous dirai cependant que depuis le passage à un DVCS, mon équipe a connu des délais de développement beaucoup plus rapides et des déploiements plus robustes. L'enfer de fusion de fin de projet que beaucoup de gens connaissent encore à ce jour a été presque complètement retiré de notre processus de développement.
Ed James
4

Conceptuellement oui. Un diagramme ne capture pas beaucoup de points importants, comme:

  1. tests unitaires
  2. validations incrémentielles
  3. la mise en scène est déployée trop souvent, contrairement à la production.
Jeanne Boyarsky
la source
4

Vous voudrez peut-être dessiner un système plus large pour le diagramme. J'envisagerais d'ajouter les éléments suivants:

Montrez vos entrées au système, qui sont transmises aux développeurs. Appelez-les exigences, corrections de bogues, histoires ou autre. Mais actuellement, votre flux de travail suppose que le spectateur sait comment ces entrées sont insérées.

Affichez les points de contrôle le long du workflow. Qui / quoi décide quand un changement est autorisé dans trunk / main / release-branch / etc ...? Quels arbres à coder / projets sont construits sur le CIS? Existe-t-il un point de contrôle pour voir si la version a été interrompue? Qui passe de CIS à la mise en scène / production?

Les points de contrôle sont liés à l'identification de votre méthodologie de branchement et à son intégration dans ce flux de travail.

Y a-t-il une équipe de test? Quand sont-ils impliqués ou informés? Des tests automatisés sont-ils effectués sur le CIS? Comment les ruptures sont-elles réinjectées dans le système?

Réfléchissez à la façon dont vous mapperiez ce flux de travail à un organigramme traditionnel avec des points de décision et des entrées. Avez-vous capturé tous les points de contact de haut niveau nécessaires pour décrire correctement votre flux de travail?

Votre question initiale tente de faire une comparaison, je pense, mais je ne suis pas certain sur quel (s) aspect (s) vous essayez de comparer. L'intégration continue a des points de décision comme les autres modèles SDLC, mais ils peuvent se trouver à différents points du processus.


la source
2

J'utilise le terme «Automatisation du développement» pour englober toutes les activités automatisées de construction, de génération de documentation, de test, de mesure des performances et de déploiement.

Un "serveur d'automatisation du développement" a donc une mission similaire, mais un peu plus large, qu'un serveur d'intégration continue.

Je préfère utiliser des scripts d'automatisation de développement pilotés par des hooks post-commit qui permettent d'automatiser à la fois les branches privées et le tronc de développement central, sans nécessiter de configuration supplémentaire sur le serveur CI. (Cela empêche l'utilisation de la plupart des interfaces graphiques de serveur CI standard que je connaisse).

Le script post-commit détermine les activités d'automatisation à exécuter en fonction du contenu de la branche elle-même; soit en lisant un fichier de configuration post-commit dans un emplacement fixe dans la branche, soit en détectant un mot particulier (j'utilise / auto /) comme composant du chemin vers la branche dans le référentiel (avec Svn)).

(C'est plus facile à configurer avec Svn qu'avec Hg).

Cette approche permet à l'équipe de développement d'être plus flexible sur la façon dont elle organise son flux de travail, ce qui permet à CI de prendre en charge le développement sur les succursales avec un minimum de frais administratifs (proche de zéro).

William Payne
la source
1

Il y a une bonne série de publications sur l'intégration continue sur asp.net que vous pouvez trouver utiles, elles couvrent un peu de terrain et de workflows qui correspondent à ce à quoi vous ressemblez après avoir fait.

Votre diagramme ne fait pas mention du travail effectué par le serveur CI (tests unitaires, couverture de code et autres mesures, tests d'intégration ou builds nocturnes), mais je suppose que tout est couvert dans l'étape "Serveur d'intégration continue". Je ne sais pas pourquoi la boîte CI repousserait cependant vers le référentiel central? De toute évidence, il doit obtenir le code, mais pourquoi aurait-il besoin de le renvoyer?

Le CI est l'une de ces pratiques recommandées par diverses disciplines, il n'est pas unique à la mêlée (ou XP), mais en fait, je dirais que ses avantages sont disponibles pour tous les flux, même les non-agiles tels que les chutes d'eau (peut-être humides-agiles?) . Pour moi, les principaux avantages sont la boucle de rétroaction serrée, vous savez assez rapidement si le code que vous venez de valider fonctionne avec le reste de la base de code. Si vous travaillez dans des sprints et que vous avez vos stand-ups quotidiens, être en mesure de se référer au statut ou aux mesures des dernières nuits construites sur le serveur CI est certainement un avantage et aide à concentrer les gens. Si votre propriétaire de produit peut voir l'état de la build - un grand moniteur dans une zone partagée montrant l'état de vos projets de build - alors vous avez vraiment resserré cette boucle de rétroaction. Si votre équipe de développement s'engage fréquemment (plus d'une fois par jour et idéalement plus d'une fois par heure), les chances que vous rencontriez un problème d'intégration qui prend beaucoup de temps à résoudre sont réduites, mais si elles le font, il est clair de tous et vous pouvez prendre toutes les mesures dont vous avez besoin, tout le monde s'arrêtant pour faire face à la construction cassée par exemple. Dans la pratique, vous ne toucherez probablement pas à de nombreuses versions échouées qui mettent plus de quelques minutes à déterminer si vous intégrez souvent.

En fonction de vos ressources / réseau, vous pouvez envisager d'ajouter différents serveurs finaux. Nous avons une construction CI qui est déclenchée par une validation du dépôt et en supposant que la construction et la réussite de tous ses tests sont ensuite déployés sur le serveur de développement afin que les développeurs puissent s'assurer qu'il fonctionne correctement (vous pouvez inclure du sélénium ou d'autres tests d'interface utilisateur ici? ). Cependant, toutes les validations ne sont pas une construction stable, donc pour déclencher une génération sur le serveur intermédiaire, nous devons étiqueter la révision (nous utilisons mercurial) que nous voulons construire et déployer, encore une fois, tout est automatisé et déclenché simplement en validant avec un particulier étiquette. Aller en production est un processus manuel; vous pouvez le laisser aussi simple que de forcer une construction, l'astuce est de savoir quelle révision / construction vous souhaitez utiliser, mais si vous deviez étiqueter la révision de manière appropriée, le serveur CI peut extraire la bonne version et faire tout ce qui est nécessaire. Vous pouvez utiliser MS Deploy pour synchroniser les modifications apportées aux serveurs de production, ou pour les empaqueter et placer le zip quelque part prêt pour un administrateur à déployer manuellement ... cela dépend de votre niveau de confort.

En plus de monter une version, vous devez également réfléchir à la façon dont vous pourriez gérer un échec et descendre une version. Espérons que cela ne se produira pas, mais il pourrait y avoir des modifications apportées à vos serveurs qui signifient que ce qui fonctionne sur UAT ne fonctionne pas en production, donc vous publiez votre version approuvée et elle échoue ... vous pouvez toujours adopter l'approche que vous identifiez le bug, ajouter du code, valider, tester, déployer en production pour le corriger ... ou vous pouvez envelopper d'autres tests autour de votre version automatisée de la production et si elle échoue, elle revient automatiquement.

CruiseControl.Net utilise XML pour configurer les versions, TeamCity utilise des assistants.Si vous visez à éviter les spécialistes de votre équipe, la complexité des configurations XML peut être autre chose à garder à l'esprit.

Simon Martin
la source
0

Tout d'abord, une mise en garde: Scrum est une méthodologie assez rigoureuse. J'ai travaillé pour quelques organisations qui ont essayé d'utiliser Scrum, ou des approches de type Scrum, mais aucune d'entre elles n'a vraiment réussi à utiliser l'intégralité de la discipline dans son intégralité. D'après mes expériences, je suis un passionné d'Agile, mais un Scrum (réticent) sceptique.

Si je comprends bien, Scrum et d'autres méthodes Agiles ont deux objectifs principaux:

  • La première consiste à fournir un mécanisme explicite de gestion des risques et de découverte continue des risques.
  • La seconde consiste à fournir un mécanisme structuré pour la communication avec les parties prenantes, la découverte des exigences et la gestion des exigences.

Le premier objectif (gestion des risques) est atteint grâce au développement itératif; faire des erreurs et apprendre des leçons rapidement, permettant à l'équipe de développer la compréhension et la capacité intellectuelle de réduire les risques et de s'orienter vers une solution à risque réduit avec une solution «austère» à faible risque déjà dans le sac.

L'automatisation du développement, y compris l'intégration continue, est le facteur le plus critique du succès de cette approche. La découverte des risques et l'apprentissage des leçons doivent être rapides, sans frottement et sans facteurs sociaux confondants. (Les gens apprennent BEAUCOUP plus rapidement quand c'est une machine qui leur dit qu'ils ont tort plutôt qu'un autre humain - les ego ne font qu'entraver l'apprentissage).

Comme vous pouvez probablement le constater - je suis également un fan du développement piloté par les tests. :-)

Le deuxième objectif a moins à voir avec l'automatisation du développement, mais plutôt avec les facteurs humains. Il est plus difficile à mettre en œuvre car il nécessite l'adhésion de la partie avant de l'entreprise, qui ne verra probablement pas la nécessité de la formalité.

L'automatisation du développement peut jouer un rôle ici, dans la mesure où la documentation générée automatiquement et les rapports d'avancement peuvent être utilisés pour maintenir les parties prenantes en dehors de l'équipe de développement constamment mises à jour avec les progrès, et les radiateurs d'information montrant l'état de la construction et les suites de tests réussies / échouées peuvent être utilisés pour communiquer les progrès sur le développement de fonctionnalités, aidant (espérons-le) à soutenir l'adoption du processus de communication Scrum.

Donc, en résumé:

Le diagramme que vous avez utilisé pour illustrer votre question ne capture qu'une partie du processus. Si vous vouliez étudier l'agile / scrum et l'IC, je dirais qu'il est important de considérer les aspects plus larges des facteurs sociaux et humains du processus.

Je dois finir en frappant le même tambour que je fais toujours. Si vous essayez de mettre en œuvre un processus agile dans un projet réel, le meilleur prédicteur de vos chances de succès est le niveau d'automatisation qui a été déployé; il réduit la friction, augmente la vitesse et ouvre la voie du succès.

William Payne
la source