1. L’ENT Libre
Retour d’expérience Grails
Franck Silvestre
Toulouse JUG
19/01/2012
Franck Silvestre - 2012, tous droits réservés
2. Qui suis-je ? Où vais je ? ...
Création Fylab ENT Eliot Création Ticetime
1998 2009 2012
1994 2000 2006 2011
Disponibilité Directeur technique
Prof. de maths OMT/Fylab
Maître de Conférence Associé
Université Paul Sabatier
Laboratoire IRIT - équipe SIERA - EIAH
Franck Silvestre - 2012, tous droits réservés w w w.ticetime.com
3. Qui suis-je ? Où vais je ? ...
Création Fylab ENT Eliot Création Ticetime
1998 2009 2012
1994 2000 2006 2011
Disponibilité Directeur technique
Prof. de maths OMT/Fylab
Maître de Conférence Associé
Université Paul Sabatier
Laboratoire IRIT - équipe SIERA - EIAH
franck.silvestre@ticetime.com
Franck Silvestre - 2012, tous droits réservés w w w.ticetime.com
4. Sommaire
• Contexte du projet ENT Libre
- Contexte général
- Éliot
• Introduction technique
- Pourquoi Grails ?
- Architecture du projet
• Focus 2.x
- Grails & Maven, Jackrabbit
• Focus 3.x
- Grails & le Cloud : GitHub, Cloudbees
- Grails & Spring Security, Liquibase, les ressources statiques,
• Sur la productivité, les performances
• Q&R
Franck Silvestre - 2012, tous droits réservés w w w.ticetime.com
5. Sommaire
• Contexte du projet ENT Libre
- Contexte général
- Éliot
• Introduction technique
- Pourquoi Grails ?
- Architecture du projet
• Focus 2.x
- Grails & Maven, Jackrabbit
• Focus 3.x
- Grails & le Cloud : GitHub, Cloudbees
- Grails & Spring Security, Liquibase, les ressources statiques,
• Sur la productivité, les performances
• Q&R
Franck Silvestre - 2012, tous droits réservés w w w.ticetime.com
7. Contexte général
• Environnement Numérique de Travail
• Appel d’offre de la Région Île-de-France en 2009
- 12 à 24 M€ sur 6 ans
- environ 475 lycées
- 1 300 000 comptes ciblés
- Projet Open Source
• Consortium Fylab / Logica / Prosodie / Education &
Territoire
• Depuis 2009
- Région Rhône-Alpes
- CG93, ...
Franck Silvestre - 2012, tous droits réservés w w w.ticetime.com
8. Contexte général
• Environnement Numérique de Travail
• Appel d’offre de la Région Île-de-France en 2009
- 12 à 24 M€ sur 6 ans
- environ 475 lycées
- 1 300 000 comptes ciblés
- Projet Open Source
• Consortium Fylab / Logica / Prosodie / Education &
Territoire
• Depuis 2009
- Région Rhône-Alpes
- CG93, ...
http://lilie.iledefrance.fr/fr/accueil
http://www.lilie.org/
Franck Silvestre - 2012, tous droits réservés w w w.ticetime.com
9. Éliot
• La composante Fylab : l’ENT Eliot
• Services métiers
- cahier de textes
- notes et absences
- espaces de travail
- agenda partagés, emploi du temps
• Quelques chiffres
- environ 20 années hommes
- environ 100 000 LOC Groovy (hors Js, GSP !)
Franck Silvestre - 2012, tous droits réservés w w w.ticetime.com
10. Sommaire
• Contexte du projet ENT Libre
- Contexte général
- Éliot
• Introduction technique
- Pourquoi Grails ?
- Architecture du projet
• Focus 2.x
- Grails & Maven, Jackrabbit
• Focus 3.x
- Grails & le Cloud : GitHub, Cloudbees
- Grails & Spring Security, Liquibase, les ressources statiques,
• Sur la productivité, les performances
• Q&R
Franck Silvestre - 2012, tous droits réservés w w w.ticetime.com
12. Pourquoi Grails ?
Année 2000 +
Java +
Web +
productivité +
=
fun
Franck Silvestre - 2012, tous droits réservés w w w.ticetime.com
13. Pourquoi Grails ?
Année 2000 +
Java +
Web +
productivité +
=
fun
Franck Silvestre - 2012, tous droits réservés w w w.ticetime.com
14. Pourquoi Grails ?
Année 2000 +
Java +
Web +
productivité +
=
fun
Année 2005 +
Open Source +
Web +
productivité +
=
fun
Franck Silvestre - 2012, tous droits réservés w w w.ticetime.com
15. Pourquoi Grails ?
Année 2000 +
Java +
Web +
productivité +
=
fun
Année 2005 +
Open Source +
Web +
productivité +
=
fun
Franck Silvestre - 2012, tous droits réservés w w w.ticetime.com
16. Pourquoi Grails ?
Année 2000 +
Java +
Web +
productivité +
=
fun
Année 2005 +
Open Source +
Web +
productivité +
=
fun
Année 2008 +
=
Java +
Open Source +
Web +
productivité +
fun
Franck Silvestre - 2012, tous droits réservés w w w.ticetime.com
17. Pourquoi Grails ?
Année 2000 +
Java +
Web +
productivité +
=
fun
Année 2005 +
Open Source +
Web +
productivité +
=
fun
Année 2008 +
=
Java +
Open Source +
Web +
productivité +
fun
Franck Silvestre - 2012, tous droits réservés w w w.ticetime.com
18. Pourquoi Grails ?
Année 2000 +
Java +
Web +
productivité +
=
fun
Année 2005 +
Open Source +
Web +
productivité +
=
fun
Année 2008 +
=
Java +
Open Source +
Web +
productivité +
fun
+
Franck Silvestre - 2012, tous droits réservés w w w.ticetime.com
19. Architecture du projet
Éliot- Modules Éliot
Éliot-textes Éliot-docs Éliot-temps Éliot- ...
messagerie
Services commun
Socle Éliot
Accès au socle Lilie Accès aux référentiels Éliot
Référentiel Référentiel
Référentiel
Socle Lilie Éliot Éliot
Éliot métier
messages documents
http://ticetime-blog.blogspot.com/2011/02/presentation-generale-de-grails-et-de.html
Franck Silvestre - 2012, tous droits réservés w w w.ticetime.com
20. Sommaire
• Contexte du projet ENT Libre
- Contexte général
- Éliot
• Introduction technique
- Pourquoi Grails ?
- Architecture du projet
• Focus 2.x
- Grails & Maven, Jackrabbit
• Focus 3.x
- Grails & le Cloud : GitHub, Cloudbees
- Grails & Spring Security, Liquibase, les ressources statiques,
• Sur la productivité, les performances
• Q&R
Franck Silvestre - 2012, tous droits réservés w w w.ticetime.com
22. The mvn «hell»
! Objet : ! question sur le patch de grails-maven-plugin
! Date : ! 13 janvier 2012 12:05:43 HNEC
! À : !Franck Silvestre
Franck Silvestre - 2012, tous droits réservés w w w.ticetime.com
23. The mvn «hell»
! Objet : ! question sur le patch de grails-maven-plugin
! Date : ! 13 janvier 2012 12:05:43 HNEC
! À : !Franck Silvestre
salut franck,
ca va ?
tiens, j'ai une question sur le patch de grails-maven-plugin que t'as fait.
on s'est rendu compte que quand on lance mvn test sur eliot-app-plugin, les testes d'integration se
lancent deux fois (sous la condition que tous les tests passent). sur la console on voit:
[INFO] [grails:maven-test {execution: default-maven-test}]
...
[INFO] [grails:maven-test {execution: default}]
bizarrement ce comportement se manifeste seulement avec le plugin, pas avec les applis eliot.
on a creuse et on a trouve que si on lance mvn grails:test-app, les testes ne se lancent qu'une seule
fois comme il faut. mais cette fois, les testes qui utilisent itext tombent, car il prennent la version
ancienne 2.0.8.
saurais-tu comment patcher le patch, pour qu'il s'applique quand on lance mvn grails:test-app aussi ?
j'ai cherche comment mvn test est lie avec grails-maven-plugin/grails:test-app et je ne l'ai pas trouve.
Franck Silvestre - 2012, tous droits réservés w w w.ticetime.com
24. The mvn «goodbye»
• Migration build Ivy + Gradle + Grails en cours
- Repository et artefacts compatibles Maven conservés
- Plugin Jenkins, Sonar OK
Franck Silvestre - 2012, tous droits réservés w w w.ticetime.com
25. Grails et Jackrabbit - le build
Plugin Grails : Spring DSL
pour injection conditionnelle des
services
Un projet Java/Groovy
«standard»
Franck Silvestre - 2012, tous droits réservés w w w.ticetime.com
26. Jackrabbit - le run
• Stratégie initiale d’exploitation
- «repository server» : accès WebDav
- Résultats catastrophiques : bugs, perfs,...
• Stratégie en cours d’exploitation
- embarqué clusterisé
- Performances aux RDV
Franck Silvestre - 2012, tous droits réservés w w w.ticetime.com
27. Sommaire
• Contexte du projet ENT Libre
- Contexte général
- Éliot
• Introduction technique
- Pourquoi Grails ?
- Architecture du projet
• Focus 2.x
- Grails & Maven, Jackrabbit
• Focus 3.x
- Grails & le Cloud : GitHub, Cloudbees
- Grails & Spring Security, Liquibase, les ressources statiques,
• Sur la productivité, les performances
• Q&R
Franck Silvestre - 2012, tous droits réservés w w w.ticetime.com
28. eliot-tdbase
• Service pédagogique
• Développement Ticetime
• Évolutions
- PIC : Git, Github, Jenkins as a Service, abandon de Maven
- Architecture : découpage plugins plus fin
- Plugins externes utilisés : Spring Security, Resources
- Plugin technique maison : Liquibase
Franck Silvestre - 2012, tous droits réservés w w w.ticetime.com
29. Git, Github et Jenkins As A Service
Github : Repository Git «principal» +
gestion des issues
https://github.com/ticetime/eliot-tdbase
Franck Silvestre - 2012, tous droits réservés w w w.ticetime.com
30. Git, Github et Jenkins As A Service
Github : Repository Git «principal» +
gestion des issues
https://github.com/ticetime/eliot-tdbase
Cloudbees : Jenkins As AService
Build et déploie
Franck Silvestre - 2012, tous droits réservés w w w.ticetime.com
31. Git, Github et Jenkins As A Service
Github : Repository Git «principal» +
gestion des issues
https://github.com/ticetime/eliot-tdbase
Cloudbees : Jenkins As AService
Build et déploie
environnement de démonstration et
repository Maven
http://www.ticetime.com/eliot-tdbase
http://www.ticetime.com/nexus
Franck Silvestre - 2012, tous droits réservés w w w.ticetime.com
32. Découpages plugins
Éliot-tdbase Éliot-...
Éliot-textes- Éliot-notes- Éliot-tdbase-
Eliot-tice-plugin
plugin plugin plugin
Accès aux référentiels Éliot
Référentiel
Référentiel Éliot
Référentiel Éliot métier Éliot
documents
messages
Franck Silvestre - 2012, tous droits réservés w w w.ticetime.com
33. Intégration Spring Security
• Plugin supporté par Spring Source
• Le besoin
- approche RBAC
- gestion d’une authentification par défaut
pouvant évoluer
Franck Silvestre - 2012, tous droits réservés w w w.ticetime.com
34. Spring Security - Concepts clés
• UserDetail
• GrantedAuthority
• UserDetailsService
• SecurityContext
Franck Silvestre - 2012, tous droits réservés w w w.ticetime.com
35. Spring Security - Concepts clés
utilisateur accédant à l’application
• UserDetail
• GrantedAuthority
• UserDetailsService Notion de rôle
• SecurityContext
En charge de la création
d’un UserDetail après
authentification
Encapsule UserDetail et
GrantedAuthority(s) au sein du
thread de traitement de la requête en
cours
Franck Silvestre - 2012, tous droits réservés w w w.ticetime.com
36. Le plugin Spring Security Core
• Installation
• Lancement du script «s2-quickstart»
- créé les classes User, Role et UserRole
- crée les vue et les contrôleurs pour la gestion de
l’authentification
• Utilisation
- configuration des URLs via annotations, mapping statique, mapping
dynamique
- Helper classes SecurityTagLib, SpringSecurityService,
SpringSecurityUtils
- Méthodes ajoutées aux contrôleurs : isLoggedIn, getPrincipal(),
getAutenticatedUser()
Franck Silvestre - 2012, tous droits réservés w w w.ticetime.com
37. L’intégration dans Eliot
• eliot-tice-plugin dépend du plugin spring-security-core
• Pas d’utilisation des classes User, Role et UserRole
• Implémentation d’un UserDetailService ad-hoc
org.lilie.services.eliot.tice.securite.rbac.EliotTiceUser
implémente l'interface UserDetail définie dans Spring Security
org.lilie.services.eliot.tice.securite.rbac.EliotTiceUserDetailsService
implémente l'interface UserDetailService définie dans Spring Security
Franck Silvestre - 2012, tous droits réservés w w w.ticetime.com
38. L’intégration dans Eliot
• Méthodes ajoutées dans les contrôleurs par le plugin eliot
- getAuthenticatedPersonne()
- getAuthenticatedCompteUtilisateur()
- getAuthenticatedAutorite()
Franck Silvestre - 2012, tous droits réservés w w w.ticetime.com
39. L’intégration dans Eliot
• Méthodes ajoutées dans les contrôleurs par le plugin eliot
- getAuthenticatedPersonne()
- getAuthenticatedCompteUtilisateur()
- getAuthenticatedAutorite()
Franck Silvestre - 2012, tous droits réservés w w w.ticetime.com
40. Mise en oeuvre
• Règles de sécurité dans
Config.groovy
Franck Silvestre - 2012, tous droits réservés w w w.ticetime.com
41. Mise en oeuvre
• Règles de sécurité dans
Config.groovy
• Exemple d’utilisation méthode
contrôleur
Franck Silvestre - 2012, tous droits réservés w w w.ticetime.com
42. Grails & Liquibase
• Plugin non retenu au final pour Eliot car
- trop contraignant sur la localisation des fichiers de migration
- trop «lié» à Grails (framework applicatif) pour de la gestion de
structure de base de données
Franck Silvestre - 2012, tous droits réservés w w w.ticetime.com
43. Grails et Liquibase - Approche retenue
• Un projet Gradle dédié à la
gestion de DB migration
Franck Silvestre - 2012, tous droits réservés w w w.ticetime.com
44. Grails et Liquibase - Approche retenue
• Un projet Gradle dédié à la
gestion de DB migration
liquibase
SpringLiquibase
dataSource
changeLog
• Un Service injecté dans les
...
createLiquibase()
...
applications Grails
eliot-tice-plugin
DbMigrationService LiquibaseWrapper
liquibase * 1
updateDb() createLiquibase()
runUpdate()
Franck Silvestre - 2012, tous droits réservés w w w.ticetime.com
45. Grails et Liquibase - Approche retenue
• Exemple dans eliot-tdbase
Dans le fichier «conf/spring/resources.groovy»
Franck Silvestre - 2012, tous droits réservés w w w.ticetime.com
46. Grails et Liquibase - Approche retenue
• Exemple dans eliot-tdbase
Dans le fichier «conf/spring/resources.groovy»
Dans le fichier «conf/BootStrap.groovy»
Franck Silvestre - 2012, tous droits réservés w w w.ticetime.com
47. Grails et la gestion des ressources statiques
• Le plugin «Resources»
• Simple et terriblement efficace
• Optimise la mise à disposition des ressources
statiques
- placement des javascript
- «bundle» de javascript
- ...
Franck Silvestre - 2012, tous droits réservés w w w.ticetime.com
48. Grails et la gestion des ressources statiques
• Le plugin «Resources»
• Simple et terriblement efficace
• Optimise la mise à disposition des ressources
statiques
- placement des javascript
- «bundle» de javascript
- ...
Franck Silvestre - 2012, tous droits réservés w w w.ticetime.com
49. Sommaire
• Contexte du projet ENT Libre
- Contexte général
- Éliot
• Introduction technique
- Pourquoi Grails ?
- Architecture du projet
• Focus 2.x
- Grails & Maven, Jackrabbit
• Focus 3.x
- Grails & le Cloud : GitHub, Cloudbees
- Grails & Spring Security, Liquibase, les ressources statiques,
• Sur la productivité, les performances
• Q&R
Franck Silvestre - 2012, tous droits réservés w w w.ticetime.com
50. Sur la productivité
• Contexte opérationnel ENT Libre extrêmement contraint
- L’opérationnel est «plus fort» que la technique
• Grails augmente la productivité des seniors et des juniors
• Mais
- si pas de senior très présent dans l’équipe qui encadre : «Vietnam Hibernate»
garanti !
• Un framework «full stack», quel qu’il soit, nécessite
- la compréhension et éventuellement la maîtrise des six couches applicatives
- investissement colossal pour tout développeur
- Grails/Play/ WebObjects ne résoudront jamais le problème du N+1 Select...
Franck Silvestre - 2012, tous droits réservés w w w.ticetime.com
51. Sur les performances
• Les performances vis à vis de Grails ont été un «non sujet»
• Les optimisations nécessaires ont portées sur
- les vues ExtJs
- l’exploitation Jackrabbit
- Le problème du N+1 Select
• Grails n’a jamais été mis en cause directement
Franck Silvestre - 2012, tous droits réservés w w w.ticetime.com
52. Idées en vrac
• Statique vs Dynamique
- critère négligeable concernant la question de la qualité
- Rappel: RoR, WebObjects, Application MacOs, IOs natives,... c’est
du dynamique !
- Un langage de programmation est un moyen d’expression
Franck Silvestre - 2012, tous droits réservés w w w.ticetime.com
53. Idées en vrac
• Statique vs Dynamique
- critère négligeable concernant la question de la qualité
- Rappel: RoR, WebObjects, Application MacOs, IOs natives,... c’est
du dynamique !
- Un langage de programmation est un moyen d’expression
« Les limites de mon langage signifient les limites de mon propre monde »
Wittgenstein
Franck Silvestre - 2012, tous droits réservés w w w.ticetime.com
54. Sommaire
• Contexte du projet ENT Libre
- Contexte général
- Éliot
• Introduction technique
- Pourquoi Grails ?
- Architecture du projet
• Focus 2.x
- Grails & Maven, Jackrabbit
• Focus 3.x
- Grails & le Cloud : GitHub, Cloudbees
- Grails & Spring Security, Liquibase, les ressources statiques,
• Sur la productivité, les performances
• Q&R
Franck Silvestre - 2012, tous droits réservés w w w.ticetime.com