blog.pagesd.info

Aller au contenu | Aller au menu | Aller à la recherche

jeudi 13 janvier 2011

Rééducation post-Subversion

Vous voulez que je vous dise quelque chose de rigolo ? Presque toutes les équipes qui utilisent Subversion avec lesquelles j’ai discuté m’ont raconté plus ou moins la même histoire. C’est une histoire tellement courante que je devrais l’intituler « La complainte de Subversion ». Cette histoire, je vais vous la conter. Il était une fois une équipe de vaillants programmeurs qui se mirent en tête de séparer la version en production employée par les clients de la version avec laquelle ils travaillaient au jour le jour. Cette équipe créa donc une branche dans Subversion et tout se passa très bien dans le meilleur des mondes possible. Quelque temps après, ils décidèrent que le jour était venu de fusionner ces deux versions. Jour funeste qui vira rapidement au désastre. Cette union qui aurait dûe être expédiée en cinq minutes entraina la malheureuse équipe dans la pire des mésaventures qu’elle ait jamais connue : six chevaliers agglutinés derrière le même ordinateur pendant moults semaines pour quérir chaque correction réalisée sur la version de production et les réappliquer une à une et à la force du clavier sur la version de développement.

Et chacune de ces équipes m’a dit qu’ils jurèrent au grand jamais qu’on ne les y reprendrait plus et ils bannirent les branches. Et depuis, voici comment ils font : chaque nouvelle fonctionnalité est codée à l’intérieur d’un gros bloc #ifdef. Ca leur permet de tous travailler dans le tronc, sans que les clients ne soient impactés par le nouveau code tant qu’il n’est pas débugué. Et franchement, c’est ni fait, ni à faire.

Extrait traduit de HgInit: Subversion Re-education

lundi 13 septembre 2010

Déployer des applications Sinatra sur Heroku

Ceci est la traduction du tutoriel "Deploying Sinatra Apps on Heroku" de Darren Jones.

Vous avez enfin terminé votre super application web, mais ça n'a pas beaucoup d'intérêt si personne en peut s'en servir. Ce qu'il vous faut, c'est lancer votre application à l'assaut d'internet !

Heroku

Heroku est de très loin la façon la plus simple pour déployer des applications Sinatra. Il s'agit d'un excellent service pour tous ceux qui ont besoin d'héberger des applications en Ruby (avec des frameworks tels que Rails, Merb, Rameze et bien entendu Sinatra). L'hébergement est gratuit pour les petits sites de base, y compris la base de données, et s'adapte lorsque votre application devient plus populaire. Heroku s'occupe de tous les trucs compliqués en matière d'hébergement et convient parfaitement pour mettre en production des sites à grande échelle. le tout accompagné d'un excellent support et d'une large documentation.

Avant d'aller plus loin, vous devez avoir installé Git étant donné qu'il est nécessaire pour faire un déploiement sur Heroku.

Inscription

Pour commencer, vous devez créer un compte sur Heroku en vous enregistrant gratuitement à l'adresse http://heroku.com/signup.

Installer le gem Heroku

On part du principe que vous avez déjà installé Ruby, Gems et Sinatra et par conséquent vous n'avez plus qu'à lancer la commande suivante à partir d'une invite de commande :

C:\Ruby>gem install heroku --no-rdoc --no-ri

ce qui donne :

Successfully installed mime-types-1.16
Successfully installed rest-client-1.4.2
Successfully installed rake-0.8.7
Successfully installed configuration-1.1.0
Successfully installed launchy-0.3.7
Successfully installed heroku-1.10.0
6 gems installed

Il s'agit d'une petite application en ligne de commande qui va vous permettre d'interagir avec vos sites hébergés sur Heroku. Vous pouvez consulter sa documentation à l'adresse http://docs.heroku.com/heroku-command.

Envoyer votre clé SSH

Pour pouvoir communiquer avec Heroku, vous devez utiliser une clé SSH. Si vous n'en avez pas encore, vous pouvez en générez une en tapant la commande suivante dans une console Git Bash (et pas une simple invite de commande) :

$ ssh-keygen -t rsa -C "yourname@gmail.com"

