Quel est le but d'une machine de construction dédiée?

75

En raison d'un certain nombre de circonstances ayant conduit à un déploiement médiocre lors du dernier cycle de génération, j'ai fait campagne dans notre bureau pour effectuer tous les déploiements futurs avec une machine de génération dédiée, et mon patron a accepté cette proposition.

Cependant, au lieu d’utiliser une machine réelle dans notre bureau, nous devons partager une machine unique avec plusieurs autres groupes - et le souci compliqué de devoir quitter mon bureau avec toutes les informations nécessaires, puis de descendre un escalier. dans un autre bureau juste pour effectuer une construction simple, je me demande pourquoi j'ai déjà proposé cela auparavant.

L'idée de disposer d'une machine de construction distincte était, à l'origine, de séparer mon propre code écrit localement de celui de plusieurs autres développeurs et de séparer du déploiement tous les fichiers détournés que j'avais sur ma machine. C'était aussi pour résoudre une préoccupation croissante que j'avais avec notre système de gestion de fichiers ClearCase, qui refuse souvent de me laisser déployer certaines activités de construction à moins que j'aie également inclus une autre activité pour laquelle il a des dépendances.

Maintenant que j'avance dans ce processus, je me demande si j'ai mal compris l'objectif de l'utilisation d'une machine de compilation. Etant donné que nous n'utilisons cette machine que pour le déploiement de code dans nos environnements de test, de stockage intermédiaire et de production, et pas pour nos déploiements de tests de développeur personnels, je ne suis pas sûr que cela serve à quelque chose.

Alors, quelle est la raison réelle pour utiliser une machine de compilation, et est-ce que je suis même près de l’utiliser correctement?

Zibbobz
la source
166
"le désagrément de devoir quitter mon bureau avec toutes les informations nécessaires, puis de descendre un escalier menant à un autre bureau simplement pour effectuer une construction simple [...]" Que voulez-vous dire exactement? Vous accédez physiquement à cette machine pour créer une compilation?
Vincent Savard
13
Le vrai WTF est Clearcase, ce qui est pire que toutes les alternatives open source modernes. Quelle est la langue de ce projet et quelle est la taille / complexité de la construction?
pjc50
7
Utilisez-vous des outils? Git / SVN et Jenkins / Team City / Octopus / TFS, etc.? Ou vous connectez-vous simplement à un autre ordinateur, chargez-vous Visual Studio ou qu'avez-vous ... copier un projet, charger, compiler ... Utilisez-vous des outils professionnels ou le faites-vous manuellement?
WernerCD
84
Ma machine de construction est quelque part en Caroline du Sud et je suis à Seattle. Je vous assure que je ne descends aucun escalier pour l'utiliser. Je pense que la dernière fois que j'ai eu un accès physique à une machine de compilation, c'était quand j'étais stagiaire en charge des machines de compilation pour les compilateurs Microsoft en 1994, lorsqu'ils s'inséraient dans un petit placard; ils sont maintenant un centre de données entier quelque part. Obtenez la machine sur votre réseau; Mieux encore, installez-le dans le cloud et faites-le prendre en charge par quelqu'un d'autre.
Eric Lippert

Réponses:

138

Normalement, vous n'avez pas seulement une machine de construction dédiée, mais vous exécutez également un serveur de construction sur cette machine dédiée. Une machine de construction dédiée offre simplement l’avantage de ne jamais bloquer le travail d’un développeur et de la déployer à partir d’une machine centralisée.

Un serveur de compilation offre beaucoup plus. Un serveur de compilation autorise l’intégration continue (CI), ce qui signifie qu’il construira automatiquement chaque poussée sur votre VCS (comme git), pourra même exécuter des tests unitaires si vous en avez et permet un "déploiement en un clic". Les serveurs de build peuvent vous avertir par mail si les builds ou les tests échouent. Ils offrent des données historiques et des tendances sur ce qui s'est passé.

Les serveurs de build sont généralement accessibles simultanément à plusieurs utilisateurs ou équipes, à l’aide d’une interface Web exécutée dans un navigateur.

