Un moyen efficace d'assurer un «système d'ardoise propre» pour un service d'intégration continue

10

Nous voulons mettre en place un service d'intégration continue (CI) pour notre projet. Ce service CI doit contrôler tous les aspects de la vie du projet, y compris le déploiement.

Autrement dit, nous voulons qu'un agent CI à chaque itération prenne un système propre (en particulier Ubuntu Server), y déploie notre projet et exécute des tests.

Nous écririons probablement nous-mêmes le service CI, à partir de zéro, car notre écosystème est plutôt inhabituel. La question est: comment fournir efficacement un système d'ardoise propre pour chaque itération CI?

Le déploiement du projet installe quelques packages Debian, configure plusieurs sites nginx et installe également certains packages dans un gestionnaire de packages spécifique au langage d'implémentation (LuaRocks), à l'échelle du système. Rien de plus intrusif que ça (je crois). Il est donc plus important de pouvoir mettre en place une table rase rapidement (en moins d'une minute sur du matériel moderne, plus vite - mieux) que d'assurer une isolation et une propreté absolues.

Je vois deux façons de faire ce dont nous avons besoin:

  • Soit mettre en place une prison quelconque (comme lxc, peut-être).
  • Ou installez une machine virtuelle capable de créer des instantanés et utilisez-les.

Mais à ce stade, je n'ai pas suffisamment d'informations pour décider.

Que conseilleriez-vous? D'autres options? Des noms d'outils spécifiques?

Remarque: Le service CI serait exécuté à l'intérieur d'un invité Citrix XenServer. Les solutions payantes sont OK si les prix sont raisonnables. (Habituellement, ils ne sont pas raisonnables dans ce domaine.) Les solutions CI distantes ne sont pas correctes.

Alexander Gladysh
la source

Réponses:

5

Jetez un oeil à Chef / Vagrant . Je ne sais pas si ce sera assez rapide, mais quelque chose à examiner.

Juste au cas où vous n'êtes pas familier avec Chef, il s'agit d'un serveur conçu pour permettre un provisionnement simple basé sur le code des serveurs. Je recommanderais de jeter un œil à l'une des webémissions. Webémission de Django Chef

Vagrant, veewee, chef-solo et couteau-solo, je pense que celui-ci couvre la plupart de ce que vous voulez faire.

Article de blog Vagrant Un article de blog montrant une configuration rapide d'un serveur utilisant Vagrant.

Philip Tinney
la source
Je vous remercie. Souhaitez-vous fournir plus de détails dans votre réponse?
Alexander Gladysh
Je ne l'ai pas utilisé moi-même pour cela, donc tout ce que je peux faire est de poster quelques liens qui, je pense, devraient aider.
Philip Tinney
13

Jetez un oeil à Jenkins . Il a des plugins qui vous permettent d'exécuter des builds sur des machines virtuelles dans VMWare ou VirtualBox ou dans le cloud Amazon / a Eucalyptus . Pour les machines virtuelles exécutées dans le cloud, vous pouvez spécifier un script d'initialisation dans lequel vous pouvez prendre des mesures telles que l'installation de packages.

Lars Kotthoff
la source
Merci, mais Jenkins est un serveur CI et j'aimerais connaître les moyens d'en créer un nous-mêmes.
Alexander Gladysh
2
@AlexanderGladysh Pourquoi voulez-vous réinventer la roue? Les builds Jenkins peuvent tout exécuter, des fichiers de création aux scripts shell simples, en plus d'une interface robuste, d'un excellent support et de nombreux plugins. Même si votre build est très compliqué, il doit s'agir d'un script shell quelque part que jenkins peut exécuter
TheLQ
Même si vous ne voulez pas utiliser Jenkins, je pense que quelque chose basé sur le cloud serait la voie à suivre pour vous. Vous pouvez personnaliser une image de machine pour fournir le logiciel que vous souhaitez et ajouter uniquement la configuration et le code à tester lors du démarrage de l'instance pour réduire le temps de démarrage.
Lars Kotthoff
Quoi qu'il en soit, Jenkins ou pas Jenkins, que faut-il utiliser pour obtenir rapidement des instantanés du système d'exploitation? (S'il vous plaît, arrêtez de mentionner les clouds tiers - cela doit être exécuté sur nos propres serveurs.)
Alexander Gladysh
Vous exécutez un cloud Eucalyptus / OpenStack / ... sur vos propres serveurs?
Lars Kotthoff
2

J'utiliserais l'infrastructure VM et créerais un modèle de base, ou utiliserais le cloud comme l'a suggéré @LarsKotthoff. Il est facile de les faire tourner rapidement et vous pouvez être sûr d'où vous êtes parti.

Cependant, vous aurez finalement besoin de quelque chose en dehors de cette machine virtuelle pour orchestrer ce qui se passe (configurer la machine et lancer le processus que vous souhaitez sur la machine). Je regarderais Jenkins pour sa capacité à capturer la sortie des scripts pour une inspection ultérieure.

Bien que Jenkins ait commencé en tant que serveur CI, de nombreuses organisations avec lesquelles je travaille maintenant l'utilisent beaucoup plus que cela, c'est vraiment un outil pour lancer les choses (manuellement ou planifié) et capturer les résultats, et valider ce qui s'est passé comme prévu. Et c'est très flexible.

tenacioustechie
la source
Merci, mais je voudrais configurer les choses directement à l'intérieur de l'instance Xen VM, pas à l'extérieur - c'est beaucoup plus facile à organiser dans mon cas spécifique. J'examinerai Jenkins, mais je cherche toujours une solution plus étroite.
Alexander Gladysh
Également, veuillez développer en ce qui concerne "utiliser l'infrastructure VM et créer un modèle de base".
Alexander Gladysh
2

Nous voulons mettre en place un service d'intégration continue (CI) pour notre projet. Ce service CI doit contrôler tous les aspects de la vie du projet, y compris le déploiement.

Jenkins a été mentionné par plusieurs. Vous pouvez aller de l'avant avec les scripts, mais Jenkins vous offrira la même flexibilité avec moins de frais généraux pour les rassembler.

Autrement dit, nous voulons qu'un agent CI à chaque itération prenne un système propre (en particulier Ubuntu Server), y déploie notre projet et exécute des tests.

Le déploiement du projet installe quelques packages Debian, configure plusieurs sites nginx et installe également certains packages dans un gestionnaire de packages spécifique au langage d'implémentation (LuaRocks), à l'échelle du système. Rien de plus intrusif que ça (je crois). Il est donc plus important de pouvoir mettre en place une table rase rapidement (en moins d'une minute sur du matériel moderne, plus vite - mieux) que d'assurer une isolation et une propreté absolues.

C'est là que les images de machines virtuelles sont utiles. Vous pouvez configurer votre image propre et demander à chaque machine de lancer une fourchette de cela. L'image d'origine n'est jamais modifiée, mais vos tests ne feront pas la différence. Vous devriez certainement pouvoir exécuter une image bootstrap en une minute.

Les solutions payantes sont OK si les prix sont raisonnables. (Habituellement, ils ne sont pas raisonnables dans ce domaine.) Les solutions CI distantes ne sont pas correctes.

Si vous cherchez à faire fonctionner plusieurs machines à la fois, consultez Nimbula (je suis sans vergogne; je travaille pour eux). Pour les petits déploiements, c'est gratuit et vous permet de rassembler votre propre cloud privé pour les tests ... ou autre chose. Entre Jenkins et un fichier d'orchestration, vous pouvez faire tourner des serveurs hôtes, tester des clients et tout le reste pour exécuter automatiquement le gammut complet du code de test sans aucune interaction.

Jeff Ferland
la source
Pouah. Peut-être que je suis lent aujourd'hui, mais j'ai essayé de fouiller le site de Nimbula, mais je ne vois pas la raison du marketing. Vous souciez-vous de pointer vers un texte sain qui décrit comment faire ce dont j'ai besoin? (C'est-à-dire configurer un modèle de machine invitée et, à partir du script, l'instancier et le tuer pour chaque session CI.)
Alexander Gladysh
@AlexanderGladysh C'est pratique si vous utilisez plusieurs machines pour construire à partir de / beaucoup de travaux CI. Cela ne sert à rien si vous n'avez pas assez de charge de travail pour garantir un cluster d'au moins 3 machines.
Jeff Ferland