« Less - Intégration continue » : différence entre les versions

De Wiki Agile
Aucun résumé des modifications
 
(28 versions intermédiaires par le même utilisateur non affichées)
Ligne 1 : Ligne 1 :
[[Category: Nicolas Mereaux]]
[[Category: Portail LeSS]]
[[Category: Portail LeSS]]
[[Category: Portail Equipe de développement]]
[[Category: Portail Equipe de développement]]
[[Catégorie:Tests]]
[[Catégorie:TDD]]
Auteur : The LeSS Company B.V.<br/>
Auteur : The LeSS Company B.V.<br/>
Source : [http://less.works/less/technical-excellence/continuous-integration.html Continuous Integration - Large Scale Scrum (LeSS)]<br/>
Source : [http://less.works/less/technical-excellence/continuous-integration.html Continuous Integration - Large Scale Scrum (LeSS)]<br/>
Ligne 63 : Ligne 66 :
'''''Note'' : L'intégration continue et le développement itératif et incrémental dans Scrum ont la même stratégie. Toutefois, l'intégration continue est sur une maille plus fine qu'une itération Scrum. Les deux permettent de réduire la variabilité, et le risque en travaillant par petits lots -- itérativement.'''
'''''Note'' : L'intégration continue et le développement itératif et incrémental dans Scrum ont la même stratégie. Toutefois, l'intégration continue est sur une maille plus fine qu'une itération Scrum. Les deux permettent de réduire la variabilité, et le risque en travaillant par petits lots -- itérativement.'''


[[File:Xcontinuous-integration-chicken.png|border|270px|left|un poulet en plastique]] James Shore, développeur agile et auteur de ''The Art of Agile Development'' [SW07] insiste sur le fait qu’il s’agit d’une pratique de développeur. Dans un très bon article intitulé ''Continuous Integration on a Dollar a Day'' [Shore06], James Shore explique comment faire de l’intégration continue avec un vieil ordinateur, un poulet en plastique, une clochette et un automate de compilation. La vieille machine de développement est utilisée comme machine d’intégration. Le poulet en plastique est le ''témoin d’intégration'' — seule la personne ayant le poulet en plastique peut intégrer son code. La clochette annonce une intégration réussie. Mais l’étape la plus importante dans cette description de l’intégration continue consiste à réunir tous les développeurs dans une seule pièce et de les faire se mettre d’accord pour “qu’à partir de maintenant, notre code qui est en gestion de configuration compilera toujours avec succès et passera les tests”.
[[File:Xcontinuous-integration-chicken.png|border|270px|left|un poulet en plastique|link=]] James Shore, développeur agile et auteur de ''The Art of Agile Development'' [SW07] insiste sur le fait qu’il s’agit d’une pratique de développeur. Dans un très bon article intitulé ''Continuous Integration on a Dollar a Day'' [Shore06], James Shore explique comment faire de l’intégration continue avec un vieil ordinateur, un poulet en plastique, une clochette et un automate de compilation. La vieille machine de développement est utilisée comme machine d’intégration. Le poulet en plastique est le ''témoin d’intégration'' — seule la personne ayant le poulet en plastique peut intégrer son code. La clochette annonce une intégration réussie. Mais l’étape la plus importante dans cette description de l’intégration continue consiste à réunir tous les développeurs dans une seule pièce et de les faire se mettre d’accord pour “qu’à partir de maintenant, notre code qui est en gestion de configuration compilera toujours avec succès et passera les tests”.


Le poulet en plastique ne peut passer à grande échelle sur de gros produits. Ceci dit, cette histoire permet très clairement de se rappeler que l’intégration continue ''est une pratique de développeur''.
Le poulet en plastique ne peut passer à grande échelle sur de gros produits. Ceci dit, cette histoire permet très clairement de se rappeler que l’intégration continue ''est une pratique de développeur''.
Ligne 87 : Ligne 90 :
''Construire'' un système implique construire les composants séparément et, lorsqu’ils sont finis, de les assembler ensemble. Faire ''grandir'' un système implique de le nourrir et le faire évoluer en un plus grand système (voir grandir versus construire).
''Construire'' un système implique construire les composants séparément et, lorsqu’ils sont finis, de les assembler ensemble. Faire ''grandir'' un système implique de le nourrir et le faire évoluer en un plus grand système (voir grandir versus construire).


[[Fichier:Xcontinuous-integration-grow-versus-bolt-fr.png|border|centré|Grandir vs construire]]
[[Fichier:Xcontinuous-integration-grow-versus-bolt-fr.png|border|centré|Grandir vs construire|link=]]


Est-ce possible avec de gros systèmes ayant du code déjà existant ? Cette question nous est posée fréquemment. Dans presque tous les cas, la réponse est oui. Si vos développeurs ou vos architectes ne peuvent pas le faire ou clament que c’est impossible, vous pouvez interprétez cela comme un signe d’un manque de compétence.
Est-ce possible avec de gros systèmes ayant du code déjà existant ? Cette question nous est posée fréquemment. Dans presque tous les cas, la réponse est oui. Si vos développeurs ou vos architectes ne peuvent pas le faire ou clament que c’est impossible, vous pouvez interprétez cela comme un signe d’un manque de compétence.
Ligne 127 : Ligne 130 :
Les gens font des erreurs. C’est normal. Un filet de sécurité lean du type arrêtez-les-machines est nécessaire pour les détecter au plus tôt. Les développeurs corrigent une anomalie avant qu’elles n’affectent les autres. Ce filet de sécurité, un système de type ''andon'', dans la terminologie Toyota, est un système d’intégration continue.
Les gens font des erreurs. C’est normal. Un filet de sécurité lean du type arrêtez-les-machines est nécessaire pour les détecter au plus tôt. Les développeurs corrigent une anomalie avant qu’elles n’affectent les autres. Ce filet de sécurité, un système de type ''andon'', dans la terminologie Toyota, est un système d’intégration continue.


[[Fichier:Xcontinuous-integration-system-fr.png|cadre|centré|Système d'intégration continue]]
[[Fichier:Xcontinuous-integration-system-fr.png|cadre|centré|Système d'intégration continue|link=]]


Un système d’intégration continue (Voir système d’intégration continue) est à l’écoute d’un système de gestion de configuration logicielle. Lorsqu’un développeur y enregistre son code, le système d'intégration continue prend tout le code, le compile, exécute quelques tests, l’installe, et exécute quelques tests supplémentaires. Tout cela se déroule vite ; l'Extreme Programming recommande que cela se déroule en moins de dix minutes. Si un développeur casse la compilation, le système d’intégration continue fera une requête au système de gestion de configuration logicielle et trouvera qui a fait le changement. Il lui enverra un courriel disant : “Tu as cassé la compilation, répare-la !”. Corriger la compilation cassée devient la priorité numéro une parce que cela impacte tout le monde.
Un système d’intégration continue (Voir système d’intégration continue) est à l’écoute d’un système de gestion de configuration logicielle. Lorsqu’un développeur y enregistre son code, le système d'intégration continue prend tout le code, le compile, exécute quelques tests, l’installe, et exécute quelques tests supplémentaires. Tout cela se déroule vite ; l'Extreme Programming recommande que cela se déroule en moins de dix minutes. Si un développeur casse la compilation, le système d’intégration continue fera une requête au système de gestion de configuration logicielle et trouvera qui a fait le changement. Il lui enverra un courriel disant : “Tu as cassé la compilation, répare-la !”. Corriger la compilation cassée devient la priorité numéro une parce que cela impacte tout le monde.
Ligne 145 : Ligne 148 :
Les obstacles pour étendre un système d’intégration continue sont liés à l’augmentation du nombre de personnes, de la quantité de code et de tests produits. Premièrement, la probabilité de casser la compilation s’accroît avec le nombre de personnes enregistrant du code. Deuxièmement, une augmentation de la taille du code conduit à un ralentissement de la compilation et de la boucle de retours d’informations du système d’intégration continue. Ces différents éléments peuvent mener à un échec en continu de la compilation (Voir les dynamiques des compilations cassées).
Les obstacles pour étendre un système d’intégration continue sont liés à l’augmentation du nombre de personnes, de la quantité de code et de tests produits. Premièrement, la probabilité de casser la compilation s’accroît avec le nombre de personnes enregistrant du code. Deuxièmement, une augmentation de la taille du code conduit à un ralentissement de la compilation et de la boucle de retours d’informations du système d’intégration continue. Ces différents éléments peuvent mener à un échec en continu de la compilation (Voir les dynamiques des compilations cassées).


[[Fichier:Xcontinuous-integration-causal-loop-ci-number-of-people-fr.png|cadre|centré|Boucle causale]]
[[Fichier:Xcontinuous-integration-causal-loop-ci-number-of-people-fr.png|cadre|centré|Boucle causale|link=]]


Les solutions sont simples :
Les solutions sont simples :
Ligne 162 : Ligne 165 :
* refactorer les tests
* refactorer les tests


'''Ajouter du matériel''' - la manière la plus facile d’accélérer la compilation est d’acheter davantage de matériel. Ajouter deux ou trois ordinateurs de plus, davantage de mémoire, ou une connection réseau plus rapide, devrait permettre de résoudre le problème. Mettre à jour le matériel existant demande un investissement en argent et un minimum d’effort, ce qui en fait le meilleur choix et le plus facile. Un produit télécom a pu être compilé avec un gain en terme de vitesse de 50% sur un disque RAM - et cela avec une simple agumentation mémoire.
'''Ajouter du matériel''' - la manière la plus facile d’accélérer la compilation est d’acheter davantage de matériel. Ajouter deux ou trois ordinateurs de plus, davantage de mémoire, ou une connexion réseau plus rapide, devrait permettre de résoudre le problème. Mettre à jour le matériel existant demande un investissement en argent et un minimum d’effort, ce qui en fait le meilleur choix et le plus facile. Un produit télécom a pu être compilé avec un gain en terme de vitesse de 50% sur un disque RAM - et cela avec une simple agumentation mémoire.


'''Paralléliser''' - en relation avec l’ajout de matériel, se trouve la parallélisation et la compilation distribuée. Cela nécessite souvent de revoir la conception les scripts de compilation, de changer les outils, ou même de construire de nouveaux outils. Par conséquent, cela demande plus d’effort qu’ajouter simplement du nouveau matériel. Un gros produit télécom a obtenu un gain de son temps de compilation en distribuant la compilation de chaque composant sur du matériel dédié.
'''Paralléliser''' - en relation avec l’ajout de matériel, se trouve la parallélisation et la compilation distribuée. Cela nécessite souvent de revoir la conception les scripts de compilation, de changer les outils, ou même de construire de nouveaux outils. Par conséquent, cela demande plus d’effort qu’ajouter simplement du nouveau matériel. Un gros produit télécom a obtenu un gain de son temps de compilation en distribuant la compilation de chaque composant sur du matériel dédié.


'''Changer les outils''' - mettre à jour les outils dans leur dernière version ou remplacer un outil lent par un outil rapide permet d’accélérer grandement la compilation. Il nous est arrivé, en changeant simplement de compilateur, de diminuer le temps de compilation de 5O%. Une problématique assez répandue que nous avons pu constater est l’utilisation d’un outil lent, IBM Rational ClearCase pour ne pas le nommer. À chaque fois qu’un groupe produit a changé de ClearCase pour Subversion - très bon système open-source de gestion de configuration logicielle (ou GCL) - ce groupe a … ''premièrement'' accéléré la compilation (nos clients on eu un gain de 25 à 50%) ; ''deuxièmement'', permis d’économiser une somme substantielle avec le coût des licences ; et ''troisièmement'', amélioré la vie des développeurs, notamment dans les groupes avec lesquels nous avons travaillé et pour qui ClearCase était l’outil de développement qu’ils détestaient le plus. Certaines personnes mal informées ont argumenté en disant que Subversion n’est pas adapté pour le développement de gros produits. Mais nous l’avons vu en action dans des groupes produits de 400 personnes répartis à travers le monde. De manière plutôt ironique, les soi-disants fonctionnalités à grande échelle de ClearCase telles que le support multi-sites, ont rendu l’intégration continue impossible car elles forçaient les utilisateurs à avoir une appropriation individuelle du code.
'''Changer les outils''' - mettre à jour les outils dans leur dernière version ou remplacer un outil lent par un outil rapide permet d’accélérer grandement la compilation. Il nous est arrivé, en changeant simplement de compilateur, de diminuer le temps de compilation de 50%. Une problématique assez répandue que nous avons pu constater est l’utilisation d’un outil lent, IBM Rational ClearCase pour ne pas le nommer. À chaque fois qu’un groupe produit a changé de ClearCase pour Subversion - très bon système open-source de gestion de configuration logicielle (ou GCL) - ce groupe a … ''premièrement'' accéléré la compilation (nos clients ont eu un gain de 25 à 50%) ; ''deuxièmement'', permis d’économiser une somme substantielle avec le coût des licences ; et ''troisièmement'', amélioré la vie des développeurs, notamment dans les groupes avec lesquels nous avons travaillé et pour qui ClearCase était l’outil de développement qu’ils détestaient le plus. Certaines personnes mal informées ont argumenté en disant que Subversion n’est pas adapté pour le développement de gros produits. Mais nous l’avons vu en action dans des groupes produits de 400 personnes répartis à travers le monde. De manière plutôt ironique, les soi-disantes fonctionnalités à grande échelle de ClearCase telles que le support multi-sites, ont rendu l’intégration continue impossible car elles forçaient les utilisateurs à avoir une appropriation individuelle du code.


'''Construire incrémentalement''' - vous devez compiler uniquement les composants ayant changé et exécuter les tests associés. Facile en théorie ; difficile en pratique. Les dépendances entre les composants, les changements dans les interfaces ou les binaires incompatbles sont quelques-unes des choses qui font que compiler uniquement ce qui a changé est une proposition qui s’avère difficile. Pour les mêmes raisons, trouver tous les tests associés aux composants ayant changés peut être difficile. Les compilations incrémentales sont rarement fiables à 100%, et pour empêcher la corruption de la compilation incrémentale, c’est une bonne idée de continuer à avoir une compilation quotidienne correcte.
'''Construire incrémentalement''' - vous devez compiler uniquement les composants ayant changé et exécuter les tests associés. Facile en théorie ; difficile en pratique. Les dépendances entre les composants, les changements dans les interfaces ou les binaires incompatibles sont quelques-unes des choses qui font que compiler uniquement ce qui a changé est une proposition qui s’avère difficile. Pour les mêmes raisons, trouver tous les tests associés aux composants ayant changé peut être difficile. Les compilations incrémentales sont rarement fiables à 100%, et pour empêcher la corruption de la compilation incrémentale, c’est une bonne idée de continuer à avoir une compilation quotidienne correcte.


'''Déploiement continu''' - sur de gros produits embarqués, cela prend énormément de temps de déployer ou d’installer un logiciel ; un produit télécom de radio communication sur lequel nous avons travaillé a mis plus d’une heure à se déployer. Ce n’est pas quelque chose d’inhabituel. Les tests vont plus vite lorsque le déploiement est fait de manière incrémentale - car seuls les composants ayant changé sont déployés. Les changements doivent être chargés, ce qui peut être fait en redémarrant le système. Toutefois, démarrer un gros système prend du temps, par conséquent certains systèmes sont mis à jour dynamiquement - une fonctionnalité importante dans les télécoms et dans les autres industries où le temps d’indisponibilité s’avère très cher. Le déploiement incrémental - et tout spécialement la mise à jour dynamique - demande des changements dans le système, mais cela rend cette option difficile.
'''Déploiement continu''' - sur de gros produits embarqués, cela prend énormément de temps de déployer ou d’installer un logiciel ; un produit télécom de radio communication sur lequel nous avons travaillé a mis plus d’une heure à se déployer. Ce n’est pas quelque chose d’inhabituel. Les tests vont plus vite lorsque le déploiement est fait de manière incrémentale - car seuls les composants ayant changé sont déployés. Les changements doivent être chargés, ce qui peut être fait en redémarrant le système. Toutefois, démarrer un gros système prend du temps, par conséquent certains systèmes sont mis à jour dynamiquement - une fonctionnalité importante dans les télécoms et dans les autres industries où le temps d’indisponibilité s’avère très cher. Le déploiement incrémental - et tout spécialement la mise à jour dynamique - demande des changements dans le système, mais cela rend cette option difficile.


'''Gérer les dépendances''' - une cause assez répandue de la lenteur des compilations est la non gestion des dépendances. Exemples : les fichiers d’en-tête peuvent inclure plusieurs autres fichiers d’en-tête, ou bien plusieurs cycles de liens peuvent être nécessaire pour résoudre les dépendances de liens cycliques (type de lien récursifs - NdT). Pour un produit multimédia, nous avons passé plusieurs heures à ré-ordonner les dépendances des liens - divisant ainsi le temps de moitié. Réduire les dépendances permet d’accélèrer la compilation et par effet de bord d’améliorer la structure de votre produit.
'''Gérer les dépendances''' - une cause assez répandue de la lenteur des compilations est la non gestion des dépendances. Exemples : les fichiers d’en-tête peuvent inclure plusieurs autres fichiers d’en-tête, ou bien plusieurs cycles de liens peuvent être nécessaires pour résoudre les dépendances de liens cycliques (type de lien récursifs - NdT). Pour un produit multimédia, nous avons passé plusieurs heures à ré-ordonner les dépendances des liens - divisant ainsi le temps de moitié. Réduire les dépendances permet d’accélérer la compilation et par effet de bord d’améliorer la structure de votre produit.




Ligne 192 : Ligne 195 :
Un système d’intégration continue est comparable à la culture “arrêt de la ligne de production” de Toyota. Lorsqu’une anomalie est détectée, Toyota arrête la ligne de production, et la première priorité est de corriger l’anomalie et sa cause racine. Est-ce qu’un système d’intégration continue en plusieurs étapes est en contradiction avec ce principe lean ? Non. Une attitude arrêt-de-la-ligne-de-production est absolument nécessaire, mais cela ne signifie pas que vous devriez arrêter aveuglément tous les travaux. Même Toyota ne fait pas ça [[http://www.amazon.com/Toyota-Way-Fieldbook-Jeffrey-Liker/dp/0071448934 LM06a]].
Un système d’intégration continue est comparable à la culture “arrêt de la ligne de production” de Toyota. Lorsqu’une anomalie est détectée, Toyota arrête la ligne de production, et la première priorité est de corriger l’anomalie et sa cause racine. Est-ce qu’un système d’intégration continue en plusieurs étapes est en contradiction avec ce principe lean ? Non. Une attitude arrêt-de-la-ligne-de-production est absolument nécessaire, mais cela ne signifie pas que vous devriez arrêter aveuglément tous les travaux. Même Toyota ne fait pas ça [[http://www.amazon.com/Toyota-Way-Fieldbook-Jeffrey-Liker/dp/0071448934 LM06a]].


<blockquote>Toyota a développé un système qui permet aux problèmes d’être identifiés et remontés sans qu’il soit nécessaire d’arrêter la ligne de production. Lorsqu’un problème est identifié et que la corde est tirée, l’alarme résonne et une lumière jaune s’allume. La ligne de production continue jusqu’à la fin de la zone de travail - le point de la “position fixe stop” … la ligne de production s’arrêtera lorsque la position fixe sera atteinte et que l’andon deviendra rouge.
<blockquote>Toyota a développé un système qui permet aux problèmes d’être identifiés et remontés sans qu’il soit nécessaire d’arrêter la ligne de production. Lorsqu’un problème est identifié et que la corde est tirée, l’alarme résonne et une lumière jaune s’allume. La ligne de production continue jusqu’à la fin de la zone de travail - le point de la “position fixe stop” … la ligne de production s’arrêtera lorsque la position fixe sera atteinte et que l’''andon'' deviendra rouge.
</blockquote>
</blockquote>
Un système d’intégration continue à plusieurs étapes fonctionne de la même manière. Vous identifiez le problème au plus tôt et travaillez à sa résolution, mais vous ne voulez pas qu’il affecte tout le monde. Et c’est seulement si le problème s’avère vraiment sérieux que vous allez “arrêter la ligne de production”.
Un système d’intégration continue à plusieurs étapes fonctionne de la même manière. Vous identifiez le problème au plus tôt et travaillez à sa résolution, mais vous ne voulez pas qu’il affecte tout le monde. Et c’est seulement si le problème s’avère vraiment sérieux que vous allez “arrêter la ligne de production”.
Ligne 204 : Ligne 207 :
* au nombre d’étapes
* au nombre d’étapes


'''à ce qui est fait par un développeur''' - les développeurs pratiquant l’intégration continue doivent vérifier leurs changements avant d’enregistrer. Par conséquent, ils doivent être capable de travailler avec un sous-ensemble du système, souvent un composant, et être capable d’exécuter des tests unitaires dessus. Prenez bien cela en considération lorsque vous automatisez votre compilation.
'''À ce qui est fait par un développeur''' - les développeurs pratiquant l’intégration continue doivent vérifier leurs changements avant d’enregistrer. Par conséquent, ils doivent être capables de travailler avec un sous-ensemble du système, souvent un composant, et être capables d’exécuter des tests unitaires dessus. Prenez bien cela en considération lorsque vous automatisez votre compilation.


'''à mettre l’accent sur le composant ou la fonctionnalité''' - un système d’intégration continue à plusieurs étapes traditionnel est structuré autour des composants. Les compilations de bas niveau compilent un composant, le niveau suivant un sous-système, et le plus haut niveau compile l’ensemble du produit. Avec des équipes organisées autour des composants, l’équipe est donc aux petits soins pour son système d’intégration continue [AKB04 (originally at: http://www.cmcrossroads.com/articles/agilemar04.pdf)]; Mais où mettre les tests d’acceptation de haut niveau, et qu’en est-il des équipes feature ? Une alternative est de structurer votre système d’intégration continue autour des fonctionnalités. Lorsque quelqu’un enregistre son code, tous les systèmes d’intégration continue associés aux fonctionnalités se déclencheraient. Les tests sont maintenant exécutés en parallèle, mais le même composant est compilé plusieurs fois.
'''À mettre l’accent sur le composant ou la fonctionnalité''' - un système traditionnel d’intégration continue à plusieurs étapes est structuré autour des composants. Les compilations de bas niveau compilent un composant, le niveau suivant un sous-système, et le plus haut niveau compile l’ensemble du produit. Avec des équipes organisées autour des composants, l’équipe est donc aux petits soins pour son système d’intégration continue [AKB04 (originally at: http://www.cmcrossroads.com/articles/agilemar04.pdf)]; Mais où mettre les tests d’acceptation de haut niveau, et qu’en est-il des équipes feature ? Une alternative est de structurer votre système d’intégration continue autour des fonctionnalités. Lorsque quelqu’un enregistre son code, tous les systèmes d’intégration continue associés aux fonctionnalités se déclencheraient. Les tests sont maintenant exécutés en parallèle, mais le même composant est compilé plusieurs fois.


Un groupe produit distribué, avec lequel nous avons travaillé, mélange les deux approches. À bas niveau, le système d’intégration continue est organisé autour des composants, et le résultat déclenche les systèmes d’intégration continue des différentes fonctionnalités qui exécutent les tests d’acceptation de haut niveau en parallèle.
Un groupe produit distribué, avec lequel nous avons travaillé, mélange les deux approches. À bas niveau, le système d’intégration continue est organisé autour des composants, et le résultat déclenche les systèmes d’intégration continue des différentes fonctionnalités qui exécutent les tests d’acceptation de haut niveau en parallèle.


'''à choisir entre promotion automatique ou manuelle''' - laisser le système d’intégration continue à l’écoute de la ligne principale à chaque étape créé de la pagaille. Lorsqu’un développeur fait une erreur, toutes les étapes plantent les unes après les autres. Un système d’intégration continue de haut niveau se déclenche à l’annonce qu’un composant peut être utilisé. Ce type d’annonce s’appelle une ''promotion'' et s’effectue en étiquettant (ou en marquant) le composant. Promouvoir un composant peut se faire de manière automatique ou manuelle [http://damonpoole.blogspot.sg/2007/12/multi-stage-continuous-integration.html Poole08]. Avec une promotion automatique le système d’intégration continue bas niveau promeut un composant juste après l’arrivée de celui-ci. De manière générale, évitez la promotion manuelle où l’équipe décide quand le composant est “assez bon”.
'''À choisir entre promotion automatique ou manuelle''' - laisser le système d’intégration continue à l’écoute de la ligne principale à chaque étape créé de la pagaille. Lorsqu’un développeur fait une erreur, toutes les étapes plantent les unes après les autres. Un système d’intégration continue de haut niveau se déclenche à l’annonce qu’un composant peut être utilisé. Ce type d’annonce s’appelle une ''promotion'' et s’effectue en étiquetant (ou en marquant) le composant. Promouvoir un composant peut se faire de manière automatique ou manuelle [http://damonpoole.blogspot.sg/2007/12/multi-stage-continuous-integration.html Poole08]. Avec une promotion automatique le système d’intégration continue bas niveau promeut un composant juste après l’arrivée de celui-ci. De manière générale, évitez la promotion manuelle où l’équipe décide quand le composant est “assez bon”.


'''à choisir entre déclenchement évènementiel ou temporel''' - chaque système d’intégration continue est déclenché soit par un événement ou à un moment précis. Les systèmes d’intégration continue bas niveau sont toujours déclenchés par un événement - l’enregistrement du code. Pour les systèmes d’intégration continue de haut niveau, le déclencheur est soit la promotion d’un composant ou un moment donné précis. Le déclenchement par promotion est plus rapide, mais pour des compilations qui prennent du temps, cela ne vaut pas le coup de faire des efforts supplémentaires dans des actions de configuration et de maintenance. Une compilation haut niveau quotidienne pourrait s’avérer suffisante [http://www.odd-e.com/material/2008/crosstalk/200805-Vodde.pdf Vodde08]. Par exemple, un groupe produit distribué avec lequel nous avons collaboré, travaille avec des systèmes d’intégration continue bas niveau déclenché par code, un système d’intégration continue plus haut niveau déclenché par promotion, et une compilation quotidienne exécutant les tests qui dure huit heures.
'''À choisir entre déclenchement évènementiel ou temporel''' - chaque système d’intégration continue est déclenché soit par un événement soit à un moment précis. Les systèmes d’intégration continue bas niveau sont toujours déclenchés par un événement - l’enregistrement du code. Pour les systèmes d’intégration continue de haut niveau, le déclencheur est soit la promotion d’un composant soit à un moment donné précis. Le déclenchement par promotion est plus rapide, mais pour des compilations qui prennent du temps, cela ne vaut pas le coup de faire des efforts supplémentaires dans des actions de configuration et de maintenance. Une compilation haut niveau quotidienne pourrait s’avérer suffisante [http://www.odd-e.com/material/2008/crosstalk/200805-Vodde.pdf Vodde08]. Par exemple, un groupe produit distribué avec lequel nous avons collaboré, travaille avec des systèmes d’intégration continue bas niveau déclenché par code, un système d’intégration continue plus haut niveau déclenché par promotion, et une compilation quotidienne exécutant les tests qui durent huit heures.


'''au nombre d’étapes''' - la taille du produit et la présence de code déjà existant déterminent le nombre de niveaux nécessaires pour les systèmes d’intégration continue. Les étapes habituelles sont
'''Au nombre d’étapes''' - la taille du produit et la présence de code déjà existant déterminent le nombre de niveaux nécessaires pour les systèmes d’intégration continue. Les étapes habituelles sont :


* ''l’échelon composant rapide'' - correspond à un système d’intégration continue bas niveau très rapide pour avoir des retours d’informations rapides. Il exécute les tests unitaires, la couverture de code, l’analyse statique et les indicateurs de complexité
* ''l’échelon composant rapide'' - correspond à un système d’intégration continue bas niveau très rapide pour avoir des retours d’informations rapides. Il exécute les tests unitaires, la couverture de code, l’analyse statique et les indicateurs de complexité
Ligne 225 : Ligne 228 :
Jusqu’à présent, nous n’avons pas encore vu l’ensemble des étapes mis en place pour un seul et même produit. La plupart des produits sélectionnent les étapes qui leurs semblent les plus importantes et ajoutent des étapes supplémentaires lorsque c’est nécessaire. Un système d’intégration continue inutilement complexe est du gaspillage.
Jusqu’à présent, nous n’avons pas encore vu l’ensemble des étapes mis en place pour un seul et même produit. La plupart des produits sélectionnent les étapes qui leurs semblent les plus importantes et ajoutent des étapes supplémentaires lorsque c’est nécessaire. Un système d’intégration continue inutilement complexe est du gaspillage.


==== Exemple de système d’intégration continu ====
==== Exemple de système d’intégration continue ====


Le diagramme ci-dessous vous donne un exemple de système d’intégration continue comportant plusieurs étapes. Dans cet exemple, chaque composant a un système d’intégration continue exécutant des tests unitaires, de l’analyse statique ainsi que des indicateurs de couverture de code. Une compilation réussie promeut alors le composant et déclenche ensuite les systèmes d’intégration continue au niveau ''feature'' qui eux-mêmes exécutent des tests de plus haut niveau. Une compilation quotidienne exécute les tests systèmes comme par exemple des tests de performance.
Le diagramme ci-dessous vous donne un exemple de système d’intégration continue comportant plusieurs étapes. Dans cet exemple, chaque composant a un système d’intégration continue exécutant des tests unitaires, de l’analyse statique ainsi que des indicateurs de couverture de code. Une compilation réussie promeut alors le composant et déclenche ensuite les systèmes d’intégration continue au niveau ''feature'' qui eux-mêmes exécutent des tests de plus haut niveau. Une compilation quotidienne exécute les tests systèmes comme par exemple des tests de performance.


[[Fichier:Xcontinuous-integration-scaled-system-example-fr.png|border|centré|Exemple à grande échelle d'intégration continue]]
[[Fichier:Xcontinuous-integration-scaled-system-example-fr.png|border|centré|Exemple à grande échelle d'intégration continue|link=]]


Un système d’intégration continue peut effectivement inclure du management visuel - qui est l’un des principes lean. Lorsque la compilation plante, un signal visuel indique son échec - autrement dit un système ''andon'' (dans la terminologie Toyota). Ce signal n’est pas à l’attention des manageurs pour qu’ils punissent le développeur responsable de l’échec de la compilation ; il est pour les développeurs afin de voir l’état de la compilation. Que vont-ils faire de cette information ? Enquêter sur ce qui se passe ou sur ce qui retarde l’intégration à l’échec de la compilation. Si plus tard, le signal visuel indique que l’échec est toujours présent, des personnes supplémentaires pourront chercher pourquoi cela n’a pas été corrigé.
Un système d’intégration continue peut effectivement inclure du management visuel - qui est l’un des principes lean. Lorsque la compilation plante, un signal visuel indique son échec - autrement dit un système ''andon'' (dans la terminologie Toyota). Ce signal n’est pas à l’attention des manageurs pour qu’ils punissent le développeur responsable de l’échec de la compilation ; il est pour les développeurs afin de voir l’état de la compilation. Que vont-ils faire de cette information ? Enquêter sur ce qui se passe ou sur ce qui retarde l’intégration à l’échec de la compilation. Si plus tard, le signal visuel indique que l’échec est toujours présent, des personnes supplémentaires pourront chercher pourquoi cela n’a pas été corrigé.
Ligne 235 : Ligne 238 :
La lampe à lave est un outil visuel branché aux systèmes d’intégration continue qui est devenu populaire dès l’apparition de premiers systèmes d’intégration continue. Une lampe à lave qui fait des bulles vertes indique une compilation réussie. Et des bulles rouges en cas d’échec.
La lampe à lave est un outil visuel branché aux systèmes d’intégration continue qui est devenu populaire dès l’apparition de premiers systèmes d’intégration continue. Une lampe à lave qui fait des bulles vertes indique une compilation réussie. Et des bulles rouges en cas d’échec.


Après les lampes à lave, les gens ont commencé à brancher toutes sortes d’éléments pour visualiser le résultat de la compilation, comme des guirlandes lumineuses de Nöel, des sirènes, des squelettes animés qui crient lorsque la compilation. Même si cela est moins amusant, un simple moniteur avec une page web présentant un gros cercle de couleur rouge ou vert (un ''écran rouge-vert'') est plus facilement reproductible. Les écrans rouge-vert sont en train de devenir la norme dans les systèmes d’intégration continue à grande échelle. Certaines versions incluent un signal jaune pour indiquer que “la compilation qui était plantée a été corrigée”. Un gros cercle de couleur tout simple - visible de loin - est un élément clé, mais l’affichage peut être enrichi de textes ou de diagrammes chiffrés, tel que la durée de compilation ou le taux de couverture de test. L’information n’a pas à se limiter aux informations de compilation [Rogers08].<br/>
Après les lampes à lave, les gens ont commencé à brancher toutes sortes d’éléments pour visualiser le résultat de la compilation, comme des guirlandes lumineuses de Nöel, des sirènes, des squelettes animés qui crient lorsque la compilation est cassée. Même si cela est moins amusant, un simple moniteur avec une page web présentant un gros cercle de couleur rouge ou vert (un ''écran rouge-vert'') est plus facilement reproductible. Les écrans rouge-vert sont en train de devenir la norme dans les systèmes d’intégration continue à grande échelle. Certaines versions incluent un signal jaune pour indiquer que “la compilation qui était plantée a été corrigée”. Un gros cercle de couleur tout simple - visible de loin - est un élément clé, mais l’affichage peut être enrichi de textes ou de diagrammes chiffrés, tel que la durée de compilation ou le taux de couverture de test. L’information n’a pas à se limiter aux informations de compilation [Rogers08].<br/>
<br/>
<br/>
[[Fichier:Xcontinuous-integration-andon-skeleton.jpg|andon-skeleton.jpg|border]]<br/>
[[Fichier:Xcontinuous-integration-andon-skeleton.jpg|andon-skeleton.jpg|border|link=]]<br/>
<br/>
<br/>
[[Fichier:Xcontinuous-integration-andon-red-green.jpg|andon-red-green.jpg|border]]<br/>
[[Fichier:Xcontinuous-integration-andon-red-green.jpg|andon-red-green.jpg|border|link=]]<br/>
<br/>
<br/>
Voici un petit message d’avertissement de Jeffrey Liker à propos du management visuel [[http://www.amazon.com/Toyota-Culture-Heart-Soul-Way/dp/0071492178 LH08]]:
Voici un petit message d’avertissement de Jeffrey Liker à propos du management visuel [[http://www.amazon.com/Toyota-Culture-Heart-Soul-Way/dp/0071492178 LH08]]:


<blockquote>Ce n’est pas parce qu’il y a représentation visuelle qu’il s’agit de management visuel. Il est relativement facile de mettre en place de belles zones d’affichage qui seront là pour faire jolies. Le véritable défi est de les rendre “utilisables”. Parmi les gens qui visitent le site de Toyota, un certain nombre d’entre eux évoquent la différence entre leur approche et celle de Toyota. Nous entendons régulièrement des commentaires comme “Maintenant je vois, ce qui est affiché par Toyota permet vraiment d’orienter les actions au quotidien”. C’est là en effet toute la différence, et Toyota suggèrerait que si cela ne sert pas à orienter les actions au quotien alors autant s’en débarrasser.
<blockquote>Ce n’est pas parce qu’il y a représentation visuelle qu’il s’agit de management visuel. Il est relativement facile de mettre en place de belles zones d’affichage qui seront là pour faire jolies. Le véritable défi est de les rendre “utilisables”. Parmi les gens qui visitent le site de Toyota, un certain nombre d’entre eux évoquent la différence entre leur approche et celle de Toyota. Nous entendons régulièrement des commentaires comme “Maintenant je vois, ce qui est affiché par Toyota permet vraiment d’orienter les actions au quotidien”. C’est là en effet toute la différence, et Toyota suggèrerait que si cela ne sert pas à orienter les actions au quotidien alors autant s’en débarrasser.
</blockquote>
</blockquote>
Sur les produits de taille importante, il s’avère encore plus difficile de fractionner de gros en petits changements. Les développeurs veulent quelques fois restructurer ou ré-architecturer leur système existant et sont convaincus que cela doit être fait en un seul gros changement. Mais nous n’avons pas encore vu de gros refactoring qui ne pourraient être fait graduellement. À chaque fois, après discussion avec les développeurs, nous avons trouvé des moyens de fractionner ce gros refactoring qui-ne-pouvait-pas-l-être. [http://www.amazon.com/Refactoring-Large-Software-Projects-Restructurings-ebook/dp/B0014ELAZA RL06].
Sur les produits de taille importante, il s’avère encore plus difficile de fractionner de gros changements. Les développeurs veulent quelques fois restructurer ou ré-architecturer leur système existant et sont convaincus que cela doit être fait en un seul gros changement. Mais nous n’avons pas encore vu de gros refactoring qui ne pourraient être fait graduellement. À chaque fois, après discussion avec les développeurs, nous avons trouvé des moyens de fractionner ce gros refactoring qui-ne-pouvait-pas-l-être. [http://www.amazon.com/Refactoring-Large-Software-Projects-Restructurings-ebook/dp/B0014ELAZA RL06].


Les changements d’interface sont un problème assez répandus dans les gros systèmes. Beaucoup de composants utilisent des interfaces et doivent être modifiés en conséquence - ce qui rend impossible de le faire graduellement, c’est bien ça ? Pas tant que ça. En fait, un changement d’interface dans une API (interface de programmation applicative - NdT), est assez répandue et pour laquelle il existe une solution bien connue :
Les changements d’interface sont un problème assez répandus dans les gros systèmes. Beaucoup de composants utilisent des interfaces et doivent être modifiés en conséquence - ce qui rend impossible de le faire graduellement, c’est bien ça ? Pas tant que ça. En fait, un changement d’interface dans une API (interface de programmation applicative - NdT), est assez répandue et pour laquelle il existe une solution bien connue :


Chaque étape peut être faite indépendamment et à différents moments. Pour les APIs publiques, il est impossible de savoir s’il y a encore des utilisateurs pour l’ancienne interface. Il s’avère donc difficile e supprimer l’ancienne interface. Mais la plupart des interfaces concernées ne font pas partie de l’API publique, donc n’oubliez pas de supprimer celles qui sont obsolètes. Nous avons vu plusieurs produits se retrouver avec trois voire quatre interfaces systèmes ou interfaces de journalisation parce que les anciennes n’avaient jamais été supprimées.
Chaque étape peut être faite indépendamment et à différents moments. Pour les APIs publiques, il est impossible de savoir s’il y a encore des utilisateurs pour l’ancienne interface. Il s’avère donc difficile de supprimer l’ancienne interface. Mais la plupart des interfaces concernées ne font pas partie de l’API publique, donc n’oubliez pas de supprimer celles qui sont obsolètes. Nous avons vu plusieurs produits se retrouver avec trois voire quatre interfaces systèmes ou interfaces de journalisation parce que les anciennes n’avaient jamais été supprimées.


=== À faire et à ne pas faire ===
=== À faire et à ne pas faire ===
Ligne 263 : Ligne 266 :
'''À FAIRE - Associez qualité et code pour favoriser une intégration optimiste''' - Comment passer d’une politique pessimiste d’intégrations différées suite à revues de code à une politique optimiste d’intégrations au plus tôt ? Mettez en place une culture autour de l’artisanat logicielle (consultez le manifeste du [http://manifesto.softwarecraftsmanship.org/#/fr-fr Software Craftsmanship] pour en savoir plus - NdT), du développement piloté par les tests et du ''refactoring'' pour du code propre, autour de la programmation en binôme ou en groupe pour faire-de-la-revue-tout-en-codant, et autour des outils de vérification de code automatisée. Et si les revues de code sont toujours souhaitées, faites-les sur un cycle davantage espacé sur des petits lots de code déjà enregistrés.
'''À FAIRE - Associez qualité et code pour favoriser une intégration optimiste''' - Comment passer d’une politique pessimiste d’intégrations différées suite à revues de code à une politique optimiste d’intégrations au plus tôt ? Mettez en place une culture autour de l’artisanat logicielle (consultez le manifeste du [http://manifesto.softwarecraftsmanship.org/#/fr-fr Software Craftsmanship] pour en savoir plus - NdT), du développement piloté par les tests et du ''refactoring'' pour du code propre, autour de la programmation en binôme ou en groupe pour faire-de-la-revue-tout-en-codant, et autour des outils de vérification de code automatisée. Et si les revues de code sont toujours souhaitées, faites-les sur un cycle davantage espacé sur des petits lots de code déjà enregistrés.


'''À NE PAS FAIRE - N’ayez pas une politique du type “Interdiction de planter la compilation” ; et ne faites PAS de reproches et ne faites PAS honte à qui que ce soit en cas de plantage de la compilation''' - si vous faites ce genre de choses, cela engendrera de la peur et les gens vont éviter de faire de l’intégration. Alors une fois de plus, une intégration longtemps différée engendrera de nombreux problèmes qui resteront cachés. À la place …
'''À NE PAS FAIRE - N’ayez pas une politique du type “Interdiction de planter la compilation” ; et ne faites PAS de reproches et ne blâmez PAS qui que ce soit en cas de plantage de la compilation''' - si vous faites ce genre de choses, cela engendrera de la peur et les gens vont éviter de faire de l’intégration. Alors une fois de plus, une intégration longtemps différée engendrera de nombreux problèmes qui resteront cachés.  


'''À FAIRE - Rendez facile le fait d’échouer rapidement, de stopper et de corriger, et d’apprendre des ‘erreurs’''' - créez un système d’intégration continue aussi rapide que l’éclair qui donne de rapides retours d’informations en cas d’échec de la compilation plante. Éliminez les barrières qui empêchent les gens de pratiquer le “stopper et corriger”. Créez un environnement offrant une sécurité personnelle où les gens peuvent admettre les problèmes et apprendre à s’améliorer.
À la place...


'''À FAIRE - “stoppez et corrigez” en cas d’échec de la compilation''' - “Nous sommes trop occupés à gérer les problèmes pour corriger la compilation qui s’est plantée.” Devons-nous vous le répéter en articulant mot par mot ? Ce n’est pas ça.
'''À FAIRE - Rendez facile le fait d’échouer rapidement, de stopper et de corriger, et d’apprendre des ‘erreurs’''' - créez un système d’intégration continue aussi rapide que l’éclair qui donne de rapides retours d’informations en cas d’échec de la compilation. Éliminez les barrières qui empêchent les gens de pratiquer le “stopper et corriger”. Créez un environnement offrant une sécurité personnelle où les gens peuvent admettre les problèmes et apprendre à s’améliorer.
 
'''À FAIRE - “stoppez et corrigez” en cas d’échec de la compilation''' - “Nous sommes trop occupés à gérer les problèmes pour corriger la compilation qui s’est plantée.” Devons-nous vous le répéter en articulant mot par mot ? Ne réfléchissez pas de cette manière.


'''À FAIRE - Utilisez du management visuel pour montrer l’état de la compilation''' - Utilisez de vieux ordinateurs ou des ordinateurs dont personne ne veut et suivez ‘tout ce qu’il se passe’ montrant où en est l’état de la compilation.
'''À FAIRE - Utilisez du management visuel pour montrer l’état de la compilation''' - Utilisez de vieux ordinateurs ou des ordinateurs dont personne ne veut et suivez ‘tout ce qu’il se passe’ montrant où en est l’état de la compilation.