Vous trouverez plus d'informations pour générer une clé SSH sur Github (vous devriez d'ailleurs avoir déjà généré votre clé SSH lors de votre inscription à Github).

Une fois que vous disposez d'une clé SSH, vous devez l'enregistrer dans votre compte Heroku, en utilisant la ligne de commande :

C:\Ruby>heroku keys:add 

Ce qui devrait vous renvoyer le message suivant :

Enter your Heroku credentials. 
Email: youremail@gmail.com 
Password: 

Répondez à la question qui vous est posée et vous obtiendrez le message ci-dessous :

Uploading ssh public key C:\Users\nom.utilisateur/.ssh/id_rsa.pub

Ce paramétrage de la clé SSH ne doit être réalisé qu'une seule fois. A partir de maintenant, vous n'aurez plus qu'à effectuer les étapes décrites dans la suite de ce tutoriel à chaque fois que vous souhaiterez mettre en ligne une de vos applications Sinatra.

Le fichier rackup

Pour déployer une application Sinatra, vous avez besoin d'un fichier rackup. Celui-ci doit être créé dans la racine de votre application et doit se nommer "config.ru" pour que le serveur web puisse le retrouver facilement. Pour notre premier essai, nous nous plaçons dans le répertoire de l'application Reverse que nous avons développée et versionnée sous GIT au cours des tutoriels précédents pour y créer un fichier "config.ru" avec le contenu suivant :

require 'main'
run Sinatra::Application

Il faut ensuite penser à ajouter ce fichier au référentiel Git :

$ git commit -a -m "Ajout du fichier rackup pour déployer sur Heroku"

Le manifeste gem

Pour définir les dépendances gems de votre application, il faut également configurer un fichier de manifeste. Il s'agit d'un simple fichier texte nommé ".gems" à placer dans la racine de votre application et dans lequel on enregistre les gems nécessaires à notre application. Dans le cas de l'application Reverse, il suffit donc d'y faire apparaitre une seule ligne, à savoir :

sinatra

Là encore, il ne faut pas oublier d'ajouter ce fichier au référentiel Git :

$ git commit -a -m "Ajout du manifeste gem pour déployer sur Heroku"

Note : dans le cas de l'application SuperDo, le fichier ".gems" devra contenir les 3 lignes suivantes pour que l'application fonctionne correctement une fois déployée :

sinatra
data_mapper
dm-postgres-adapter

Ajouter votre site sur Heroku

La dernière étape consiste à placer votre site sur Heroku. Ouvrez une invite de commande et accédez au répertoire de votre application "Reverse". Vous devez ensuite choisir un nom pour votre application (vous ne pouvez pas utiliser "reverse" parce que Daz l'a déjà pris, ni "reversefr" puisque je l'ai pris !). Pour commencer, il faut créer l'application sur Heroku en entrant la ligne de commande suivante depuis une console Git Bash :

$ heroku create appname

Ce qui donne le résultat ci-dessous :

Creating appname.... done
Created http://appname.heroku.com/ | git@heroku.com:appname.git
Git remote heroku added

Il reste alors à pousser notre application vers Heroku à l'aide de Git en lançant la commande :

$ git push heroku master

Ce qui donne alors quelque chose du style :

Counting objects: 7, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (4/4), 441 bytes, done.
Total 4 (delta 3), reused 0 (delta 0)

-----> Heroku receiving push
-----> Sinatra app detected
       Compiled slug size is 588K
-----> Launching...... done
       http://appname.heroku.com deployed to Heroku

To git@heroku.com:appname.git
   3b3ed7c..350b521  master -> master

Et maintenant, il est enfin possible de naviguer vers l'URL "http://appname.heroku.com/" pour voir votre application prendre son envol sur internet !

Mise à jour du site

Il vous suffit d'une ligne de commande Git pour pouvoir déployer les modifications que vous avez apportées à votre application (à condition de les avoir commitées !). Dans le cas où vous souhaitez déployer la branche master de votre référentiel Git, vous n'avez qu'à taper la commande suivante :

$ git push heroku master

C'est là tout l'intérêt d'utiliser Git pour déployer une application sur Heroku. Grâce à son système de branches, on peut développer sur une branche et utiliser une autre branche pour la version en production.

