Une journée dédiée à MongoDB

Le 21 Juin se tiendra à Paris un événement auquel je vous invite à venir. Cet événement sera dédié à MongoDB, le MongoFR.
J'ai la chance de pouvoir proposer une petite conférence sur un retour d'expérience : ma migration de SQL à MongoDB sur Oupsnow. Hormis les développeurs de 10Gen, il n'y aura que des Rubyists.
Selon moi, cette nouvelle technologie qu'est MongoDB est assez prometteuse.
Pour découvrir MongoDB, venez nombreux le 21 Juin !
Oupsnow 0.5.0 est sortie
Ca y est, j'ai presque pris un cycle de release pas trop mauvais. Ainsi après seulement un mois après la version 0.4.1 de Oupsnow, voici la version 0.5.0. Cette version apporte quelque feature, mais marque surtout un moment de stabilité dans le code.
Les nouveautés
- Ajout d'un filtre sur la recherche des tickets pour ne voir que les tickets fermé ou non
- Possibilité d'éditer une milestone pour les admin d'un projet
- Possibilité de définir une milestone comme actuelle. Par défaut, c'est la première milestone créée
- Possibilité de récupérer son password par email
- Possibilité de rester connecter avec un remember_me
- Ajout d'information concernant le nombre de tickets filtrés ou vues
- Possibilité pour chaque utilisateur loggé de suivre un ticket. Un utilisateur qui suit un ticket recevra ainsi à chaque mise à jour de ce ticket un email concernant cette modification.
- Les utilisateurs ne peuvent plus changer leur email.
Enfin comme d'habitude voici mon fichier capistrano de déployement pour faciliter celui-ci.
Ficher de déployement capistrano
set :application, "oupsnow"
set :repository, "git://github.com/shingara/oupsnow.git"
set :domain, "dev.shingara.fr"
# If you aren't deploying to /u/apps/#{application} on the target
# servers (which is the default), you can specify the actual location
# via the :deploy_to variable:
set :deploy_to, "XXXXXXXXX"
# If you aren't using Subversion to manage your source code, specify
# your SCM below:
# set :scm, :subversion
set :scm, :git
set :git_enable_submodules, 1
set :runner, "xxxx"
set :user, "xxxx"
set :use_sudo, false
set :thin_conf, "/etc/thin/#{domain}.yml"
set :rails_env, "production"
role :app, domain
role :web, domain
role :db, domain, :primary => true
task :update_config, :roles => [:app] do
run "ln -s #{shared_path}/config/database.yml #{release_path}/config/database.yml"
run "ln -s #{shared_path}/config/email.yml #{release_path}/config/email.yml"
run "ln -s #{shared_path}/config/initializers/errornot.rb #{release_path}/config/initializers/errornot.rb"
run "cd #{release_path} && echo 'GOOGLE_ANALYTICS=\"XXXXXXXX\"' >> config/environment.rb"
end
namespace :deploy do
task :start, :roles => [:app] do
run "thin -C #{thin_conf} start"
end
task :stop, :roles => [:app] do
run "thin -C #{thin_conf} stop"
end
task :restart, :roles => [:app] do
run "thin -C #{thin_conf} restart"
end
end
task :update_db do
run "cd #{current_path} && RAILS_ENV=#{rails_env} rake db:update"
end
after "deploy:update_code", :update_config
after "deploy:symlink", :update_dbSortie de Oupsnow 0.4.0
Ca y est, Oupsnow 0.4.0 est enfin sorti. Cette version est un refactoring quasiment complet. Après avoir eu une version 0.3.0 en Merb/DataMapper, cette version est désormais en Rails/MongoDB. Le back-end et le serveur ont changé.
Cette nouvelle version, outre son refactoring comprend aussi l'ajout de quelques nouvelles fonctionnalités.
- Ajout d'un filtre par Status dans la recherche de ticket
- Ajout de la possibilité de changer la fonction de tous les membres d'un project
- Ajout de la preview des tickets et commentaires sur les tickets
- Ajout de la visualisation de la milestone courante dans la visualisation d'un ticket
- Possibilité d'ordonner tous les champs de recherche dans la vue des tickets
- Login par l'email et plus par le pseudo
Vous pouvez télécharger cette version sur rubyforge
Si vous souhaitez tester cette version, une version de demo de oupsnow est en ligne. Les login/mdp sont : admin@admin.com/oupsnow. Amusez vous bien.
[...]Devise ? c'est bien, mais il faut le tester.
Alors que j'ai évoqué ma migration de Merb à Rails pour Oupsnow, il a fallu trouver un système d'authentification ORM Agnostique.
Le plugin d'authentification le plus connu à l'heure actuel est Authlogic. Ce plugin est vraiment très performant, mais tous les essais de le rendre ORM Agnostique ont été vain. C'est alors qu'au même moment, durant le Rails Summit 2009, George Guimarães et Carlos Antonio annoncent la sortie de Devise, un plugin Rails au dessus de Warden ( Rack middleware d'authentification). C'est exactement, ce qu'il me faut, un nouveau système d'authentification a tester et peut-être une possibilité d'ajouter une couche d'ORM Agnostique dedans. En plus Warden étant un RackMiddleware, je pourrais un peu tester ce que ça donne.
J'installe donc Devise et commence à l'utiliser dans Oupsnow. Tout se passe à merveille, jusqu'au moment où il faut faire les tests. Tout de suite le bât blesse. Les tests controlleurs de Rails ne communiquent pas avec la couche Rack qui n'est pas initialisée. On se retrouve donc avec une impossibilité de définir si un utilisateur est loggé ou non et si oui, qui est cet utilisateur.
Après de nombreux tests et essais. J'ai fini par trouver comment faire.
Warden ajoute à la requête une variable d'environment dans la requête. On peux
y accéder par
request.env['warden']. Il suffit donc de remplir cette
variable.
Pour avoir un utilisateur non loggé, il faut faire :
def unlogged request.env['warden'] = Warden::Proxy.new(request.env, {:default_strategies => [:rememberable, :authenticable],:silence_missing_strategies => true}) end
Pour se logger avec un utilisateur en particulier il faut faire :
def logged_as(user) proxy = Warden::Proxy.new(request.env, {:default_strategies => [:rememberable, :authenticable], :silence_missing_strategies => true}) proxy.set_user(user, :store => true, :scope => :user) request.env['warden'] = proxy end
Personnellement, j'aime beaucoup devise. A tel point que j'ai permis de le rendre ORM Agnostique et compatible avec MongoMapper.
EDIT du 30 Novembre 2009: la technique indiquée ici n'est pas optimum et ne marche pas avec les dernières versions de Devise. utilisez plutôt la technique décrite dans mon ticket Comment tester devise ? réélement ?
[...]Oupsnow de Merb à Rails
Dernièrement, j'ai fini par me décider de migrer Oupsnow, de Merb à Rails.
Alors que je finissais une migration de SQL à MongoDB, j'en entame une nouvelle. Celle-ci beaucoup plus profonde.
La raison de ma migration ?
Rails 3. En effet, depuis Décembre 2008, soit presque un an, Merb s'est figé. Certain me diront que la communauté Merb est en train de revivre et c'est tout à fait vrai. J'en suis même ravi. Mais Merb a pris un immense retard en presque un an. Même si Rails n'a pas vraiment avancé dans sa version stable, sa version Edge a elle énormément avancée.
Voulant toujours tester les nouvelles technologies en Ruby, je voudrais tester Rails 3. Mais aucun système n'existe pour passer de Merb à Rails 3. Un rapide test m'a montré que la différence était par contre minime entre Rails 2.3.x et Rails 3. La migration de Rails 2.3.x à Rails 3 en sera donc d'autant plus simple.
Voulant vraiment sortir une version stable le plus vite possible, j'ai donc pris la décision de migrer Oupsnow vers Rails 2.3.x pour ensuite migrer sur Rails 3 pour cette fois sortir une version de Oupsnow compatible Rails 3.
Oupsnow devient donc un projet Rails/MongoMapper et non plus Merb/DataMapper comme sa dernière version. Toute aide est bien-sûr la bienvenue.
[...]Sortie de Oupsnow 0.2.0 avec mise en production
Ca y est, après moins d'un mois, voici la nouvelle version de Oupsnow. Cette version 0.2.0 est la première version que je mets moi même en production. En effet, désormais ma platforme de développement n'est plus propulsé par Redmine, c'est Oupsnow.
Les nouveautés de cette version sont les suivantes :
- Un converteur Redmine -> Oupsnow a été intégré. C'est grâce à lui que j'ai pu changer ma platforme de développement sans perte.
On été ajouté :
- Une gestion des milestones
- Une gestion des Etats des tickets
- Une gestion des Sévérité des tickets
- Formatage des textes avec RedCloth
Après cette nouvelle release, j'ai vais pouvoir me reconcentrer sur Typo et ainsi faire la fonctionnalité phare de la version 5.2.1.
[...]Sortie de la première version de Oupsnow 0.1.0
Je suis assez content de vous présenter Oupsnow. En effet, après avoir participé à redmine et l'avoir utilisé, j'ai décidé de créer mon propre bug tracker. Je trouvais de plus en plus de défauts à Redmine qui n'était pas comblé. Il est très fortement inspiré de Lighthouse qui a l'avantage d'être vraiment simple d'utilisation.
Voici donc la première version qui sort après 2 mois de développement. Elle est encore loin d'être un produit complètement fini. Mais elle commence à avoir un début de fonctionnalité suffisante. De plus Oupsnow est un produit réalisé avec Merb. J'ai ainsi pu découvrir et approfondir Merb grâce à ce projet.
Dans la prochaine release, j'améliorerais un peu l'administration. Je créerais aussi un convertisseur de Redmine vers Oupsnow. Cela entrainera ma migration vers Oupsnow à la place de redmine pour ma plateforme de développement
J'ai mis en place une version de démonstration pour vous que ayez une idée de ce que Oupsnow permet.
En bonus, voici mon fichier deploy.rb qui m'a permis de déployer la version de démonstration de Oupsnow par capistrano
set :application, "oupsnow" set :repository, "git://github.com/shingara/oupsnow.git" set :domain, "shingara.fr" # If you aren't deploying to /u/apps/#{application} on the target # servers (which is the default), you can specify the actual location # via the :deploy_to variable: set :deploy_to, "/var/rails/oupsnow-demo" set :deploy_via, :remote_cache set :repository_cache, "#{application}-src" # If you aren't using Subversion to manage your source code, specify # your SCM below: # set :scm, :subversion set :scm, :git set :git_enable_submodules, 1 set :runner, "rails" set :user, "rails" set :use_sudo, false set :rack_up, "/etc/thin/oupsnow-demo.ru" set :merb_port, 46000 role :app, domain role :web, domain role :db, domain, :primary => true task :update_config, :roles => [:app] do run "ln -s #{shared_path}/config/database.yml #{release_path}/config/database.yml" end namespace :deploy do task :start, :roles => [:app] do run "merb -u #{user} -G #{user} -d -c 1 -p #{merb_port} -n #{application} -a thin -e production -m '#{deploy_to}/current/'" end task :stop, :roles => [:app] do run "merb -u #{user} -G #{user} -d -c 1 -K all -p #{merb_port} -n #{application} -a thin -e production -m '#{deploy_to}/current/'" end task :restart, :roles => [:app] do deploy.stop deploy.start end end after "deploy:update_code", :update_config