Ruby on Rails 5 est sorti… et après ?

Pour le développement web, j’utilise Ruby on Rails depuis des années.

Ruby quoi ?

Ruby est un langage de programmation qui, en synthèse, n’est pas le plus rapide d’un point de vue technique mais est extrêmement rapide en termes d’écriture de code et en termes d’exécution dans un cadre concret. Vous connaissez le lièvre et la tortue ? C’est la tortue.

Ruby on Rails est un framework web reposant sur le langage Ruby. Un framework étant – grossièrement – un ensemble d’outils permettant d’atteindre un objectif. Dans le cadre de Ruby on Rails, il s’agit du serveur web, de la connexion aux base de données, la gestion du cache, le rendu du contenu web, les tests unitaires et j’en passe. Tout ce qui permet de concevoir une plateforme web solide et performante.

Ruby on Rails a quelques beaux succès à son actif (Basecamp, GitHub, AirBnB, Twitch, SoundCloud, Hulu, Zendesk, Square et j’en passe). C’est du sérieux.

On passe la cinquième

Ruby on Rails est né en 2004. Et, en 12 ans, le web a bien évolué.

Le framework web a suivi ces évolutions. A son rythme, pour garder sa solidité.

C’est donc dans les derniers jours de juin 2016 que Ruby on Rails 5 a vu le jour.

Action Cable : du temps réel

Le temps réel, qu’est-ce que c’est ?

En général, sur le web, un client (navigateur web, application mobile) effectue une requête auprès d’un serveur. Et le serveur renvoie une réponse.

Le client a donc à l’instant T une réponse datant de sa dernière requête.

S’il veut une réponse plus « fraîche », il doit effectuer une nouvelle requête. Qui lui dira si oui ou non il y a un nouveau contenu. Le tout en faisant transiter sur le réseau tout un tas d’informations à l’utilité douteuse.

Puis sont apparues les WebSocket, qui sont une réponse à cette problématique.

Les WebSocket sont disponibles depuis un certain temps, mais sont devenues « populaires » seulement récemment. Depuis un certain temps sur Firefox, Chrome et Safari. Depuis Internet Explorer 11 (version 10 en théorie), qui commence juste à être populaire. Et bien sûr son successeur Edge. Côté mobile, c’est disponible depuis iOS 4.2 (autant dire, tous les iOS en circulation), et depuis Android 4.4 (77 % des appareils, mais beaucoup utilisent également le navigateur Chrome, plus récent).

C’est encore un peu neuf, mais c’est tout de même disponible sur une très grosse majorité des appareils. Mais au fait : à quoi ça sert ?

On l’a vu : le web tel qu’il existe ne permet pas l’instantanéité. Les WebSocket répondent à cette problématique en permettant au serveur et au client d’avoir une connexion ouverte en permanence, en utilisant la connexion réseau HTTP(S).

Client et serveur peuvent donc s’envoyer l’un et l’autre des messages à tout moment, sans avoir tout une couche de protocole.

Quand une information nouvelle arrive, c’est le serveur qui déclenche un événement sur le client. Par exemple, dans le cadre d’une messagerie, le client 1 envoie un message au serveur qui va lui même le renvoyer au client 2.

Le client 2 n’aura pas besoin d’aller chercher l’info : elle vient a lui.

Action Cable, qui a un historique suffisant, est maintenant directement intégré – de manière optionnelle mais standardisée – au sein de Ruby on Rails.

En quelques manipulations, on crée des canaux de communication côté serveur (ruby) comme côté client (javascript).

J’ai eu l’occasion de le mettre en application dans un projet client. Je l’ai déployé sur Heroku. Ça marche du tonnerre.

Le mode API

En 2016, on ne fait pas seulement des sites web : on réalise aussi beaucoup d’API. Notamment pour les applications mobiles.

Pour les plus novices des lecteurs, les API web sont des interfaces qui ne sont visibles que par les programmes en eux-mêmes. Il s’agit d’échanger des données, dans des formats spécifiques. Mais il ne s’agit pas, comme sur un site web, d’échanger le contenu affiché.

Par exemple, un navigateur web va demander au site web de lui fournir le code HTML, les feuilles de style CSS, les images, etc.

Une application mobile va demander au service web de lui fournir les données uniquement. L’application mobile se chargera ensuite elle-même de la mise en forme. Ce type d’échanges de données est une API web.

Et l’API web fonctionne différemment d’un site web. On a globalement besoin de moins de choses, et les besoins sont plus spécifiques.

Ruby on Rails 5 permet de concevoir des applications web ayant spécifiquement le rôle d’API. Alors que c’est par défaut prévu pour concevoir des sites web.

C’est efficace. Pour l’avoir mis en place dans un projet d’application mobile, ça fait bien le job.

Les autres nouveautés

2-3 autres nouveautés permettent de renforcer la standardisation, les performances et la sécurité.