Dans le monde Java, Jenkins est l’un des serveurs de build les plus utilisés. Jenkins fonctionne parfaitement bien avec les versions C ++ (car vous semblez utiliser ces deux langages). Jenkins s’appelle serveur d’automatisation, car il peut exécuter toutes sortes de tâches qui ne doivent pas nécessairement être liées à la programmation et à la construction.

Traubenfuchs
la source
3
En fait, je n'ai pas touché à c ++ depuis le collège, mais je peux en comprendre l'utilité. Bien que dans ce cas, je pense que ce que nous faisons en réalité pourrait être très éloigné du but recherché.
Zibbobz
21
Pour certaines langues (C ++ en particulier), avoir une boîte dédiée avec plus de puissance de traitement peut aussi être utile, étant donné que la compilation est relativement lente.
Enderland
31
L’intégration continue ne se limite pas à la construction d’un serveur, c’est également que tout le monde intègre les modifications les plus fréquemment le plus souvent possible, afin d’éviter les problèmes de fusion "big bang". Sinon, sur place.
Rob Crawford
Bien que j'aime le pouvoir qu'un exemple donne au point soulevé ici, je pense toujours que le dernier paragraphe est totalement inutile dans cette réponse.
Pierre Arlaud
3
"Une machine de construction dédiée offre simplement l'avantage de ne jamais bloquer le travail d'un développeur et de la déployer à partir d'une machine centralisée." N'est pas totalement vrai. Le demandeur a souligné qu'il était très facile d'avoir un environnement malpropre sur une machine de développement. Les bibliothèques incluses et d'autres variables d'environnement peuvent toutes modifier le résultat de la construction. Une machine dédiée devrait avoir un environnement bien documenté pour permettre une récréation facile de la construction.
TafT
107

En plus de la réponse de Traubenfuchs, vous avez fait allusion à une autre raison pour une machine de construction dans votre question.

Ce n'est pas parce que le logiciel repose sur votre machine que celui de quelqu'un d'autre le sera. Vous pouvez vous fier à certains fichiers aléatoires qui se trouvent sur votre ordinateur (et peuvent même ne pas être sous contrôle de version). Vous pouvez vous appuyer sur une application ou une bibliothèque oubliée appelée à partir d'un script de construction obscur.

Si vous avez une machine de construction dédiée, vous devez savoir ce qui est installé dessus. Cela devrait être bien documenté. S'il est nécessaire de reconstruire le logiciel, des années plus tard peut-être, il ne devrait être nécessaire que de créer une nouvelle machine de construction avec les éléments documentés installés dessus.

Simon B
la source
37
+ 1 Le nombre de fois où quelque chose fonctionne sur la machine d'un développeur, et non le reste de son équipe ...
user2259716
45
Cette. Le but principal de la construction sur une autre machine est d’avoir des constructions reproductibles ; notamment en éliminant les éléments non engagés, les variables d’environnement disparates, etc. de l’équation.
Matthieu M.
9
Étendez-vous à cela: utilisez une nouvelle image de conteneur propre à partir de laquelle vous commencez chaque construction. Ensuite, avoir un script d'amorçage installer le système. Cela garantit vraiment des constructions reproductibles.
Matthias Kuhn
9
@MatthiasKuhn: vraiment (octet par octet) construit reproductible nécessite beaucoup plus, cf: reproducible-builds.org wiki.debian.org/ReproducibleBuilds
ninjalj
1
De plus, le fait que la version Linux du produit génère et passe avec succès des tests sur votre bureau Linux ne signifie pas que la version Windows ou la version Mac se construira.
Solomon Slow
53

La principale raison d'avoir une machine de génération dédiée est d'obtenir des versions cohérentes, quel que soit le créateur. Les postes de travail de développeur sont rarement (lire: jamais) identiques. Il est difficile de savoir que chaque version utilise les mêmes versions exactes de dépendances et de compilateurs, etc. L'un des pires problèmes des versions de dev workstation est que les développeurs peuvent générer à partir de code qui n'est pas archivé dans le contrôle de version.

