Articles

Associer branche et base de données

Si vous utilisez git pour développer vos applications rails, vous êtes certainement un adepte des branches, qui vous permettent de développer vos nouvelles fonctionnalités en gardant au chaud votre branche « master », qui doit correspondre à tout moment à votre application en production.

Git, branches et base de données

Git, branches et base de données

Tant que vos modifications ne concernent que votre source, pas de problème ; mas si vous touchez à la base de données, vous courez à la catastrophe, puisque cette dernière est partagée entre toutes vos branches.

Heureusement, Mislav Marohnić a développé un petit hack du fichier database.yml qui permet de lever ce problème d’une manière élégante :

  • Récupérer le nom de la branche courante
  • Vérifier que vous souhaitez bien utiliser une base de données alternative grâce à un flag posé dans la configuration de git
  • Suffixer le nom de votre base de données avec le nom de la branche

Cela se traduit de la manière suivante :

## database.yml (after) <% # http://mislav.uniqpath.com/rails/branching-the-database-along-with-your-code/ 
branch = `git symbolic-ref HEAD 2>/dev/null`.chomp.sub('refs/heads/', '') 
suffix = `git config --bool branch.#{branch}.database`.chomp == 'true' ? "_#{branch}" : "" %> 

development: 
# ... autres infos de configuration de la base de données ... 
database: myapp<%= suffix %>

Il faudra également positionner le flag dans la configuration de git :

$ git config --bool branch.feature.database true

Créez ensuite la nouvelle base de données et appliquez le schéma de celle-ci avec les commandes de Rails suivantes :

rake db:create
rake:db:schema:load

Et voià le travail !

via mislav.uniqpath.com

Pousser son dépôt git vers un serveur

Lorsque je démarre un nouveau projet, cela se passe toujours sur ma machine cliente, et je crée bien entendu le dépôt git dans la foulée. Ce n’est généralement qu’après que je mutualise ce dépôt en le stockant sur github ou sur mon serveur git personnel.

Voici la méthode que j’utilise pour créer le dépôt à postériori :

# Sur le serveur
mkdir /chemin/vers/git/projet

# Sur le client, depuis le répertoire de votre projet
scp -r .git monloginserveur@monserveur/chemin/vers/git/projet

La commande scp permet de copier des fichiers par ssh. Cette copie binaire permet de dupliquer le dépôt du client vers le serveur en utilisant le login dont vous vos servez pour vous connecter en ssh.

Une fois que vous avez copié le dépôt, vous pouvez ajouter votre serveur comme dépôt distant dans votre projet avec la commande suivante :

git remote add origin ssh://monloginserveur@monserveur/chemin/vers/git/projet

Pour pouvoir pousser vos modifications vers votre serveur, vous devez ensuite taper la commande suivante dans le répertoire git de votre serveur :

git config --bool core.bare true

A partir de Simple Central Git Repository