Le HSTS a notamment été renforcé. Cette technologie disponible sur les navigateurs web les moins anciens permet de s’assurer que tous les liens du site sont sécurisés en HTTPS.

Donc Ruby on Rails, c’est cool ?

Ouais, c’est cool. 🙂

Let’s Encrypt + Heroku :-)

Depuis peu, Heroku intègre gratuitement en beta le SSL via SNI.

Let’s Encrypt permet d’obtenir des certificats SSL gratuits.

Comment faire fonctionner l’ensemble avec Ruby on Rails ? C’est l’objet de cet article, fortement inspiré d’un article de Collective Idea.

Après ça, vous n’aurez plus d’excuses pour ne plus sécuriser vos sites !

D’abord, installer Let’s Encrypt

Vous êtes sur Mac et avez installé Homebrew ? C’est facile. Une simple ligne de commande suffit.

brew install letsencrypt

Pour les autres, rendez-vous sur le site officiel.

Premières étapes

Lancez l’invite de commande et suivez doucement les instructions.

sudo letsencrypt certonly --manual

On vous demande ensuite le nom de domaine.

Puis si vous êtes d’accord pour enregistrer votre IP : acceptez.

Ensuite, l’écran passe au noir avec un message de type :


Make sure your web server displays the following content at [...]

Là, stoppez !

On passe à la partie Ruby on Rails.

La partie Ruby on Rails

D’abord, mettez à jour config/routes.rb.


Rails.application.routes.draw do
# ...

# Let’s encrypt
get ‘/.well-known/acme-challenge/:id’ => ‘pages#letsencrypt’

# …

end

 

Le contrôleur s’appelle ici PagesController mais peut être n’importe quel contrôleur de pages statiques.
class PagesController < ApplicationController
def letsencrypt
# utilisez ici le code fourni par Let's Encrypt
render text: "code-fourni-par-lets-encrypt"
end
end

C’est fini pour la partie Ruby on Rails.

On continue via Let’s Encrypt

D’abord, on vérifie l’adresse http://<mon-domaine>/.well-known/acme-challenge/<id&gt; histoire de s’assurer que ça retourne bien le texte en code.

Là, c’est compliqué. On presse Enter.

Vous voyez le message Congratulations! ? C’est gagné !

Mais on ne s’arrête pas là.

Installation sur Heroku

Simple commande :
sudo heroku _certs:add /etc/letsencrypt/live/<domaine>/fullchain.pem /etc/letsencrypt/live/<domaine>/privkey.pem --app <mon-app>

Et voilà.

Pensez ensuite à mettre à jour vos DNS. Attendez quelques instants. Normalement, tout devrait être sécurisé.

[ Edit ]

Un outil permet de faciliter tout ça. Venez le découvrir sur GitHub. (merci @dmathieu)

Ruby : le développement agile

Chez Morin Innovation, société orienté « startup », nous travaillons à 100 % en mode agile. L’enjeu est de pouvoir être réactif tout en sécurisant le travail. Un bon équilibre en qualité et productivité.

Pour cela, nous nous appuyons sur Ruby, un langage orienté agilité de par sa conception.

Idée reçue n°1 : tout projet peut être mené quel que soit le langage utilisé

Cette idée, souvent répandue par les chefs de projets qui n’ont pas forcément de connaissances techniques, est théoriquement vraie. Mais théoriquement seulement.

Je peux théoriquement construire une maison en bois avec beaucoup d’allumettes. La maison sera théoriquement aussi solide. Mais il sera plus rapide et plus adapté d’utilisé le matériau adéquate.

Pour le développement, c’est pareil. C’est dans cet esprit qu’a été conçu Ruby dès ses origines : pour le développement agile.

Le langage et son environnement permettent de réaliser très rapidement des développements robustes. Dans la limite de ce que permettent les langages de script.

Idée reçue n°2 : les performances du langage déterminent les performances de l’application

Ne confondons pas performances et efficacité. Si l’interpréteur Ruby n’est pas le meilleur (ni le pire) en termes de performances, il permet un développement rapide. Et son environnement lui permet d’être optimal en termes d’efficacité.

Rien ne sert de courir, il faut partir à point.

Ruby propose une syntaxe optimale et minimaliste pour le développement. La relecture en est donc simplifiée. La correction de bugs est plus rapide. L’optimisation est également plus facile car plus simple à appréhender.

Également, le gain de temps obtenu sur la réalisation permet, si nécessaire, de passer du temps sur l’optimisation.

De plus, Ruby possède un système de packages (des composants à installer) qui fournissent du code open-source très simple à intégré et déjà optimisé.

Car, s’il y a une force dans Ruby, c’est également son système de plugins natifs, qui permet d’appeler du code natif (performant) depuis le langage Ruby. Idéal pour les portions de code critique (analyse de contenu XML/HTML, génération d’images, etc).

