J'étudie une approche visant à mieux comprendre comment le flux de travail d'intégration continue s'adapte mieux à une société de développement de logiciels avec la méthode Scrum.
Je pense quelque chose comme ça:
Ce serait-il un bon flux de travail?
Vous êtes une partie de la façon dont il y a, mais j'ouvrirais un peu votre diagramme:
Fondamentalement (si votre contrôle de version le permettra, c'est-à-dire que vous êtes sur HG/GIT), vous souhaitez que chaque Developer/Dev paire ait sa propre branche "personnelle", qui contient une seule histoire utilisée sur laquelle ils travaillent. Lorsqu'ils remplissent la fonctionnalité, ils doivent pousser dans une branche centrale, la branche "Libération". À ce stade, vous voulez que le développement ait une nouvelle branche, pour la prochaine chose à laquelle ils devaient travailler. La branche de fonctionnalité d'origine doit être laissée à l'aide, de sorte que tout changement à apporter peut être effectué de manière isolée (cela n'est pas toujours applicable, mais c'est un bon point de départ). Avant qu'un Dev retourne au travail sur une ancienne branche de fonctionnalité, vous devez tirer dans la dernière branche de version, pour éviter les problèmes de fusion étranges.
À ce stade, nous avons une éventuelle candidate à la libération sous la forme de la branche "Version" et nous sommes prêts à gérer notre processus CI (sur cette branche, vous pouvez évidemment faire cela sur chaque branche de développeur, mais ceci est Assez rare dans des équipes de devises plus grandes sur elle, il clutter le serveur CI). Cela pourrait être un processus constant (c'est-à-dire idéalement le cas, le CI devrait fonctionner chaque fois que la branche "Libération" est modifiée), ou peut être nocturne.
À ce stade, vous voudrez exécuter une construction et obtenir un artefact de construction viable à partir du serveur CI (c'est-à-dire quelque chose que vous pourriez déployer de manière gérée). Vous pouvez ignorer cette étape si vous utilisez une langue dynamique! Une fois que vous êtes construit, vous souhaitez exécuter vos tests unitaires, car ils constituent le fondement de tous les tests automatisés du système; Ils sont susceptibles d'être rapides (ce qui est bon, car l'ensemble du point de CI est de raccourcir la boucle de rétroaction entre le développement et les tests), et il est peu probable qu'il ait besoin d'un déploiement. S'ils passent, vous allez vouloir déployer automatiquement votre application sur un serveur de test (si possible) et exécuter des tests d'intégration que vous avez disponibles. Les tests d'intégration peuvent être des tests d'interface utilisateur automatisée, des tests BDD ou des tests d'intégration standard à l'aide d'un cadre de test d'unités (c'est-à-dire des tests "unités" nécessitant plus d'état).
À ce stade, vous devez avoir une indication relativement complète de savoir si la construction est viable. L'étape finale que je serais normalement configurée avec une branche "Version" consiste à le faire déployer automatiquement le candidat de la version à un serveur de test, de sorte que votre département QA peut faire des tests de fumée manuels (cela se fait souvent tous les soirs au lieu de la vérification. pour éviter de gâcher un cycle de test). Cela donne juste une indication humaine rapide de savoir si la construction convient vraiment à une libération en direct, car il est assez facile de manquer de choses si votre pack de test est inférieur à celui 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 erronée ou une erreur d'orthographe).
Ceci est vraiment une combinaison d'intégration continue et de déploiement continu, mais étant donné que l'accent mis dans Agile est sur le codage maigre et les tests automatisés en tant que processus de première classe, vous souhaitez visez à 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 pourriez abandonner certaines parties de celui-ci (par exemple, les branches de développeurs ne sont tout simplement pas réalisables dans SVN), mais vous voulez viser autant que possible. .
Quant à la manière dont le cycle Scrum Sprint s'adapte à cela, idéalement, vous souhaitez que vos libérations se produisent aussi souvent que possible et ne les laissez pas jusqu'à la fin du sprint, car une fonctionnalité (et construire dans son ensemble ) Est viable pour un déplacement de la production est une technique clé pour raccourcir votre boucle de rétroaction à votre propriétaire de votre produit.
Conceptuellement oui. Un diagramme ne captive pas de nombreux points importants cependant comme:
J'utilise le terme "Automatisation du développement" pour englober toutes les activités automatisées de construction, de documentation, de test, de mesure de la performance et de déploiement.
Un "serveur d'automatisation de développement" a donc une remise similaire, mais quelque peu plus large qu'un serveur d'intégration continue.
Je préfère utiliser des scripts d'automatisation du développement pilotés par des crochets post-validation permettant de automatiser à la fois des branches privées et du réseau de développement central, sans nécessiter de configuration supplémentaire sur le serveur CI. (Cela empêche l'utilisation de la plupart des gites de serveur CI hors tension que je suis au courant).
Le script post-validation détermine les activités d'automatisation à exécuter en fonction du contenu de la succursale elle-même; Soit en lisant un fichier de configuration post-validation dans un emplacement fixe dans la branche ou en détectant un mot particulier (j'utilise/auto /) en tant que composant du chemin d'accès à la branche dans le référentiel (avec SVN)).
(Ceci est plus facile à installer avec SVN que HG).
Cette approche permet à l'équipe de développement d'être plus flexible sur la manière dont elles organisent leur flux de travail, ce qui permet à CI de soutenir le développement sur des succursales avec des frais généraux administratifs minimes (proches de zéro).
Il existe une bonne série de messages sur intégration continue sur ASP.NET que vous pouvez trouver utile, il couvre un peu de terrain et de flux de travail qui correspondent à ce à quoi il ressemble.
Votre diagramme ne mentionne pas le travail effectué par le serveur CI (test unitaire, couverture de code et autres métriques, essais d'intégration ou construction nocturne), mais je suppose que tout est couvert dans le stade "Serveur d'intégration continue". Je ne suis pas clair sur la raison pour laquelle la boîte CI repoussait cependant au référentiel central? De toute évidence, il doit obtenir le code mais pourquoi aurait-il besoin de le renvoyer?
CI est l'une de ces pratiques recommandées par diverses disciplines, ce n'est pas unique à Scrum (ou XP) mais, en fait, je dirais que ses avantages sont disponibles pour tout flux, même le non agile tel que la cascade (peut-être humide?) . Pour moi, les principaux avantages sont la boucle de rétroaction restreinte, vous connaissez assez rapidement si le code que vous venez de vous engager fonctionne avec le reste de la base de code. Si vous travaillez dans Sprints et que vous avez vos habitudes quotidiennes, vous pouvez également faire référence au statut, ou les métriques de la construction de Nuits de la dernière nuit dans le serveur CI sont définitivement un avantage et contribue à la concentration des gens. Si votre propriétaire de produit peut voir l'état de la construction - un grand moniteur dans une zone partagée indiquant l'état de vos projets de construction - alors vous avez vraiment serré cette boucle de retour. Si votre équipe de développement vous engageait fréquemment (plus d'une fois par jour et idéalement plus d'une fois par heure), les chances que vous rencontrez une question d'intégration qui prend beaucoup de temps à résoudre est réduite, mais si elle est claire pour Tout et vous pouvez prendre toutes les mesures dont vous avez besoin, tout le monde s'arrête pour faire face à la construction cassée par exemple. En pratique, vous n'allez probablement pas frapper de nombreuses constructions en panne qui prennent plus de quelques minutes pour déterminer si vous vous intégrez souvent.
En fonction de vos ressources/réseau, vous pouvez envisager d'ajouter différents serveurs d'extrémité. Nous avons une construction CI qui est déclenchée par un engagement pour le repo et en supposant que cela construit et passe tous ses tests, il est déployé sur le serveur de développement afin de pouvoir s'assurer qu'il joue bien (vous pouvez inclure le sélénium ou d'autres tests d'interface utilisateur ici? ). Tous les commentaires ne sont pas une construction stable, afin de déclencher une construction au serveur de stadification, nous devons marquer la révision (nous utilisons mercuriale) que nous voulons être construits et déployés, à nouveau, tout cela est automatisé et déclenché simplement en vous engageant avec un particulier étiqueter. Aller à la production est un processus manuel; Vous pouvez le laisser aussi simple que de forcer une construction. L'astuce consiste à savoir quelle révision/construire vous souhaitez utiliser, mais si vous devez étiqueter la révision de manière appropriée, le serveur CI peut vérifier la version correcte et faire tout ce qui est nécessaire. Vous pouvez utiliser MMP déployé pour synchroniser les modifications apportées au ou les serveurs de production, ou pour l'emballer et mettre le zip quelque part prêt pour un administrateur de déployer manuellement ... Cela dépend de la manière dont vous êtes à l'aise avec cela.
En plus de créer une version, vous devez également déterminer comment vous pouvez faire face à une défaillance et descendre une version. Espérons que cela ne se produira pas, mais il pourrait y avoir des changements apportés à vos serveurs, ce qui signifie que ce qui fonctionne sur UAT ne fonctionne pas sur la production, alors vous libérez votre version approuvée et qui échoue ... vous pouvez toujours prendre l'approche que vous identifiez le BOGUE, Ajoutez du code, COMMIS, TEST, déployez-vous à la production pour le réparer ... ou vous pouvez envelopper des tests supplémentaires autour de votre version automatisée à la production et si elle échoue automatiquement.
Cruisecontrol.net utilise XML pour configurer les bâtiments, 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.
Premièrement, une mise en garde: Scrum est une méthodologie assez rigoureuse. J'ai travaillé pour quelques organisations qui ont essayé d'utiliser des approches Scrum ou de type Scrum, mais qu'aucun d'entre eux ne s'est vraiment rapproché de l'utilisation de la discipline complète dans son intégralité. De mes expériences, je suis un enthousiaste agile, mais un sceptique (réticent).
Si je comprends bien, Scrum & Autres méthodes agiles ont deux objectifs principaux:
Le premier objectif (gestion des risques) est atteint par le développement itératif; Faire des erreurs et des cours d'apprentissage rapidement, permettant à l'équipe de construire la compréhension et de la capacité intellectuelle de réduire les risques et de se déplacer 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 de risque et la leçon d'apprentissage doivent être rapides, sans friction et sans facteurs sociaux confondants. (Les gens apprennent beaucoup plus vite quand il s'agit d'une machine qui leur dit qu'ils sont erronés plutôt que d'un autre humain - Egos uniquement dans la voie de l'apprentissage).
Comme vous pouvez probablement dire - je suis également un fan de développement axé sur les tests. :-)
Le deuxième objectif a moins à voir avec l'automatisation du développement, et plus à faire avec des facteurs humains. Il est plus difficile de mettre en œuvre car il nécessite un buy-in de la fin de l'entreprise, à qui il est peu probable de voir la nécessité de la formalité.
L'automatisation du développement peut avoir un rôle ici, dans la mesure de la documentation et des rapports d'avancement générés automatiquement, peut être utilisée pour maintenir les parties prenantes en dehors de l'équipe de développement continuellement mise à jour avec des progrès et des radiateurs d'informations montrant le statut de construction et le passage/défaillance de suites de test peuvent être utilisés pour communiquer des progrès. Sur le développement des caractéristiques, 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 fait que partie du processus. Si vous vouliez étudier Agile/Scrum et CI, je dirais qu'il est important de prendre en compte les aspects plus larges des facteurs sociaux et humains du processus.
Je dois terminer 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 déployé; Il réduit les frictions, augmente la vitesse et pavé la route du succès.