J'espère que ce billet aura réussi à vous convaincre qu'il est très facile de déployer des applications développées avec Sinatra et que Heroku est un service parfaitement adapté pour cela. A votre tour de mettre votre application en ligne !

mardi 3 août 2010

Guide pour démarrer avec Git

Ceci est la traduction du tutoriel "Git Beginners Guide" de Darren Jones.

Dans ce nouveau tutoriel, Darren présente les bases de Git et aborde les éléments suivants :

  • Qu'est-ce que Git ?
  • Installer et configurer Git
  • Ajouter et Commiter avec Git
  • Les Branches
  • Les Tags
  • Les repositories distants
  • Quelques ressources sur Git

Qu'est-ce que Git ?

Git est un système de contrôle de version qui vous de garder une trace de toutes les modifications que l'on fait quand on travaille sur un projet. Git permet de faire un "roll back" pour revenir sur une version précédente et aussi de créer des "branches" dans votre code pour tester de nouvelles fonctionalités sans toucher à la version en cours et stable de votre code. Un système de contrôle source est essentiel quand vous travaillez en équipe, mais dans le cadre de Sinatra, c'est aussi un outil pour déployer des applications sur le cloud chez Heroku (cela fera l'objet d'un autre billet).

Git utilise la ligne de commande pour son interface utilisateur, mais pour ceux qui préfèrent, il existe aussi de nombreux outils visuels.

Installer et configurer Git

Pour commencer, vous avez besoin d'installer Git.

La VO de ce tutoriel Git Beginners Guide explique comment installer Git pour Linux, Mac et Windows. Par ailleurs, GitHub propose un tutoriel très complet pour installer Git sur Windows et un autre qui explique comment générer les clés SSH pour Git et ajouter votre clé publique à votre compte GitHub.

Une fois l'installation terminée, il faut lancer un "Git Bash" (en faisant un clic-droit sur un répertoire et en choisissant la commande "Git Bash here"). Cela a pour effet d'ouvrir un genre d'invite de commandes pour Git où vous pouvez définir quelques paramètres généraux en utilisant les deux commandes suivantes :

$ git config --global user.name "Votre Nom"
$ git config --global user.email "votremail@example.com"

Note : pour quitter Git Bash, on peut taper la commande exit.

git-1.png

Maintenant, il faut se placer dans le répertoire de notre projet. Pour nos tests, nous allons utiliser le projet Reverse réalisé lors du tutoriel précédent :

$ cd /c/Ruby/projets/reverse

Puis nous initialisons ce répertoire pour que Git assure le suivi des modifications que nous apporterons au contenu de ce répertoire.

$ git init

Nous obtenons en retour le message "Initialized empty Git repository in c:/Ruby/_projets/reverse/.git/". Si on consulte le répertoire C:\Ruby\projets\reverse dans l'explorateur de Windows, on peut constater qu'il contient désormais un sous-répertoire ".git" qui sert va servir à Git pour stocker le repository.

Ajouter et Commiter avec Git

A présent, nous allons ajouter tous les fichiers et les sous-répertoire de notre projet Reverse dans le repository que nous venons de créer. On effectue cela en tapant la commande suivante :

$ git add .

Ceci va ajouter tous les fichiers à l'index, puisque le "." représente tous les fichiers. L'index est un peu comme une zone de transit dans laquelle les fichiers attendent d'être commités dans le repository. Ce que nous allons faire avec cette commande :

$ git commit -m "Version initiale du projet Reverse"

Cela a pour effet de commiter tous les fichiers de l'index dans le repository. Le texte entre guillemets après le "-m" est un message que vous devez définir à chaque commit pour expliquer ce que vous avez fait.

Et maintenant on va apporter quelques modifications à notre projet, comme par exemple de changer légèrement la fin du fichier "layout.erb" pour y ajouter un lien :

<!DOCTYPE html>
<html lang="en">
<head>
<title>Reverse!</title>
<meta charset=utf-8 />
</head>
<body>
<h1>Reverse</h1>
<h2><%= @title %></h2>

<%= yield %>

<p>The first Sinatra project for <a href="http://ididitmyway.heroku.com/">I Did It My Way</a></p>
</body>
</html>