Enfin, le code Ruby peut être exécuté au travers d’une machine virtuelle Java (JVM) grâce à JRuby, ce qui apporte un gain de performances conséquent tout en profitant de l’efficacité de l’outil.

Ruby en environnement agile

Passées ces idées reçues, venons-en aux faits. En quoi Ruby est-il meilleur qu’un autre en environnement agile (SCRUM ou autres) ?

Développement souple et rapide

Comme évoqué, la syntaxe même de Ruby lui permet de faciliter le travail du développeur, que ce soit seul ou en équipe.

Un petit bout de code « pour tester » peut être très rapidement déployé. En quelques minutes, on peut avoir un outil d’extraction de données ou de quoi tester un service web.

Adapté aux tests unitaires

Que ce soit via ses modules de tests intégrés (Test::Unit) ou via des outils externes plus élaborés (RSpec), les tests unitaires sont une partie intégrante de l’environnement de développement Ruby.

Au delà de l’apport évident en termes de sécurité et de fiabilité du code, c’est un atout majeur pour le travail en équipe et le développement par les tests (Test Driven Development) qui est un des socles du développement agile.

Bien entendu, de nombreux outils permettent une intégration continue optimale et naturelle, ce qui est également un atout des méthodes de travail agiles.

Idéal pour le travail en équipe

Le code étant basé sur le script, son intégration dans les dépôts de code source (Git et autres) est totalement adapté.

Egalement, son système de packages (les gems) et la configuration des dépendances via le fameux Gemfile permettent d’installer rapidement l’environnement de développement adapté au projet.

Egalement, les gems pouvant être privés et stockés sur Git, le partage de code entre les projets est totalement optimisé.

Un atout majeur pour rejoindre les équipes. Que l’on travaille sur un même réseau ou à distance. Et dans un environnement de travail hétérogène.

Ruby on Rails : le développement web agile

Ruby on Rails est un framework web conçu en Ruby.

Son avantage est sa structure, copiée par de nombreux autres projets dans d’autres langages (Symfony, Play! et autres) : mais la copie ne vaut jamais l’original. Cette structure permet non seulement de s’y retrouver dans son propre code, mais permet également de facilement intégrer des développeurs sur un projet. Et, par extension, faciliter la reprise du code.

Ruby on Rails intègre évidemment les tests unitaires, un impératif pour l’intégration continue (via Codeship par exemple).

Le tout en profitant des atouts de Ruby. Et d’une logique orienté efficacité plus que performances.

La souplesse de l’outil permet un déploiement en environnement « scalable » très simple. Notamment grâce à des solutions comme Heroku, qui proposent un hébergement sans ce soucier de l’aspect administration réseau (tout se fait au travers d’un simple dépôt Git sécurisé).

La sécurité est au rendez-vous, avec un respect scrupuleux des recommandations OWASP.

Les performances « effectives » sont également au RDV, grâce – notamment – à des mécanismes de mise en cache simplifiés.

Success Stories

Travaillant en marque blanche (invisible pour le client final), je ne peux présenter les success stories de Morin Innovation. Je peux juste dire que Ruby nous permet de tenir nos délais de manière systématique (sauf rares exceptions indépendantes de l’équipe), tout en ayant une réactivité maximale sur la correction de bugs et avec des performances très honorables. (on a pu monter jusqu’à 1000 utilisateurs simultanés sur un projet web sans blocage ni lenteur)

Plusieurs sociétés se sont développées grâce à Ruby, et plus particulièrement Ruby on Rails :

  • Twitter
  • Shopify
  • LinkedIn
  • GitHub
  • Basecamp
  • Drivy
  • Airbnb
  • et bien d’autres.

Quid des autres solutions ?

D’autres solutions se développent, bien souvent en « copiant » le modèle de Ruby on Rails, mais dans d’autres langages.

NodeJS, par exemple, est à la mode. On entend souvent des responsables de projets informatiques en faire la promo en amont, dire ensuite que c’est génial… mais ne jamais le déployer à grande échelle. CQFD 🙂

En PHP, Symfony s’approche de Ruby on Rails. En Java (Scala), c’est Play qui reprend le même modèle.

Mais bon, la syntaxe joue beaucoup. Le langage Python, et son framework web Django, est probablement un des seuls à être du niveau de Ruby en termes d’efficacité.

L’évolution en environnement Java

Bien souvent, de nombreuses structures se sont orientées vers Java. Et elles souhaitent ensuite évoluer vers des solutions plus agiles.

L’avantages de Ruby est qu’il possède son environnement d’exécution Java : JRuby.

Non seulement JRuby peut s’exécuter dans un environnement Java, mais en plus on peut appeler du code Java depuis JRuby et vice versa.

Et maintenant ?

Je vous ai présenté l’environnement de développement Ruby.

Si vous souhaitez en savoir plus, n’hésitez pas à contacter Morin Innovation.

La cité niortaise devient la cité des startups et de l’innovation. Ce sera un plaisir pour nous de contribuer à l’accélération de vos développements.