MyDigital-life.online

Ce blog va me permettre d'écrire tout ce qui me passe par la tête et de vous en proposer une lecture.

Environnement de developpement

Environnement de developpement

Depuis peu, je developpe des applications web. Pour le moment uniquement des applications basées sur le framework Rails. A mon avis, c'est le framework idéal pour débuter facilement et rapidement. Il est basé sur Ruby et utilise un langage dit naturel.

Histoire rapide (très rapide)

Très rapidement, ruby est apparu en 1995 des mains de Yukihiro « Matz » Matsumoto qui souhaitait un langage de programmation simple et naturel, il publit sur son blog des articles intéressant, que je vous laisse consulter : Matz journal !

Je terminerais cette présentation rapide en reprenant les propos de Mats discutant sur la liste de diffusion anglophone Ruby-Talk, le 12 mai 2000 :

Ruby est simple en apparence, mais son architecture interne est très complexe — tout comme notre corps peut l’être.

Si vous voulez en savoir plus, je vous conseille de lire la page à propos de ruby-lang.

Rails

Qu'est-ce que Rails ? En fin de compte ce n'est qu'une librairie Ruby parmis tant d'autres. Rails s'installe par la commande gem install rails. Les librairies Ruby se nomment des GEMs. Elles sont toutes documentées et accessible sur le site https://rubygems.org/.
gem Rails

Cette gem permet d'ajouter un framework web complet (dit full-stack) pour créer des applications web simple et efficaces. Pour preuve, il suffit de suivre le premier guide Rails pour être capable de créer un site web permettant de gérer des articles (Création, Lecture, Mise à jour, Suppression - communément appelé CRUD).

Comment utiliser Rails pour developper

Rails est, comme tout bon langage de developpement, plus robuste à installer sous Linux (et MacOS). Sous Windows c'est un peu plus complexe. Railsinstaller existe bien mais il montrera rapidement ses limites lors de développement d'applications web utilisant des gems proche du système, comme bcrypt, car c'est (pour cet exemple) utilisé par défaut comme le stockage de hash de mot de passe dans OpenBSD (distribution Unix). On peut donc vite comprendre que faire fonctionner cela sous Windows puisse poser des problèmes :
bcrypt issues

256 000 résultat sur les problèmes avec bcrypt sous Windows (même si grand nombre de résultats sont des faux positifs, cela reste énorme).

J'ai bien essayé mais au bout d'un moment avec les différents modules tel qu'Heroku ou Git ça devient vite compliquer à gérer !

J'ai donc suivi une autre de mes technologies favorites pour me faire un environnement de developpement qui serait toujours fonctionnelle en toute circonstances : Docker !

Developper avec Rails sous Docker

Pour cela rien de plus simple, il me fallait juste construire un container avec les quelques dépendances nécessaire pour faire tourner Rails et lier cela à un répertoire local et le tour était joué...

Antivirus trop sécure

L'unique problème de cette solution c'est qu'il faut partager sons disque. Et là quand on est sous Windows, cela peut mal se passer ! Bien que les documentations sur le sujets soient très complètes. On se retrouve rapidement bloqué en boucle sur le message suivant :
bloqué par le pare-feu Windows

J'ai cherché très longtemps avant de trouver la solution, pourtant toute simple :
Si vous êtes comme moi sous Norton Antivirus, il faut ajouter à la liste de contrôle des programmes les fichiers suivants :

  • c:\program file\docker\docker.exe
  • c:\program file (x86)\docker\docker.exe
  • c:\program file\docker\docker\docker for windows.exe
  • c:\program file\docker\docker-proxy.exe
  • c:\program file\docker\dockerd.exe
  • c:\program file (x86)\docker\dockerd.exe

Cela permet ensuite de valider la case suivante des paramètres Docker :
share drive

Il se peut que vous ayiez à jouer un peu avec les permissions (mais normalement non) : ce tuto est plutôt bien fait !

Dockerfile

Une fois que ce problème est résolu, il ne reste qu'à créer le container. Pour cela, un Dockerfile simple est à créer :

FROM ruby:2.3.3

MAINTAINER John D.

LABEL version="1.1"
LABEL description="This container host rails for development purpose"

RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs vim nano wget \
    && rm -rf /var/lib/apt/lists/*
RUN mkdir /myapp
RUN gem install bundler
RUN gem install actioncable actionmailer actionpack actionview activejob activemodel activerecord activesupport arel bcrypt bigdecimal builder byebug coffee-rails coffee-script coffee-script-source concurrent-ruby debug_inspector erubis execjs globalid i18n io-console jbuilder jquery-rails json loofah mail mail_form method_source mime-types mime-types-data mini_portile2 minitest multi_json net-telnet nio4r nokogiri orm_adapter posix-spawn power_assert psych puma rack rack-test rails rails-dom-testing rails-html-sanitizer rails_12factor rails_serve_static_assets rails_stdout_logging railties rake rdoc responders rubygems-update sass sass-rails sprockets sprockets-rails sqlite3 test-unit thor thread_safe tilt turbolinks turbolinks-source tzinfo uglifier warden web-console websocket-driver websocket-extensions yajl-ruby 
RUN gem install did_you_mean -v 1.0.0

WORKDIR /myapp

1- On part de l'image Ruby 2.3.3 et on la mets à jour;
2- On installe les dépendances nécessaire au systèmes et à Ruby
3- On crée un répertoire de travail /myapp dans le container
4- On installe le bundler qui permet de récupérer les dépendances de nos projets rails
5- On installe les gems basiques (ce qui permettra de faire un bundle install plus rapide pour chaque projets)
6- On installe la gem didyoumean qui permet de donner des infos sur les méthodes lors des messages d'erreur si on a fait une faute de frappe, pratique donc :)
7- on spécifie le répertoire de travail

Et voilà, il n'y a plus qu'à créer le container !

Création et utilisation

Enfin, il ne reste plus qu'à faire un docker build -t rails_container . dans le même répertoire que celui du Dockerfile.

L'opération va prendre quelques minutes car il y a pas mal de paquets à installer. Une fois qu'elle est terminée, il ne reste plus qu'à lancer le container via la commande docker run rails_container. Par contre si vous ne spécifiez pas plus d'informations, rien ne se passera.

La ligne de commande idéale est la suivante :
docker run -ti -v ${PWD}:/myapp -p 3000:3000 rails_container bash

Ainsi vous aurez un container qui sera lié à votre dossier de developpement local, ici le répertoire courant (via la variable ${PWD}), ce dossier se nommera /myapp dans le container mais vous atterirez directement dans ce répertoire avec la commande précédente. L'option bash à la fin, permet d'avoir une invite de commande et donc de lancer les commandes utiles à Rails :

  • bundle install pour la mise à jour des dépendances de votre projet via le fichier Gemfile
  • rails c pour l'IRB de Rails
  • rails s pour lancer le serveur rails et voir votre application

Voici ce à quoi vous aurez droit après avoir lancé ce container :

root@abbc086cb76c:/myapp# rails s
=> Booting Puma
=> Rails 5.0.1 application starting in development on http://localhost:3000
=> Run `rails server -h` for more startup options
Puma starting in single mode...
* Version 3.7.0 (ruby 2.3.3-p222), codename: Snowy Sagebrush
* Min threads: 5, max threads: 5
* Environment: development
* Listening on tcp://0.0.0.0:3000
Use Ctrl-C to stop
Started GET "/" for 172.17.0.1 at 2017-02-20 17:02:11 +0000
Cannot render console from 172.17.0.1! Allowed networks: 127.0.0.1, ::1, 127.0.0.0/127.255.255.255
  ActiveRecord::SchemaMigration Load (0.4ms)  SELECT "schema_migrations".* FROM "schema_migrations"
Processing by WelcomeController#index as HTML
  Rendering welcome/index.html.erb within layouts/application
  Post Load (24.0ms)  SELECT  "posts".* FROM "posts" ORDER BY created_at desc LIMIT ?  [["LIMIT", 3]]
  Project Load (0.5ms)  SELECT  "projects".* FROM "projects" ORDER BY created_at desc LIMIT ?  [["LIMIT", 3]]
  Rendered welcome/index.html.erb within layouts/application (335.9ms)

Voilà, vous savez tout et n'avez plus d'excuse pour passer sous Linux uniquement pour vous lancer dans le developpement Rails !

A+
Tony B.