Push Button To Deploy

Publié le 2 octobre 2014 par Théo Delaune

Cet article est publié sous licence CC BY-NC-SA

Nous sommes partis d’un constat très simple : comment un non développeur ou un client pourrait déployer son application sans avoir à mettre les mains dans le code ?

PBTD (Push Button To Deploy) tente de résoudre ce problème en permettant à quiconque de déployer directement un projet utilisant capistrano depuis une interface web.

Presentation

PBTD fonctionne avec des projets sous capistrano 2 et capistrano 3. Il va extraire les configurations capistrano de vos projets pour différencier les environnements.

Pour ce faire vos configurations capistrano devront contenir les mêmes variables que celles des exemples de configuration fournis avec PBTD.

Pour quoi faire ?

La fonction principale de PBTD est de pouvoir déployer une application sur un environnement spécifique: staging, production ou n’importe quel autre environnement que vous utilisez.

IL vous permet également de visualiser la distance de commits entre le dépôt git et l’application déployée, ce qui vous permet de rapidement constater que votre version déployée a X commits de retard par rapport à votre branche.

Lors de l’ajout d’une application sur PBTD, vous pourrez choisir les environnements à afficher sur la page principale.

Vous pouvez ne vouloir configurer que votre environnement de pré-production par exemple. Le cas typique est une application en cours de développement que vous déployez régulièrement en pré-production mais qui n’est pas encore partie en production.

PBTD est un outil pratique pour votre intégrateur ou votre client qui ne maîtrise pas l’outil capistrano. Il peut également vous être utile si vous avez besoin de déployer un projet et que vous n’avez pas le code sous la main.

Le déploiement de vos applications Ruby on Rails s’en trouve simplifié.

Dépendances

Sidekiq

Sidekiq est une gem permettant de faire tourner des processus Ruby en arrière plan.

Au sein de PBTD, cette gem permet de lancer trois actions:

  • Le clonage du dépôt git lors de l’ajout d’un projet.
  • La récupération de la différence de commits entre le dépôt git et l’application déployée.
  • Le déploiement de votre application en lançeant Capistrano.

Sidekiq est dépendant de Redis, une base de donnée NoSQL orientée clé/valeur. Nous verrons l’installation de Redis dans la suite de l’article.

Faye

Faye est un serveur publish/subscribe de messages. Il est disponible en NodeJS ou en Ruby. Pour PBTD Nous utilisons naturellement la version Ruby.

Sur PBTD, Faye à pour but d’afficher en temps réel les actions lancées par l’utilisateur:

  • L’affichage de la différence de commits entre le dépôt git et l’application déployée lorsque l’utilisateur met à jour son projet au sein de PBTD.
  • L’affichage en temps réel du retour Capistrano lorsque l’utilisateur lance un déploiement depuis PBTD.

Clé SSH

Une clé SSH est nécessaire pour l’utilisation de PBTD. Elle permet la connexion à votre dépôt git et aux serveurs distants sur lesquels PBTD va déployer vos applications.

Nous verrons la création d’une clé ssh dans la suite de l’article.

Sur l’environnement de développement et de test, aucune configuration en plus de la création de la clé SSH n’est demandée, l’application utilisant votre agent local.

Sur un environnement de pré-production ou de production l’ajout du chemin vers la clé ssh créée est à spécifier dans le fichier config/settings.yml de sorte que celle ci puisse lancer son propre agent.

Sur un serveur distant ajouter le contenu de la clé SSH publique dans le fichier ~/.ssh/known_hosts.

lib/enable-ssh.sh

Ce script bash est propre à PBTD, il est à ajouter dans le fichier config/settings.yml que nous verrons par la suite. Il est à ajouter pour les environnements autres que ceux de développement et de test.

Ce script permet de lancer un agent ssh sur un serveur distant car les commandes shell que va lancer PBTD se trouve dans un sous processus shell.

Whenever

Whenever est une gem permettant de lancer des tâches cron en Ruby. Sur PBTD cette gem est configurée dans config/schedule.rb.

Dans PBTD whenever lance toutes les 10h une mise à jour de la distance des commits pour tous les projets.

Libre à vous de modifier dans ce fichier l’intervalle de mise à jour.

Mise en place

Récupération des sources

$ git clone git@github.com:synbioz/pbtd.git

Installation des différents services

Pbtd utilisant Sidekiq nous allons avoir besoin d’installer redis.

Installons redis:

Linux (Debian ou dérivé):

$ sudo apt-get install redis-server

osx:

$ brew install redis-server

