Déployer Middleman avec Mina

Si vous êtes des lecteurs réguliers de ce blog, vous savez probablement qu'il est propulsé par le générateur de sites statiques Middleman : j'ai déja rédigé différents articles sur ce sujet), n'hésitez pas à aller les parcourir. Néanmoins, je n'ai encore jamais évoqué un autre outil que j'utilise dans mon workflow pour déployer ce blog, ainsi que la quasi-totalité de mes projets : Mina.


Mina, un Capistrano light

À l'époque où je cherchais des outils pour déployer facilement mes différents projets (un peu comme vous pouvez le faire avec les outils de heroku), je me suis bien entendu penché sur l'inévitable Capistrano. Comme on peut le voir sur Ruby-Toolbox, ce gem est de loin le plus utilisé dans l'univers ruby pour automatiser le déploiement de web applications.

Ruby Toolbox - Deployment automation

Néanmoins, lors de mes différents essais, je n'avais pas eu beaucoup de succès avec Capistrano malgré de nombreuses tentatives : le gem venait tout juste de passer en version 3, la majorité des documentations et tutoriels que je trouvais n'était pas à jour, et, il faut l'avouer, ma connaissance limitée de ce sujet n'aidait pas. Je me suis donc mis à la recherche d'outils comparables, mais plus simples à configurer et utiliser. Et c'est ainsi que j'ai fait la découverte de Mina, un excellent projet initié par le studio Nadarei.co.

Construire et déployer un site Middleman avec Mina

Si vous ne connaissez pas du tout ce gem, je vous laisse aller jeter un oeil au README disponible sur le dépôt du projet, il explique en détails les étapes à suivre pour utiliser Mina dans votre projet. Une fois votre serveur configuré et près à recevoir vos déploiements, toute la configuration de Mina est décrite dans le fichier config/deploy.rb. C'est ce fichier que je me propose de partager avec vous, afin de vous montrer à quel point Mina est simple d'accès :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
require 'mina/bundler'
require 'mina/git'
require 'mina/rvm'

set :domain,      "my.server.com"
set :user,        "deploy-user"
set :deploy_to,   "/var/www/my-blog"
set :repository,  "git@my.git.repository.git"
set :branch,      "master"

# RVM: Environment loaded for most commands, such as `mina deploy` or `mina rake`.
task :environment do
  set :rvm_path, '/usr/local/rvm/scripts/rvm'
  invoke :'rvm:use[ruby-2.0.0-p247]'
end

desc "Deploys the current version to the server."
task :deploy => :environment do
  deploy do
    invoke :'git:clone'
    invoke :'bundle:install'
    queue "bundle exec middleman build"

    # Only keep the last 4 releases
    set :keep_releases, 4
    invoke :'deploy:cleanup'
  end
end

Comme vous le voyez, le fichier de configuration de Mina est particulièrement simple à comprendre : je déclare tout d'abord le domaine et l'utilisateur avec lesquels je vais effectuer ma connexion SSH au serveur, le répertoire où je vais déployer mon projet, le dépôt et la branche que je vais récupérer lors du déploiement. Mina prépare son environnement (en l'occurrence, il s'assure de bien utiliser la bonne version de Ruby) puis procède au déploiement en tant que tel:

  1. Clone du projet git,
  2. bundle install,
  3. middleman build pour générer le site statique à partir du source,
  4. Nettoyage des anciennes versions déployées.

Avec cet outil, déployer un site middleman se fait donc tout simplement avec un simple mina deploy : le site est généré sur votre serveur, votre historique git est propre (pas besoin de committer votre répertoire build)…c'est un peu magique !

Bien entendu, cela suppose que vous disposiez sur la machine distante d'un SSH et d'un serveur web correctement configuré (au hasard: l'excellent nginx) et prêt à servir les fichiers HTML qui seront générés par la commande middleman build… mais ça dépasse le cadre de cet article.


Références