Puis on saisi la commande suivante dans Git Bash pour mettre à jour l'index :

$ git add views/layout.erb

Comme vous pouvez le voir, on peut décider de spécifier quel fichier on veut ajouter à l'index plutôt que d'utiliser "." pour sélectionner tous les fichiers. Et sinon, n'oubliez pas de commiter votre modification :

$ git commit -m "Ajout d'un lien en pied de page"

Le fait d'avoir à ajouter puis à commiter peut sembler un peu fastidieux. Mais cela présente l'avantage de permettre d'ajouter plusieurs modifications avant de réellement faire le commit. Toutefois, on peut ramener ça à une seule étape en utilisant l'option "-a" :

$ git commit -a -m "un message d'explication"

Cela aura pour effet d'ajouter et de commiter les modifications en une seule fois. En fait, tous les fichiers modifiés ou supprimés sont commités. Les nouveaux fichiers ne sont pas concernés.

Si vous souhaitez supprimer des fichiers, vous ne pouvez pas vous contenter de les supprimer directement depuis Windows. Vous devez aussi les supprimer du repository Git en utilisant la commande "rm". Par exemple, nous n'avons plus besoin du fichier "frank.erb" qui doit encore se trouver dans le sous-répertoire "views". Nous pouvons donc le supprimer du repository avec la commande suivante :

$ git rm views/frank.erb

Le fichier "frank.erb" est alors supprimé physiquement du sous-répertoire "views". Il reste encore à commiter pour qu'il soit supprimé définitivement du repository Git :

$ git commit -a -m "Suppression fichier inutile"

Les Branches

En ce qui me concerne, c'est LE truc de Git. Quand vous créez une branche, c'est en gros comme si vous faisiez une copie de votre code en cours. Vous pouvez alors faire plein de modifications ou d'essais sans toucher au code d'origine. Si on veut conserver ces changements, on peut alors les fusionner avec le code d'origine ou si ces changements ne conviennent pas, on peut tout simplement revenir au code de départ et supprimer la branche. Il est possible de créer autant de branches que l'on souhaite et les fusionner entre elles ou les conserver en tant que branches séparées.

Au départ, vous démarrez avec la branche par défaut qui s'appelle "master". Pour savoir sur quelle branche vous vous trouvez actuellement, il suffit de taper :

$ git branch

Et vous devriez alors avoir le résultat suivant :

* master

L'astérisque devant "master" indique qu'il s'agit de la branche en cours.

Pour créer une nouvelle branche qu'on appellera "development", il faut taper :

$ git branch development

Puis pour basculer sur cette branche vous devez saisir :

$ git checkout development

Après un message Switched to branch 'development', vous pouvez vérifier que cela a fonctionné en tapant :

$ git branch

Et cette fois, vous devez obtenir :

* development
  master

L'astérisque devant "development" vous montre que vous travaillez maintenant sur la branche "development". Si vous faites une modification quelconque, cela affectera uniquement la branche "development" et absolument pas la branche "master".

Essayez par exemple de changer quelques lignes (en supprimant par exemple le lien dans "layout.erb") puis commitez ces modifications :

$ git commit -a -m "Suppression du lien en pied de page"

Revenez alors sur la branche principale :

$ git checkout master

Vous pouvez réouvrir le fichier "layout.erb" pour constater que votre modification n'est pas là ! Et que le lien que vous venez de supprimer est toujours là ! On retourne dare-dare sur la branche de développement :

$ git checkout development

On ré-ouvre derechef la fichier "layout.erb" et notre modification est bien là !

Le plus gros intérêt des branches est de permettre de séparer la branche principale du code de la branche de développement. Mais étant donné que c'est si facile et si rapide, on peut aussi utiliser les branches pour tester de nouvelles fonctionnalités. Supposons que je veuille ajouter un super fonctionnalité Twitter dans ma branche de développement. Je commence par créer une nouvelle branche dédiée à cette fonctionnalité :

$ git branch feature-twitter

Puis je passe sur cette branche

$ git checkout feature-twitter