La plate-forme / le (s) langage (s) que vous utilisez ne sont pas clairs, mais vous devriez idéalement disposer d'un serveur de compilation directement issu du contrôle de source. En d’autres termes, lorsqu’une version est requise, elle récupère le source d’une version donnée du référentiel et le compile automatiquement. Cela nécessite l'utilisation d'outils de génération automatisés pour la génération de scripts. Si vous ne l'avez pas, cela devrait être l'étape n ° 1.

Gardez à l'esprit qu'il n'y a rien de mal à construire localement pour le développement. Vous devez absolument travailler en local sur les tests unitaires, l'analyse de la qualité du code et le perfectionnement des scripts de construction. Sinon, vous perdrez beaucoup de temps. La sortie du serveur de génération concerne tout ce que vous souhaitez potentiellement déplacer en production. Toutes les activités d'assurance qualité telles que les tests d'intégration et d'acceptation ne doivent être effectuées qu'avec des versions du serveur de génération.

JimmyJames
la source
En outre, une résistance supplémentaire au virus.
Joshua
@ Josué Qu'est-ce qui vous donne cette idée?
jpmc26
14
@ jpmc26: la machine de compilation reçoit beaucoup moins de logiciels installés, nécessite moins de points d'accès distants et personne n'ouvre les navigateurs Web à des sites Internet aléatoires.
Josué
19

Les autres réponses notaient assez correctement que vous devriez automatiser la construction, ce qui signifie qu'il n'est pas nécessaire de se rendre à un autre bureau. Cependant, permettez-moi de vous proposer un certain nombre d'étapes pour améliorer votre processus de construction:

  • Premièrement, configurez un accès à distance au serveur de compilation! Si vous construisez manuellement en tapant la commande "make", cela signifie que vous n’êtes plus obligé de vous rendre dans un autre bureau pour taper "make", vous pouvez simplement SSH dans le serveur de compilation et taper "make". Si vous n'utilisez pas encore make ou un système de construction similaire, utilisez-le.
  • Deuxièmement, installez un environnement d'intégration continue qui extrait automatiquement les dernières modifications du système de contrôle de version (vous avez un système de contrôle de version, n'est-ce pas? Sinon, ce serait une étape supplémentaire) et les construit. Je recommande Jenkins. Configurez Jenkins pour qu'il exécute également vos tests unitaires et vos tests d'intégration au niveau système (vous avez les deux, n'est-ce pas? Si non, créez-les en partant des tests unitaires pour aboutir aux tests d'intégration au niveau système).
  • Troisièmement, si vous rencontrez des problèmes pour partager le même ordinateur avec d'autres équipes (par exemple, si vous avez des opinions divergentes sur le système d'exploitation, la version et la compatibilité à utiliser), envisagez d'utiliser la virtualisation. Un bon serveur peut aujourd'hui exécuter un grand nombre de machines virtuelles. Vous pourriez peut-être configurer vous-même une machine 32 bits et une machine 64 bits pour que vous sachiez que la construction fonctionne sur les deux architectures.
  • Enfin, cela peut ne pas être nécessaire: si vous devez absolument disposer d’une machine dédiée, par exemple si les performances de votre application sont d’une grande importance et que d’autres versions / exécutions de tests exécutées simultanément nuisent trop à vos résultats, installez un serveur matériel dédié. seulement vous utilisez. Toutefois, sur des serveurs récents pouvant comporter jusqu'à 40 cœurs de processeur virtuels, voire davantage, il est relativement simple de créer quelques machines virtuelles qui ne partagent pas l'accès aux mêmes cœurs de processeur.

Je considérerais une machine partagée beaucoup mieux que des constructions manuelles. Mon projet actuel utilise maintenant une machine virtuelle, mais en raison du besoin de tests de performance d'intégration au niveau du système, nous passons à un serveur dédié doté de 40 cœurs de processeur virtuels dont les tests de performance nécessitent 17.

juhist
la source
16

... au lieu d'utiliser une machine réelle dans notre bureau, nous devons partager une seule machine avec plusieurs autres groupes ...

Vous dites ça comme si c'était une mauvaise chose.

