Il y a 9 ans -
Temps de lecture 7 minutes
Test Driven Infrastructure avec Chef (Episode 1)
Le but de cette série de tutoriels est de montrer pas à pas comment monter un environnement pour faire du Test Driven Infrastructure avec l’outil de provisioning Chef (ex-Opscode Chef) en suivant l’exemple du livre Test-Driven Infrastructure with Chef, 2nd Edition by Stephen Nelson-Smith.
Cet article est destiné aux développeurs débutants ou expérimentés dans la création de cookbooks Chef. Il faut à minima une compréhension des concepts introduits par Chef.
Les outils utilisés dans cette série de tutoriels seront (par ordre d’apparition) :
- Ruby 1.9.x
- Bundler
- VirtualBox
- Vagrant
- Berkshelf
- Test-Kitchen
- Cucumber
- ServerSpec
- ChefSpec
- Foodcritic
- Rubocop
- Guard
- Rake
Mises à jour du 15/07/2014 :
- Réajustement de la description des articles de la série
- Présentation du contenu de l’exemple Wonderstuff du livre de Stephen Nelson-Smith
Composition de cette série de tutoriels
Cette série est structurée comme suit. (Ce plan est un backlog susceptible de changer au fur et à mesure de son implémentation, dans la plus pure tradition agile :) )
Le présent article montre comment : créer un environnement de développement sain pour cookbooks ; installer les outils de bases permettant le test automatisé de cookbooks ; créer un squelette de cookbook prêt à l’emploi.
Un second article montrera comment : écrire et lancer un test d’acceptance avec Cucumber et Test-Kitchen, un test d’intégration avec ServerSpec (et Test-Kitchen), un test unitaire avec ChefSpec.
Un troisième article montrera comment : écrire une recette qui va faire passer tous les tests ; vérifier la bonne formulation de vos recettes avec Foodcritic et de votre code Ruby avec Rubocop lancer automatiquement les séries de tests à chaque changement d’un fichier source à l’aide de Guard.
Un quatrième article montrera comment écrire un RakeFile pour lancer des ensembles de taches automatiquement.
Contenu de l’exemple Wonderstuff du livre de Stephen Nelson-Smith
Nous allons utiliser l’exemple Wonderstuff comme décrit dans le livre de Stephen Nelson-Smith. Celui-ci consiste à créer un serveur web lighttpd qui servira une page simple comprenant le texte « Wonderstuff Design is a boutique graphics design agency. »
Préparer son environnement de développement
Installation d’un environnement sain
Pour installer un environnement sain pour le développement de cookbook, j’ai trouvé l’article suivant très complet : http://misheska.com/blog/2013/12/26/set-up-a-sane-ruby-cookbook-authoring-environment-for-chef/ . Suivez cet article, qui couvre MacOs, Linux et Windows. (dans cette série, nous allons travailler sur MacOs)
L’article présente les points suivants :
- Installation de Xcode Command Line Tools (inclus Git)
- Installation du gestionnaire de package Homebrew
- Installation du compilateur Apple GCC 4.2
- Installation de Chruby et de Ruby-Build via Homebrew
- Compilation de Ruby 1.9.x à partir du source (version utilisée dans cet article : ruby 1.9.3p545 (2014-02-24 revision 45159) [x86_64-darwin13.1.0])
- Installation de Bundler (version utilisée dans cet article : 1.6.2)
Installation de VirtualBox
Installer VirtualBox en téléchargeant l’application sur https://www.virtualbox.org/wiki/Downloads (la version qui a été utilisée pour l’écriture de cet article est la 4.3.10)
Installation de Vagrant
Installer Vagrant en téléchargeant l’application sur http://www.vagrantup.com/downloads.html (la version qui a été utilisée pour l’écriture de cet article est la 1.5.3)
Initialiser le repo Git
Créer le répertoire qui va contenir votre cookbook, et initialisez-y votre repo Git :
[java]$ git init wonderstuff
Initialized empty Git repository in /path/to/your/cookbooks/directory/wonderstuff/.git/
$ cd wonderstuff[/java]
Préparer son environnement de test
Note : nous n’utilisons pas Chef DK, le Chef Development Kit, dans cet article pour deux raisons :
- Il est sorti récemment et nous n’avons pas eu le temps de le tester complètement :)
- Nous préférons aller au travers d’une installation plus manuelle de l’environnement pour :
- pouvoir mieux comprendre comment fonctionne ce dernier
- créer des repos non dépendant d’autres installations sur la machine de développement hôte.
Gestion des dépendances des cookbooks avec Berkshelf
Les dépendances entre les différents cookbooks seront gérés avec Berkshelf (version 3.1.3 à l’écriture de l’article).
Info : Vous pourrez trouver plus d’information sur Berkshelf en suivant l’url http://berkshelf.com/
Ajouter Berkshelf au fichier Gemfile
que vous devez créer dans le répertoire racine. Berkshelf sera alors automatiquement installé par Bundler lors d’un bundle install
. Nous allons utiliser le même processus pour tous les autres gems et outils de ce tutoriel. Nous ne lancerons bundle install
que lorsqu’un nombre suffisant de gem seront déclaré à chaque étape.
[java]source ‘https://rubygems.org’
gem ‘berkshelf’, ‘3.1.3’[/java]
Note : Dans les articles de cette série, nous allons prendre des versions exactes pour chaque Rubygem utilisés afin de que le code présenté puisse reproduire exactement le comportement attendu lorsque vous le mettrez en pratique. Ainsi, par exemple, nous utilisons la version spécifique 3.1.3
pour berkshelf
:
gem 'berkshelf', '3.1.3'
Vous pouvez décider de prendre des versions plus récentes de ces Rubygems, qui suivent normalement le versionnement sémantique, notamment :
- des mises à jour de correction d’anomalies (incrément sur le troisième chiffre, c’est à dire 0.0.X), en utilisant dans cet exemple :
gem 'berkshelf', '~> 3.1.3'
- des mises à jour mineures ajoutant des fonctionnalités mais avec rétro-compatibilité (incrément sur le deuxième chiffre, c’est à dire 0.X.0) en utilisant dans cet exemple :
gem 'berkshelf', '~> 3.1'
Une fois que nous aurons réussi à faire fonctionner tous les exemples de cette série d’articles, la seconde option sera conseillée.
Pour plus d’information sur les Gemfiles, se reporter sur http://bundler.io/v1.6/gemfile.html.
Environnement de test avec Test-Kitchen
Nous allons utiliser Test-Kitchen (version 1.2.1 à l’écriture de l’article) qui permet de créer automatiquement les VM et lancer les tests automatiquement. Nous utiliserons son plugin kitchen-vagrant
(version 0.15.0 à l’écriture de l’article) qui permettra à Test-Kitchen de piloter le cycle de vie des VM en utilisant Vagrant.
Info : vous pourrez trouver plus d’information sur Test-Kitchen en suivant l’url http://kitchen.ci/. Cette vidéo de présentation de Test-Kitchen donne pas mal d’information sur les origines de l’outil et ce qu’il fait d’utile.
Ajouter Test-Kitchen au Gemfile
ainsi que son plugin kitchen-vagrant
:
[java]gem ‘test-kitchen’, ‘1.2.1’
gem ‘kitchen-vagrant’, ‘0.15.0’[/java]
Lancement de l’installation des Gems avec Bundler
Il ne reste plus qu’à installer tous les composants avec Bundler :
[java]$ bundle install
Fetching gem metadata from https://rubygems.org/…….
Fetching additional metadata from https://rubygems.org/..
Resolving dependencies…
Using addressable 2.3.6
Using multipart-post 2.0.0
Using faraday 0.9.0
Using berkshelf-api-client 1.2.0
Using buff-extensions 1.0.0
Using hashie 2.1.2
Using varia_model 0.4.0
Using buff-config 1.0.0
Using buff-ruby_engine 0.1.0
Using buff-shell_out 0.1.1
Using hitimes 1.2.1
Installing timers 3.0.1
Using celluloid 0.16.0.pre2
Using nio4r 1.0.0
Using celluloid-io 0.16.0.pre2
Using minitar 0.5.4
Using sawyer 0.5.4
Using octokit 3.2.0
Using retryable 1.3.5
Using buff-ignore 1.1.1
Using erubis 2.7.0
Using json 1.8.1
Using mixlib-log 1.6.0
Using mixlib-authentication 1.3.0
Using net-http-persistent 2.9.4
Using semverse 1.1.0
Using ridley 4.0.0
Using dep-selector-libgecode 1.0.2
Using ffi 1.9.3
Using dep_selector 1.0.3
Using solve 1.2.0
Using thor 0.19.1
Using berkshelf 3.1.3
Using mixlib-shellout 1.4.0
Using net-ssh 2.9.1
Using net-scp 1.2.1
Using safe_yaml 1.0.3
Using test-kitchen 1.2.1
Using kitchen-vagrant 0.15.0
Using bundler 1.6.2
Your bundle is complete!
Use `bundle show [gemname]` to see where a bundled gem is installed.[/java]
Création du squelette de cookbook
Créer le fichier metadata.rb
dans le répertoire racine.
[java]name "wonderstuff"
version "0.1.0" [/java]
Créer le squelette de cookbook avec berks init
(ne pas écraser le Gemfile
que nous venons de créer) :
[java]$ bundle exec berks init
create Berksfile
create Thorfile
create chefignore
create .gitignore
conflict Gemfile
Overwrite /Users/emmanuelsciara/Documents/Development/chef/wonderstuff-article/Gemfile? (enter "h" for help) [Ynaqdh] n # <== do not overwrite the Gemfile
skip Gemfile
create .kitchen.yml
append Thorfile
create test/integration/default
append .gitignore
append .gitignore
create Vagrantfile
Successfully initialized[/java]
Terminer le squelette :
[java]$ mkdir recipes
$ touch recipes/default.rb[/java]
Commiter le squelette et tout le travail fait jusqu’à présent dans Git :
[java]$ git add –all
$ git commit -m ‘first commit with skeleton'[/java]
A suivre…
Voilà, vous avez maintenant :
- un environnement sain et isolé
- les outils de base (Berkshelf et Test-Kitchen) pour travailler avec des cookbooks sur votre machine de développement
- un squelette de cookbook prêt à utiliser.
Dans le prochain article, nous allons écrire avec Cucumber un test d’acceptance (BDD) décrivant – en termes de business – ce qui vous voulez obtenir de ce cookbook.
Commentaire
1 réponses pour " Test Driven Infrastructure avec Chef (Episode 1) "
Published by Benjamin Gandon , Il y a 9 ans
Pour VirtualBox et Vagrant, il est possible d’installer cask pour simplifier leur installation :
$ brew cask install virtualbox
$ brew cask install vagrant