Pour l’accès aux dépôts git nous utilisons la gem Rugged qui est un binding en Ruby de libgit2.

Rugged nécessite que ces librairies soient présentes sur le système:

  • OpenSSL
  • libSSH2

Nous pouvons maintenant lancer l’installation de notre projet:

$ bundle install

À propos de ruby

Les applications Rails que vous allez configurer dans PBTD utilise certainement des versions de ruby différentes.

Il est de votre responsabilité de les installer au préalable sur le serveur faisant tourner PBTD.

À l’heure actuelle nous ne gérons que rbenv car c’est l’outil que nous utilisons mais la prise en charge de RVM ne devrait pas être particulièrement complexe.

Configuration de PBTD

Création d’une clé SSH

Si vous avez déjà un jeu de clés ssh publique/privée vous pouvez passer cette étape.

$ cd ~
$ mkdir .ssh
$ cd ~/.ssh/
$ ssh-keygen

config/settings.yml

Ce fichier joue une place centrale dans PBTD. Il contient toutes les variables de configuration par environnement:

  • repositories_path répertoire où les projets vont être clonés
  • faye_server adresse de votre serveur faye
  • default_branch La branche par défaut de votre dépôt git où se trouve la configuration capistrano

Pour les environnements autres que celui de développement ou de test:

  • ssh_public_key chemin où se trouve la clé publique *.pub
  • ssh_private_key chemin où se trouve la clé privée
  • basic_auth_user nom d’utilisateur pour l’authentification http
  • basic_auth_password mot de passe pour l’authentification http
  • ssh_agent_script chemin où se situe enable-ssh.sh

config/deploy.rb

Il Vous suffit de mettre à jour suivant votre configuration le fichier config/deploy.rb qui contient la configuration capistrano.

Environnements capistrano

PBTD à besoin de plusieurs variables dans la configuration de base d’un environnement capistrano:

  • server
  • rails_env variable
  • branch variable

Exemple sur notre environnement de staging config/deploy/staging.rb:

server 'pbtd.dev.synbioz.com', user: 'synbioz', roles: %w{web app db}

set :rails_env, 'staging'

set :branch, 'develop'

Lancement de PBTD sur votre environnement de développement

Nous allons commencer par le démarrage de redis comme suit:

$ redis-server

Nous pouvons maintenant lancer sidekiq :

$ bundle exec sidekiq

Faye est notre serveur de pub/sub, par défaut il tournera sur http://127.0.0.1:9292/faye. Il nous sert principalement à afficher en temps réel le retour du déploiement:

$ bundle exec rackup faye.ru -E production -s thin -p 9292

Nous pouvons à présent lancer notre serveur puma pour lancer l’application rails:

$ bundle exec rails s puma

Un mot sur les tests

Les tests au sein de PBTD utilisent:

  • Rspec framework de test Ruby on Rails
  • Fabrication générateur d’objets
  • Faker Générateur de fausses données
  • Guard Lancement automatique des tests

Le point bloquant actuellement sur les tests concerne les tests des Workers Sidekiq.

Les tests ne passent pas pour ces Workers, le problème venant du fait que nous essayons de contacter une application distante.

En effet, les tests des workers ont besoin d’un projet réel et déployé pour fonctionner correctement.

Nous n’avons pas encore trouvé la solution idéale, le mocking ferait perdre tout son sens aux tests des Workers.

Utilisation

Page principale

Lors du lancement de notre application nous arrivons sur une page présentant les différents projets que nous utilisons dans PBTD.

Homepage

De cette page nous avons accès à la possibilité d’ajouter un nouveau projet ainsi que de mettre à jour tous les projets.

Sur chaque projet nous avons la possibilité d’accéder à son édition, de le mettre à jour ou de déployer l’application.

La mise à jour d’un projet consiste à regarder si la version actuellement déployée pour un environnement est toujours issue du dernier commit de la branche git.

La création d’un projet se fait à partir de son url git. Vérifiez donc d’avoir bien accès au dépôt.

New

PBTD va récupérer votre projet git et vous afficher les environnements trouvés pour votre application.

Edit

Vous avez la possibilité de supprimer un environnement, mais aussi d’en ajouter un nouveau en rechargeant la liste des environnements.

Lors du lancement d’un déploiement une console s’ouvre avec la sortie capistrano en temps réel:

deploy

Conclusion

PBTD est un projet open-source disponible sur Github.

Nous espérons qu’il simplifiera vos déploiement et sommes à l’écoute de vos retours et contributions.


L’équipe Synbioz. Libres d’être ensemble.