Vous avez maintenant un serveur de build commun sur lequel toutes vos builds - les vôtres et celles des autres équipes - sont construits. Cohérence de la construction? Vérifier.

[…] le problème de devoir quitter mon bureau avec toutes les informations nécessaires, puis descendre un escalier menant à un autre bureau juste pour effectuer une construction simple, me fait me demander pourquoi je l'ai déjà proposé.

Vous effectuez toujours la construction manuellement et ce n'est pas bon.

Vous avez besoin d'un processus serveur auquel vous soumettez / les demandes de file d'attente pour que des générations soient effectuées en votre nom et ce processus vous renvoie les résultats.

Phill W.
la source
5
"Tu dis ça comme si c'était une mauvaise chose." Ce pourrait être si ils ont le loisir d'installer n'importe quelle ordure qu'ils veulent. S'ils y accèdent ou y accèdent physiquement, je ne vois pas comment cela pourrait être évité.
jpmc26
7
"Vous dites que c'est une mauvaise chose. Vous avez maintenant un serveur de build commun sur lequel tous vos builds - les vôtres et ceux des autres équipes - sont construits. Cohérence de la construction? Vérifiez". C'est tout le contraire d'une construction cohérente! Si une autre équipe décide de mettre à jour son compilateur ou tout autre outil, vous avez soudainement affaire à un environnement de construction complètement différent. C'est à peu près le pire scénario (à part ne pas avoir de machine de construction au départ).
Voo
1
Si vous souhaitez mettre en place un processus automatique pour la création de nouvelles versions, vous souhaitez également virtualiser vos agents de génération pour vous assurer que votre environnement est sous votre propre contrôle. Les machines virtuelles sont un outil extraordinaire pour les développeurs et vous devez en tirer le meilleur parti.
Voo
@Voo C'est loin d'être le pire des cas, c'est un scénario moyen. Le demandeur a actuellement un pire scénario. (Notez également que si vous ne reproduisez jamais de versions, les mises à niveau aléatoires du compilateur ne posent pas trop de problèmes.)
user253751
@immibis Vous avez lu la partie en parens juste après la partie que vous avez citée? Dans le pire des cas, un serveur de génération est impliqué. Le problème avec les bogues non reproductibles est que vous ne pouvez pas vraiment faire de correctif si tout votre environnement de construction a changé entre-temps. Ce n’est pas un gros problème si vous n’avez qu’une seule version publiée gardée près du coffre, mais dans tous les autres cas, c’est plutôt grave.
Voo
1

En plus d’autres réponses pertinentes, il semble que vous exécutiez vos versions directement sur la machine en question.

Pour un système de construction fiable, en particulier lors du partage de la machine de construction avec d'autres utilisateurs, il est normal d'exécuter vos générations au sein d'une machine virtuelle. Cela garantit que les autres utilisateurs ne peuvent pas modifier le comportement de vos générations en installant leurs propres versions d'applications ou de bibliothèques dont dépend votre code. Un grand avantage de cela est que la VM peut facilement être sauvegardée et peut également être facilement clonée sur n'importe quel autre PC (y compris votre propre machine de développement).

Graham
la source
1

Il fournit un emplacement centralisé et neutre pour effectuer des constructions, indépendamment de la configuration de librairie de l'EDI, du système d'exploitation et des systèmes de développeurs individuels.

Avec une machine de construction dédiée, vous pouvez la reconstruire chaque fois qu’un code est envoyé au référentiel. Lorsque quelqu'un casse la construction, le processus peut immédiatement envoyer une alerte afin que le problème puisse être corrigé immédiatement.

En plus de rendre tout ce qui est reproductible et fiable et d’assurer que le référentiel ne soit pas rempli de déchets brouillons avec des problèmes de dépendance cachés, cela simplifie la vie des développeurs, car tout ce qu’ils ont à faire pour que la construction fonctionne sur leur machine est de copier ce que vous voulez. est fait sur la machine de construction.

Jim W
la source
4
cela ne semble rien offrir de substantiel sur les points soulevés et expliqués dans les 6 réponses précédentes
gnat