web-dev-qa-db-fra.com

À quoi sert une machine de construction dédiée?

En raison d'un certain nombre de circonstances conduisant à un mauvais cycle de build du dernier déploiement, j'ai fait campagne dans notre bureau pour effectuer tous les futurs déploiements avec une machine de build dédiée, et mon patron a accepté cette proposition.

Cependant, au lieu d'avoir une machine réelle dans notre bureau à utiliser, nous devons partager une seule machine avec plusieurs autres groupes - et les tracas d'avoir à quitter mon bureau avec toutes les informations nécessaires, puis descendre un escalier à un autre bureau juste pour effectuer une construction simple me fait me demander pourquoi j'ai jamais proposé cela en premier lieu.

L'idée d'avoir une machine de construction distincte était, à l'origine, de séparer mon propre code écrit localement du code de plusieurs autres développeurs, et de séparer tous les fichiers piratés que j'avais sur ma machine du déploiement. 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 build à moins d'avoir également inclus une autre activité pour laquelle il 'a des dépendances'.

Maintenant que je vais de l'avant avec ce processus, je me demande si j'ai mal compris l'objectif de l'utilisation d'une machine de génération - et puisque nous n'utilisons cette machine que pour le déploiement de code dans nos environnements de test, de transfert et de production, et pas pour nos déploiements de tests de développeurs personnels, je ne suis pas sûr que cela serve à quelque chose que ce soit.

Alors, quelle est la véritable raison d'utiliser une machine de génération, et ai-je même failli l'utiliser correctement?

76
Zibbobz

Normalement, vous n'avez pas seulement une machine de build dédiée, mais vous exécutez également un serveur de build 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 se déployer à partir d'une machine centralisée.

Un serveur de build offre bien plus. Un serveur de build permet le CI (intégration continue), ce qui signifie qu'il s'appuiera automatiquement sur chaque Push vers votre VCS (comme git), pourrait même exécuter des tests unitaires si vous les 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 à plusieurs utilisateurs ou équipes à la fois, en utilisant une interface graphique Web qui s'exécute dans un navigateur.

Dans le monde Java l'un des serveurs de build les plus utilisés est Jenkins. Jenkins fonctionne également parfaitement avec les builds C++ (puisque vous semblez utiliser ces deux langages). Jenkins s'appelle lui-même serveur d'automatisation, car il peut exécuter toutes sortes de tâches qui n'ont pas à être liées à la programmation et à la construction.

136
Traubenfuchs

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

Tout simplement parce que le logiciel s'appuie sur votre machine, cela ne signifie pas qu'il s'appuiera sur celui de quelqu'un d'autre. Vous pouvez vous fier à certains fichiers aléatoires qui se trouvent simplement sur votre machine (et peuvent même ne pas être sous contrôle de version). Vous pouvez compter sur une application ou une bibliothèque oubliée qui est appelée à partir d'un script de construction obscur.

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

107
Simon B

La principale raison d'avoir une machine de build dédiée est d'obtenir des builds cohérents, peu importe qui fait la build. Les postes de travail des développeurs sont rarement (lire: jamais) identiques. Il est difficile de savoir que chaque build utilise les mêmes versions exactes des dépendances et des compilateurs, etc. L'un des pires problèmes avec les builds de poste de travail dev est que les développeurs peuvent construire à partir de code qui n'est pas vérifié dans le contrôle de version.

Il n'est pas clair quelle plateforme/langue (s) vous utilisez, mais vous devriez idéalement avoir un serveur de build qui tire directement du contrôle de source. Autrement dit, lorsqu'une génération est requise, elle récupérera la source d'une version donnée du référentiel et la compilera automatiquement. Cela nécessite l'utilisation d'outils de génération automatisés pour créer un script de génération. Si vous ne l'avez pas, cela devrait être l'étape # 1.