On va ensuite ajouter notre super fonctionnalité Twitter et tester qu'elle marche correctement. Pour gagner un peu de temps, pourquoi ne pas ajouter un lien vers Twitter dans le pied de page (soit le fichier "layout.erb si vous avez bonne mémoire). Ces modifications vont seulement concerner notre nouvelle branche "feature-twitter". Disons que ces modifications vous donnent satisfaction (et que le lien fonctionne) vous allez les commiter :

$ git commit -a -m "Ajout fonctionnalité Twitter"

Et ensuite vous allez vouloir avoir ces modifications dans votre branche de développement. Et pour cela, vous allez donc devoir les fusionner. Et pour commencer, il faut repasser sur la branche développement :

$ git checkout development

Puis y fusionner les modifications apportées dans la branche pour Twitter :

$ git merge feature-twitter

A partir de maintenant, les modifications que vous aviez faites dans la branche "feature-twitter" sont bel et bien incluses dans la branche développement. Par conséquent, vous n'avez plus besoin de la branche Twitter qui ne vous a servi que pour les tests. Vous pouvez donc la supprimer définitivement en utilisant l'option "-d" :

$ git branch -d feature-twitter

Lorsque votre branche de développement aura été recettée et sera fin prête pour le grand jour de la mise en production, il ne vous restera plus qu'à la fusionner à votre branche "master". Souvenez-vous bien qu'il faut d'abord passer sur la branche "master" puis y fusionner la branche "development" :

$ git checkout master
$ git merge development

Les Tags

Vous pouvez créer un tag pour un projet à n'importe quel moment, en utilisant la commande suivante :

$ git tag v1.0 -m "Version 1.0 du projet Reverse"

Cela vous permet d'immortaliser certains moments du développement - assurez vous d'avoir ajouté et commité tous les changements apportés avant de créer un tag. Si vous voulez voir tous les tags que vous avez créé, vous pouvez taper :

$ git tag

Et si vous souhaitez revenir à une version précédente, alors vous créez une nouvelle branche pour celle-ci. Supposons qu'à l'avenir vous ayez à revenir sur cette version (pour corriger un bug dessus par exemple), vous aurez à saisir la commande ci-dessous :

$ git checkout v1.0 -b version1

Cela va automatiquement créer une nouvelle branche nommée "version1" qui sera la copie exacte de ce qu'était le projet lorsque vous aviez créé le tag "v1.0", sans que cela vous fasse perdre quoique ce soit de votre code actuel.

Les repositories distants

Github est un service extraordinaire qui vous permet de conserver votre code dans un repository distant qui est hébergé sur leurs serveurs. Pour pouvoir démarrer, vous n'avez qu'à vous inscrire pour disposer d'un compte gratuit, définir un nouveau projet puis suivre leurs instructions pour créer un nouveau repository distant.

Une fois que votre repository distant est créé, tout ce qu'il vous reste à faire c'est d'entrer la commande ci-dessous :

$ git push origin master

Cela aura pour effet d'envoyer tout le code de votre branche "master" vers votre repository chez GitHub. C'est très pratique pour disposer d'une sauvegarde externe de votre repository dans le cloud mais aussi pour partager votre travail avec les autres (l'idéal pour tous les projets open source !). Par contre, si vous voulez que votre repository reste privé alors vous aurez besoin de prendre un compte payant sur GitHub.

Vous pouvez aussi vous mettre à utiliser le code d'autres personnes sur GitHub en clonant leur repositories et en utilisant la commande pull pour récupérer toutes les modifications qu'ils ont effectuées. Quant à eux, ils ont aussi la possibilité d'utiliser la commande pull pour récupérer les changement que vous avez apporté. Tout cela fait de Git un outil particulièrement puissant dès qu'il s'agit de collaborer sur un même projet, dans la mesure où il permet aux gens de corriger des bugs dans votre code, d'améliorer votre code ou de développer un projet totalement nouveau.

Quelques ressources sur Git

Daren a collecté un certain nombre de ressources consacrées à Git que vous pouvez retrouver sur le tutoriel d'origine.

Git est une application super puissante qui va révolutionner la façon dont vous gérez vos projets. Et il est extrêmement précieux quand il s'agit de gérer et de déployer des applications Sinatra sur la plateforme Heroku, ce dont je parlerai dans un prochain billet.