Une expérience difficile à gagner m'a appris que presque tout est dans le contrôle de source. (Mes commentaires ici sont marqués par une décennie et demie de développement pour les systèmes embarqués / de télécommunication sur du matériel propriétaire avec des outils propriétaires, et parfois difficiles à trouver.)
Certaines réponses disent "ne placez pas les fichiers binaires dans le contrôle de source". C'est faux. Lorsque vous travaillez sur un produit avec beaucoup de code tiers et beaucoup de bibliothèques binaires de fournisseurs, vous archivez les bibliothèques binaires . En effet, si vous ne le faites pas, vous devrez procéder à une mise à niveau et vous rencontrerez des problèmes: la version est interrompue car la machine de génération ne dispose pas de la dernière version; quelqu'un donne au nouveau gars les vieux CD à installer; le wiki du projet contient des instructions obsolètes concernant la version à installer; Pire encore, si vous devez travailler en étroite collaboration avec le fournisseur pour résoudre un problème particulier et qu’il vous envoie cinq ensembles de bibliothèques par semaine, vous devez:être capable de suivre quel ensemble de binaires a présenté quel comportement. Le système de contrôle de source est un outil qui résout exactement ce problème.
Certaines réponses disent "ne mettez pas la chaîne d’outils dans le contrôle de source". Je ne dirai pas que c'est faux, mais il est préférable de placer la chaîne d'outils dans le contrôle de source, à moins que vous ne disposiez d'un système de gestion de configuration (CM) extrêmement solide . Encore une fois, considérez le problème de mise à niveau mentionné ci-dessus. Pire encore, j’ai travaillé sur un projet dans lequel quatre types de chaînes d’outils distincts flottaient lorsque j’ai été embauché - tous étant utilisés activement ! L'une des premières choses que j'ai faites (après avoir réussi à faire en sorte que la compilation fonctionne) a été de mettre la chaîne d'outils sous contrôle de code source. (L'idée d'un système CM solide était au-delà de tout espoir.)
Et que se passe-t-il lorsque différents projets nécessitent différentes chaînes d'outils? Exemple: après quelques années, l'un des projets a été mis à niveau par un fournisseur et tous les fichiers Makefiles sont tombés en panne. Il s'avère qu'ils utilisaient une version plus récente de GNU make. Donc nous avons tous mis à jour. Oups, les Makefiles d'un autre projet sont tous tombés en panne. Leçon: validez les deux versions de GNU make et exécutez la version fournie avec votre extraction de projet.
Ou, si vous travaillez dans un endroit où tout le reste est incontrôlable, vous avez des conversations du type "Hé, le nouveau commence aujourd'hui, où est le CD pour le compilateur?" "Dunno, je ne les ai pas vus depuis que Jack a démissionné, il était le gardien des CD." "Euh, n'est-ce pas avant que nous montions du 2e étage?" "Peut-être qu'ils sont dans une boîte ou quelque chose." Et comme les outils ont trois ans, il n’ya aucun espoir de récupérer le vieux CD du vendeur.
Tous vos scripts de construction appartiennent au contrôle de source. Tout! Jusqu'aux variables d'environnement. Votre machine de génération devrait pouvoir exécuter la construction de n’importe lequel de vos projets en exécutant un seul script à la racine du projet. ( ./build
est un standard raisonnable; ./configure; make
presque aussi bon.) Le script doit configurer l'environnement selon les besoins, puis lancer n'importe quel outil permettant de créer le produit (marque, ant, etc.).
Si vous pensez que c'est trop de travail, ce n'est pas. Cela économise en réalité une tonne de travail. Vous validez les fichiers une fois au début, puis à chaque mise à niveau. Aucun loup solitaire ne peut mettre à niveau sa propre machine et valider un paquet de code source qui dépend de la dernière version d'un outil, ce qui en brise la construction pour tout le monde. Lorsque vous engagez de nouveaux développeurs, vous pouvez leur demander de consulter le projet et de l'exécuter ./build
. Lorsque la version 1.8 dispose de nombreux réglages de performances et que vous modifiez le code, les indicateurs de compilateur et les variables d'environnement, vous voulez vous assurer que les nouveaux indicateurs de compilateur ne sont pas appliqués accidentellement aux versions de correctifs de la version 1.7, car ils ont réellement besoin du code. changements qui vont avec ou que vous voyez des conditions de course poilues.
Mieux encore , cela vous épargnera un jour: imaginez que vous expédiez la version 3.0.2 de votre produit un lundi. Hourra, célébrer. Mardi matin, un client VIP appelle la ligne d'assistance, se plaignant de ce bogue urgent et supercritique de la version 2.2.6 que vous avez envoyé il y a 18 mois . Et vous devez toujours le prendre en charge contractuellement, et ils refusent toute mise à niveau jusqu'à ce que vous puissiez confirmer avec certitude que le bogue est corrigé dans le nouveau code et qu'ils sont suffisamment volumineux pour vous faire danser. Il y a deux univers parallèles:
Dans l'univers où vous ne disposez ni de bibliothèques, ni d'outils, ni de scripts de génération dans le contrôle de code source, ni de système CM solide comme le roc ... Vous pouvez vérifier la bonne version du code, mais cela donne vous toutes sortes d'erreurs lorsque vous essayez de construire. Voyons, avons-nous mis à jour les outils en mai? Non, c'étaient les bibliothèques. Ok, retournez dans les anciennes bibliothèques - attendez, y a-t-il eu deux mises à jour? Ah oui, ça a l'air un peu mieux. Mais maintenant, cet étrange crash de l'éditeur de liens semble familier. Oh, c'est parce que les anciennes bibliothèques ne fonctionnaient pas avec la nouvelle chaîne d'outils, c'est pourquoi nous avons dû mettre à niveau, n'est-ce pas? (Je vous épargne l'agonie du reste de l'effort. Cela prend deux semaines et personne n'est heureux à la fin, pas vous, ni la direction, ni le client.)
Dans l'univers où tout est dans le contrôle de code source, vérifiez la balise 2.2.6, préparez une version de débogage dans une heure environ, passez un jour ou deux à recréer le "bogue VIP", recherchez la cause, corrigez le problème. la version actuelle et convaincre le client de procéder à la mise à niveau. Stressant, mais pas aussi mauvais que cet autre univers où la racine des cheveux est 3 cm plus haute.
Cela dit, vous pouvez aller trop loin:
- Vous devez avoir un système d’exploitation standard dont vous avez une "copie d’or". Documentez, probablement dans un README qui est en contrôle de code source, afin que les générations futures sachent que la version 2.2.6 et les versions antérieures ne construit sur RHEL 5.3 et 2.3.0 et plus tard seulement construit sur Ubuntu 11.04. S'il est plus facile pour vous de gérer les outils de cette façon, allez-y, assurez-vous simplement qu'il s'agit d'un système fiable.
- La documentation du projet est difficile à maintenir dans un système de contrôle de source. Les documents de projet ont toujours une longueur d'avance sur le code lui-même et il n'est pas rare de travailler sur la documentation de la prochaine version tout en travaillant sur le code de la version actuelle. Surtout si tous vos documents de projet sont des documents binaires que vous ne pouvez pas différencier ou fusionner.
- Si vous avez un système qui contrôle les versions de tout ce qui est utilisé dans la construction, utilisez-le ! Assurez-vous simplement qu'il est facile de synchroniser l'ensemble de l'équipe, de sorte que tout le monde (y compris la machine de compilation) tire du même ensemble d'outils. (Je pense à des systèmes tels que pbuilder de Debian et à une utilisation responsable de virtualenv de python.)