Gardez à l'esprit qu'il n'y a rien de mal à construire localement pour le développement. Vous devriez certainement travailler en exécutant des tests unitaires localement, une analyse de la qualité du code et pour affiner les scripts de construction. Sinon, vous perdrez beaucoup de temps. La sortie du serveur de génération concerne tout ce que vous souhaitez potentiellement passer en production. Toutes les activités d'assurance qualité telles que les tests d'intégration et d'acceptation doivent être effectuées uniquement avec des générations à partir du serveur de génération.

53
JimmyJames

Les autres réponses ont noté à juste titre que vous devez automatiser la construction, ce qui signifie qu'il n'est pas nécessaire de se rendre à pied dans un autre bureau. Cependant, permettez-moi de proposer un certain nombre d'étapes que vous pourriez prendre pour améliorer votre processus de construction:

  • Tout d'abord, configurez l'accès à distance au serveur de build! Si vous construisez manuellement en tapant la commande "make", cela signifie que vous n'avez plus besoin de vous rendre dans un autre bureau pour taper "make", vous pouvez simplement SSH dans le serveur de build et taper "make". Si vous n'utilisez pas encore make ou un système de build similaire, utilisez un tel système de build.
  • 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? Ce serait une étape supplémentaire) et les construit. Je recommande Jenkins. Configurez Jenkins pour exécuter également vos tests unitaires et vos tests d'intégration au niveau du système (vous avez les deux, n'est-ce pas? Créez-les à partir de tests unitaires et de terminer par des tests d'intégration au niveau du système).
  • Troisièmement, si vous trouvez problématique de partager la même machine avec d'autres équipes (par exemple, si vous avez des opinions différentes sur le système d'exploitation, la version et la bittiness à utiliser), envisagez d'utiliser la virtualisation. Aujourd'hui, un bon serveur peut exécuter un grand nombre de machines virtuelles. Vous pourriez peut-être vous installer une machine 32 bits et une machine 64 bits afin que vous sachiez que la construction fonctionne sur les deux architectures.
  • Enfin, cela peut ne pas être nécessaire: si vous devez absolument avoir une machine dédiée, par exemple si les performances de votre application sont d'une grande importance et que d'autres builds/tests s'exécutent en même temps affectent trop vos résultats, installez un serveur matériel dédié vous seul utilisez. Cependant, sur les serveurs récents qui peuvent avoir jusqu'à 40 cœurs de processeur virtuels ou même plus, 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 les versions manuelles. Mon projet actuel utilise maintenant une machine virtuelle, mais en raison de la nécessité de tests de performances d'intégration au niveau du système, nous passons à un serveur dédié avec 40 cœurs de processeur virtuels dont les tests de performances nécessitent 17.

19
juhist

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

Vous dites que c'est une mauvaise chose.

Vous avez maintenant un serveur de build commun à travers lequel tous vos builds - le vôtre et celui des autres équipes - sont construits. Cohérence de construction? Vérifier.

... les tracas d'avoir à quitter mon bureau avec toutes les informations nécessaires et de descendre un escalier vers un autre bureau juste pour effectuer une construction simple me font me demander pourquoi j'ai jamais proposé cela en premier lieu.

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

Vous avez besoin d'un processus serveur auquel vous soumettez/mettez en file d'attente des demandes de génération à effectuer en votre nom et que ce processus vous renvoie le ou les résultats.

16
Phill W.

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

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

1
Graham

Il fournit un emplacement centralisé et neutre pour effectuer des builds, indépendamment de l'IDE, du système d'exploitation et des configurations de bibliothèque de développeurs individuels.

Avec une machine de build dédiée, vous pouvez la faire reconstruire à chaque fois qu'il y a un push de code dans le référentiel. Lorsque quelqu'un rompt 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 plus reproductible et fiable et de garantir que le référentiel ne soit pas plein d'ordures cassées avec des problèmes de dépendance, il facilite 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 est en cours sur la machine de génération.

1
Jim W