Ah là là… dire qu’à la fin de la lecture de ce billet j’aurai complètement changé votre vision du Web… Je comprends mieux maintenant Didier Girard de SFEIR, il y a un avant et un après Google AppEngine… Mais bon, soyons patient et voyons ce que nous pouvons faire aujourd’hui. Ce qui suit est inspiré, pour ne pas dire affreusement copié sur ce que Guillaume Laforge a présenté le 28 mai dernier lors de la conférence Google I/O à San Francisco. J’ai simplement adapté la présentation en français, je l’ai fait fonctionner, pour le reste tout le crédit va à Guillaume.
A la fin de cet article vous serez en mesure de déployer sur Google AppEngine une petite application simple.
Installer Grails
Téléchargez et installer Grails 1.1.1. Pour ma part, sur Mac OS j’ai ensuite édité mon fichier .bash_profile afin de déclarer le chemin d’installation de Grails, et fixer la version de Java à la version 5 pour éviter quelques soucis plus tard avec Google AppEngine et DataNucleus.
Voici le contenu du fichier $HOME/.bash_profile
export M2_HOME=/usr/share/maven export JAVA_HOME=/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Home export GRAILS_HOME=/Users/nicolas/Dev/grails/grails-1.1.1 export APPENGINE_HOME=/Users/nicolas/Dev/appengine-java-sdk-1.2.1 export PATH=$PATH:$GRAILS_HOME/bin
Vérifiez que Grails est correctement installé avant d’aller plus loin:
macbook-pro-de-nicolas-martignole:~ nicolas$ export GRAILS_HOME=/Users/nicolas/Dev/grails/grails-1.1.1 macbook-pro-de-nicolas-martignole:~ nicolas$ export PATH=$PATH:$GRAILS_HOME/bin macbook-pro-de-nicolas-martignole:~ nicolas$ grails -version Welcome to Grails 1.1.1 - http://grails.org/ Licensed under Apache Standard License 2.0 Grails home is set to: /Users/nicolas/Dev/grails/grails-1.1.1 Base Directory: /Users/nicolas Running pre-compiled script Script not found: Version macbook-pro-de-nicolas-martignole:~ nicolas$
Les observateurs ont remarqué certainement la variable APPENGINE_HOME. Il est temps de télécharger Google AppEngine, après avoir demandé un compte. Suivez attentivement les explications de la page principale de Google AppEngine. Une fois le téléchargement effectué, j’ai simplement décompressé l’archive tar.gz dans un répertoire, puis ensuite j’ai configuré la variable APPENGINE_HOME afin qu’elle pointe vers le répertoire de GAE (Google AppEngine).
Créer sa première application Grails
Grails vous permet de créer rapidement une application et de la tester. Allons-y, placez-vous dans un nouveau répertoire vide et créez votre première application grails, appelée ici gaetex:
grails create-app gaetex
Lorsque nous utilisons Google AppEngine, nous devons désinstaller le plugin JPA et désinstaller le plugin Hibernate. Le plugin JPA génère un fichier persistence.xml qui vient en conflit avec celui utilisé par le mode JPA du plugin Google AppEngine. Concernant Hibernate, nous n’en avons pas besoin ici.
Pour cela il suffit d’exécuter les 2 commandes Grails suivantes en vous mettant d’abord dans le répertoire gaetex que nous venons de créer :
cd gaetex grails uninstall-plugin hibernate grails uninstall-plugin jpa
Notez qu’en principe, le plugin jpa n’est pas installé, j’ai ajouté cette commande au cas où vous l’auriez installé aussi.
Installer Google AppEngine
L’installation de Google AppEngine est simple. Assurez-vous simplement que la variable APPENGINE_HOME pointe vers votre répertoire d’installation de GAE puis lancer la commande d’installation du plugin App-Engine :
grails install-plugin app-engine
Ce qui donne sur ma machine:
macbook-pro-de-nicolas-martignole:gaetex nicolas$ echo $APPENGINE_HOME /Users/nicolas/Dev/appengine-java-sdk-1.2.1 macbook-pro-de-nicolas-martignole:gaetex nicolas$ grails install-plugin app-engine ... ...
Tester le tout
Vérifions que tout fonctionne en démarrant le serveur Jetty intégré à Grails. Dans le répertoire gaetex, lancez grails:
grails app-engine
Connectez-vous à votre machine (http://localhost:8080/) et vous devriez voir votre première page Grails s’afficher.
Créer une première entité
Nous allons maintenant créer une entité Book, et générer ensuite la partie vue et contrôleur. Avec Google AppEngine, il n’est pas possible de placer ses Entités directement dans le répertoire « grails-app/domain ». Il est nécessaire d’utiliser un package. J’ai donc fait comme Guillaume durant sa démonstration, j’ai créé une entité Book dans le package « demo » avec la commande suivante :
grails create-domain-class demo.Book
Il serait intéressant maintenant d’ajouter deux attributs « title » et « author » à notre Book.
Editez le fichier gaetex/grails-app/domain/demo/Book.groovy avec un éditeur de texte, et ajoutez simplement 2 attributs pour le titre et l’auteur du livre :
package demo import javax.persistence.*; // import com.google.appengine.api.datastore.Key; @Entity class Book { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) Long id // Added by Nicolas Martignole String title String author static constraints = { id visible:false } }
Avec ces deux attributs en place, nous allons maintenant générer un controlleur et tester à nouveau notre application.
Lancez la commande de génération du controleur et des vues:
grails generate-all demo.Book
Puis relancez ensuite le serveur Grails :
grails app-engine
Voici ce que cela donne après avoir créé quelques livres (au logo prêt) :
Vous pouvez retrouver la même chose avec la voix de Guillaume à partir de la minute 50 sur la vidéo YouTube de la présentation.
Déployer son application Grails sur Google AppEngine
Voici la liste des étapes:
1) créer une application sur Google AppEngine
2) modifier le fichier grails-app/conf/Config.groovy et ajouter une ligne avec le nom de votre application
3) packager et préparer l’application
4) effacer un fichier parasite (probleme à résoudre)
5) utiliser le script appCfg.sh pour fournir votre email et votre mot-de-passe Google
6) ensuite simplement mettre à jour avec le plugin google-app-engine de Grails
Voyons en détail chaque étape:
1) Rendez-vous sur « Google AppEngine » afin de faire une demande, puis ensuite de créer votre application. L’application id doit être unique, ce pourra être par exemple testgrails1234
2) Ouvrir le fichier Config.groovy se trouvant dans votre application et définissez l’application id que vous venez de mettre
google.appengine.application="touilleur"
3) Lancer la création du package avec les commandes suivantes:
Il faut fixer la version à un nombre entier car GAE n’accepte pas les numéros de version type x.y.z
grails set-version 1 grails app-engine package
4) Effacer le fichier « datastore-indexes.xml » sans quoi voici l’erreur que vous rencontrerez:
macbook-pro-de-nicolas-martignole:gaetex nicolas$ /Users/nicolas/Dev/appengine-java-sdk-1.2.1/bin/appcfg.sh update target/war Reading application configuration data... Bad configuration: XML error validating target/war/WEB-INF/datastore-indexes.xml against /Users/nicolas/Dev/appengine-java-sdk-1.2.1/docs/datastore-indexes.xsd Caused by: cvc-elt.1: Cannot find the declaration of element 'datastore-indexes'. Please see the logs [/tmp/appcfg16875.log] for further information.
Pour résoudre ce problème, effacez le fichier datastore-indexes.xml avant de relancer la commande appcfg.sh (voir étape suivante)
rm target/war/WEB-INF/datastore-indexes.xml
5) Lancer la première fois seulement la mise à jour avec l’utilitaire appcfg.sh de Google AppEngine comme suit:
$APPENGINE_HOME/bin/appcfg.sh update target/war
Renseigner votre adresse mail Google ainsi que votre mot de passe. Il suffit de mettre son login en fait (mdupont et pas mdupont@gmail.com).
6) Ensuite à chaque fois que vous souhaitez mettre à jour votre application vous pourrez utiliser le plugin de Gae dans Grails, plugin qui ne marche pas la première fois avec l’authentification en se plantant. C’est pour cette raison qu’il faut utiliser l’utilitaire appcfg.sh la première fois.
grails app-engine deploy
Si tout se déroule sans problèmes vous devriez alors mettre en ligne votre première application !!!
L’url de votre application sera http://<applicationid>.appspot.com
Si vous voulez tester un exemple d’application : PetClinic with Grails
Conclusion
Comptez 1h la première fois, puis ensuite 10 minutes pour refaire cet exercice. J’ai été vraiment séduit par la simplicité de Grails, et cette intégration avec Google App Engine. Celui-ci est gratuit jusqu’à un certain nombre de requêtes par jour, et croyez-moi vous avez largement de quoi tester votre code sans devoir payer, toujours dans l’esprit Google.
Je crois vraiment à un nouveau type de développement rapide d’applications, à la monétisation de compétences en Groovy et en Grails. Pour ma part je travaille en ce moment sur une application pour le Touilleur Express, un mix de LinkedIn avec une touche de Google Calendar, un esprit de Geek et bien entendu, toujours la pâte Touilleur Express.
Guillaume Laforge travaille aussi sur Gaelyk, un framework léger qui facilite l’intégration de Google App Engine si vous souhaitez n’écrire qu’en Groovy votre application Web, sans utiliser Grails. Il cite aussi le framework iUI qui est un framework Javascript destiné à faciliter l’écriture d’application pour l’iphone, hébergé sur Internet. Cela revient à ne pas passer par l’AppleStore, à simplement offrir un service type iPhone mais hébergé sur Internet directement.
Références
– Page d’accueil Google App Engine
– Page pour créer sa première application GAE
– Plugin GAE Grails le site à surveiller
– Groovy Web Console permet de taper du Groovy, application Google App Engine
– My Own Groovy par Guillaume Laforge avec quelques applications pour tester
– Portail des applications Google App Engine
Problèmes connus
Il y a un certain nombre de soucis pour l’instant sur le plugin Google App Engine pour Grails au moment où j’écris ces lignes (juin 2009). Ne vous lancez pas dans ce test si vous ne maîtrisez pas un minimum Grails. Je n’ai testé que la version JPA, je ne sais pas si la version JDO est plus ou moins stable.
Pour terminer je vous recommande de regarder la présentation de Guillaume Laforge sur YouTube:
Excellant article/tuto ! Il permet de rentrer dans grails sur GAE en peu de temps et en comprenant.
Pour info, il faut que la personne qui déroule le tuto installe un plugin ui pour avoir un rendu identique. sinon c’est tout moche par défaut.
J’ai testé en mettant grails-ui, ca fonctionne en local mais dès que j’envoie la purée sur google => Max number of files and blobs is 1000
Quel est ton plugin ui ? Ta config en générale ?
Merci
A +
Je n’ai pas installé de plugin ui pour l’instant. Ce n’est pas tout moche avec ma version de Grails 1.1.1, je trouve cela plutôt potable. J’ai juste remplacer le logo de Grails, histoire de m’amuser
J’ai constaté quelques soucis avec les ID générés sur ma version déployée, ce qui me retarde pour bosser dessus.
Mais globalement, très satisfait de la plateforme