Projet

Général

Profil

DeveloppementBonnesPratiques » Historique » Version 7

Lionel Morin, 22/09/2016 11:05

1 7 Lionel Morin
h1. EOLE - Étude prospective pour les futurs développements
2 7 Lionel Morin
3 7 Lionel Morin
h2. Objectif du document
4 7 Lionel Morin
5 7 Lionel Morin
   * Établir un état des lieux des applicatifs et des méthodologies existants dans l'environnement EOLE actuel
6 7 Lionel Morin
   * Définir un référentiel commun pour réaliser un comparatif « objectif » de solutions techniques pour les futurs développements
7 7 Lionel Morin
   * Énumérer les bonnes pratiques méthodologiques et prioriser leur mise en place afin d'améliorer les processus de développement, indépendamment des solutions techniques sélectionnées
8 7 Lionel Morin
9 7 Lionel Morin
h2. État des lieux
10 7 Lionel Morin
11 7 Lionel Morin
h3. Applicatif
12 7 Lionel Morin
13 7 Lionel Morin
> EAD
14 7 Lionel Morin
> * Gestion de profil / autorisation d'utilisateur (bdd)
15 7 Lionel Morin
> * Gestion de ressources (imprimantes, partage, utilisateurs, ACL, ...)
16 7 Lionel Morin
> * Exécution de script sur le serveur
17 7 Lionel Morin
> * Intégration d'applications distantes
18 7 Lionel Morin
> * Observation de poste à distance
19 7 Lionel Morin
> * Configuration du serveur (vnc, proxy, règles optionnelles d'ERA, cron, ...)
20 7 Lionel Morin
> * Accès SSH à distance
21 7 Lionel Morin
22 7 Lionel Morin
> Genconfig
23 7 Lionel Morin
> * Gestion de la configuration EOLE
24 7 Lionel Morin
> * Génération automatique de formulaire à partir d'un fichier de description en XML
25 7 Lionel Morin
26 7 Lionel Morin
> Zéphir
27 7 Lionel Morin
> * Fonctionnalités actuelles
28 7 Lionel Morin
> ** Gestion d'une base de serveurs/modules EOLE
29 7 Lionel Morin
> ** Authentification/autorisation avec contrôle des ressources par profil
30 7 Lionel Morin
> ** Gestion de statistiques système / logs / reporting d'état (mail/appli)
31 7 Lionel Morin
> ** Gestion de configurations /variantes de configuration (saisie/déploiement)
32 7 Lionel Morin
> ** API de récupération des informations (utilisé par ARV/ERA/scripts utilisateur...)
33 7 Lionel Morin
> ** Enrôlement des serveurs
34 7 Lionel Morin
> ** Exécution d'actions et transfert de fichiers à distance (sécurisé)
35 7 Lionel Morin
> * Évolutions bloquées
36 7 Lionel Morin
> ** Plusieurs serveurs Zéphir en 'cascade' (hiérarchie de backends. par ex: national/académique/établissement)
37 7 Lionel Morin
> ** Utilisation de plusieurs processeurs / backend séparés en plusieurs processus (pb lié à twisted/python)
38 7 Lionel Morin
> ** Interface plus dynamique (carte avec Géolocalisation des serveurs, ...)
39 7 Lionel Morin
    
40 7 Lionel Morin
> EoleSSO
41 7 Lionel Morin
> * Support de protocoles spécifiques (CAS, SAML, OpenID, ...)
42 7 Lionel Morin
> * Gestion session
43 7 Lionel Morin
> * Envoi d'attributs utilisateur avec filtre en fonction de la destination
44 7 Lionel Morin
45 7 Lionel Morin
> ARV
46 7 Lionel Morin
> * Gestion de ressources (serveurs, tunnels, bdd, ...)
47 7 Lionel Morin
> * Envoi d'archive de configuration à Zéphir
48 7 Lionel Morin
49 7 Lionel Morin
h3. Domaines techniques et fonctionnels récurrents
50 7 Lionel Morin
51 7 Lionel Morin
La liste ci dessous doit servir de référentiel afin d'effectuer le comparatif des solutions proposées dans la section suivante.
52 7 Lionel Morin
53 7 Lionel Morin
   * Opérations de gestion du cycle de vie d'un compte utilisateur système ou LDAP (CRUD, changement de mot de passe...)
54 7 Lionel Morin
   * Interaction avec le système de fichier
55 7 Lionel Morin
   * Import/export de données au format CSV, XML
56 7 Lionel Morin
   * Stockage de données et recherche/filtrage de ces données
57 7 Lionel Morin
   * Exécution de commandes systèmes et gestion des entrées/sorties
58 7 Lionel Morin
   * Rapports sur l'état du système hôte
59 7 Lionel Morin
   * Envoi de courriel
60 7 Lionel Morin
   * Authentification CAS / LDAP / Système
61 7 Lionel Morin
   * Gestion des droits d'accès en fonction du profil utilisateur
62 7 Lionel Morin
   
63 7 Lionel Morin
h3. Méthodologique
64 7 Lionel Morin
65 7 Lionel Morin
> Ce qui existe
66 7 Lionel Morin
> * Séparation du code et de l’empaquetage
67 7 Lionel Morin
> * Versionning des applications avec une branche par distribution EOLE
68 7 Lionel Morin
> * Coding standard (syntaxe python)    
69 7 Lionel Morin
    
70 7 Lionel Morin
> Éléments bloquants rencontrés
71 7 Lionel Morin
> * Manque de référentiel technique (cadre à respecter)
72 7 Lionel Morin
> * Absence de revue de code
73 7 Lionel Morin
> * Pas de refactoring de code
74 7 Lionel Morin
> * Manque de tests unitaires / fonctionnels
75 7 Lionel Morin
> * Exécution automatique des tests
76 7 Lionel Morin
> * Pas de documentation technique
77 7 Lionel Morin
> * Recherche dans l’historique du code très complexe, impossible d’utiliser **git bisect**
78 7 Lionel Morin
   
79 7 Lionel Morin
h3. Exigences particulières
80 7 Lionel Morin
81 7 Lionel Morin
   * Réutilisabilité du code (composant, éléments d'application, ...)
82 7 Lionel Morin
   * Facilités de création des formulaires
83 7 Lionel Morin
   * Automatisation de la validation des entrées
84 7 Lionel Morin
   * Séparation / indépendance des différents services
85 7 Lionel Morin
   * Appel à distance (gateway)
86 7 Lionel Morin
   
87 7 Lionel Morin
h2. Étude comparative des langages/pile web "backend"
88 7 Lionel Morin
89 7 Lionel Morin
La définition des pours et contres de chaque proposition doit s'effectuer en prenant compte:
90 7 Lionel Morin
91 7 Lionel Morin
   * De l'état actuel de la base de code des applicatifs
92 7 Lionel Morin
   * Des compétences disponibles dans l'équipe
93 7 Lionel Morin
   * De l'écosystème technique EOLE existant
94 7 Lionel Morin
   
95 7 Lionel Morin
h3. NodeJS / Express
96 7 Lionel Morin
97 7 Lionel Morin
https://nodejs.org/en/
98 7 Lionel Morin
http://expressjs.com/
99 7 Lionel Morin
100 7 Lionel Morin
> Pros
101 7 Lionel Morin
> * Communauté très active, couverture fonctionnelle très importante
102 7 Lionel Morin
> * Très performant pour les usages courant du web
103 7 Lionel Morin
> * Ubiquité du langage (backend, frontend, desktop, mobile)
104 7 Lionel Morin
> * Version LTS de 5 ans (3 ans + 2 ans maintenance)
105 7 Lionel Morin
> * Outillage avancé
106 7 Lionel Morin
107 7 Lionel Morin
> Cons
108 7 Lionel Morin
> * Technologie "jeune" avec rythme d'évolution très rapide
109 7 Lionel Morin
> * Hyper-modularisation (risque de multiplication des dépendances)
110 7 Lionel Morin
> * Stabilité erratique des modules communautaires
111 7 Lionel Morin
> * Fonctionnalités du langage restreintes
112 7 Lionel Morin
> * Gestion de l'asynchrone parfois complexe ("callback hell", Promise ou Callbacks ?)
113 7 Lionel Morin
> * Nécessite des formations, une phase d'amorçage et des intervenants externes pour un démarrage dans de bonnes conditions
114 7 Lionel Morin
115 7 Lionel Morin
h3. Flask (Python)
116 7 Lionel Morin
117 7 Lionel Morin
Flask est un micro-framework de développement web pour Python. 
118 7 Lionel Morin
http://flask.pocoo.org/
119 7 Lionel Morin
120 7 Lionel Morin
> Pros
121 7 Lionel Morin
> * Framework léger et robuste, facile à appréhender
122 7 Lionel Morin
> * API minimaliste et stable
123 7 Lionel Morin
> * Nombreuses extensions référencées et documentées
124 7 Lionel Morin
> * Client spécifique destiné aux tests
125 7 Lionel Morin
> * Base de code existante en python (lib EOLE et eole-flask)
126 7 Lionel Morin
> * Librairies facilitant les interactions avec le système (couches métier EOLE)
127 7 Lionel Morin
> * Langage Python déjà utilisé au quotidien par l'équipe
128 7 Lionel Morin
129 7 Lionel Morin
> Cons
130 7 Lionel Morin
> * Envisager le passage à Python 3
131 7 Lionel Morin
> * Pas de code commun entre backend et frontend
132 7 Lionel Morin
133 7 Lionel Morin
h3. Perl / Dancer2
134 7 Lionel Morin
135 7 Lionel Morin
Perl a bien évolué depuis les années 90 où il était **le** langage du Web (http://techbeacon.com/perl-not-dead-it-was-early-web-novices-gave-it-bad-name et https://dzone.com/articles/perl-language-community-and-the-future)
136 7 Lionel Morin
137 7 Lionel Morin
> Pros
138 7 Lionel Morin
> * Langage mature et évoluant (une nouvelle release par an)
139 7 Lionel Morin
> * Très grande culture du test
140 7 Lionel Morin
> * Très grande culture de la documentation (POD)
141 7 Lionel Morin
> * Coding standard modernes ("Modern Perl":http://onyxneon.com/books/modern\_perl/)
142 7 Lionel Morin
> * Mode d’opération simple en serveur d’application (type FCGI)
143 7 Lionel Morin
> * Écosystème gigantesque (MetaCPAN.org) avec un soucis de gestion des compatibilités/changements
144 7 Lionel Morin
> * Utilisé sur des grosses productions (Booking.com, IMDb, DuckDuckGo, Slashdot, Ticketmaster https://en.wikipedia.org/wiki/Perl\_language#Applications)
145 7 Lionel Morin
146 7 Lionel Morin
> Cons
147 7 Lionel Morin
> * Nécessite des formations, une phase d’amorçage et des intervenants externes pour un démarrage dans de bonnes conditions
148 7 Lionel Morin
149 7 Lionel Morin
h3. PHP / ??
150 7 Lionel Morin
151 7 Lionel Morin
\url{http://www.php.net/}
152 7 Lionel Morin
153 7 Lionel Morin
    Pros
154 7 Lionel Morin
155 7 Lionel Morin
156 7 Lionel Morin
   * Mode d'opération/déploiement simple (modèle CGI, pas de processus avec un long temps de vie, ou FCGI avec php-fpm)
157 7 Lionel Morin
   * Gestion de la pile HTTP déportée dans un serveur hôte (Nginx, Apache2, lighttpd...)
158 7 Lionel Morin
   * Fonctionnalités du langage avancées (namespace, classes, interfaces, mixins...)
159 7 Lionel Morin
    Cons
160 7 Lionel Morin
161 7 Lionel Morin
162 7 Lionel Morin
   * Relativement moins performant comparativement aux autres solutions (moins vrai avec l'arrivée de PHP 7)
163 7 Lionel Morin
   * API native surchargée (plusieurs manières de faire la même chose)
164 7 Lionel Morin
   * Généralisation de l'usage de NodeJS dans les pipelines d'intégration des ressources statiques dans les frameworks
165 7 Lionel Morin
   * Gestion synchrone des entrées/sorties
166 7 Lionel Morin
   * Principalement orienté web, moins bonne couverture fonctionnelle que les autres solutions en dehors de ce cas d'usage
167 7 Lionel Morin
   * Quelques compétences en interne mais nécessite tout de même des formations et de l'accompagnement pour le lancement
168 7 Lionel Morin
h3. NodeJS/Meteor
169 7 Lionel Morin
170 7 Lionel Morin
h2. Étude comparative des piles web "frontend"
171 7 Lionel Morin
172 7 Lionel Morin
h3. Angular 1
173 7 Lionel Morin
174 7 Lionel Morin
\url{https://angularjs.org/}
175 7 Lionel Morin
176 7 Lionel Morin
    Pros
177 7 Lionel Morin
178 7 Lionel Morin
179 7 Lionel Morin
   * Double data-binding (rapidité de développement)
180 7 Lionel Morin
   * Multiples modules communautaires (routage, gestion des formulaires, etc)
181 7 Lionel Morin
   * Formation déjà effectuée et compétences internes
182 7 Lionel Morin
    Cons
183 7 Lionel Morin
184 7 Lionel Morin
185 7 Lionel Morin
   * Version 2 d'Angular en phase de release (temps de support restant ?)
186 7 Lionel Morin
   * Framework non dirigiste (risque de code spaghetti), nécessite une bonne discipline
187 7 Lionel Morin
h3. Angular 2
188 7 Lionel Morin
189 7 Lionel Morin
\url{https://angular.io}
190 7 Lionel Morin
191 7 Lionel Morin
    Pros
192 7 Lionel Morin
193 7 Lionel Morin
    Cons
194 7 Lionel Morin
195 7 Lionel Morin
196 7 Lionel Morin
h3. Mithril
197 7 Lionel Morin
198 7 Lionel Morin
\url{http://mithril.js.org/}
199 7 Lionel Morin
200 7 Lionel Morin
TODO
201 7 Lionel Morin
202 7 Lionel Morin
    Pros
203 7 Lionel Morin
204 7 Lionel Morin
205 7 Lionel Morin
   * Framework léger et facile à appréhender
206 7 Lionel Morin
   * utilise uniquement javascript (facilité de debuggage/mise en place de tests)
207 7 Lionel Morin
   * Wiki communautaire (projets/outils/bonnes partiques) \url{https://github.com/lhorie/mithril.js/wiki}
208 7 Lionel Morin
   * rendu rapide comparé aux librairies angular/react...
209 7 Lionel Morin
   * Solution clé en main (gestion Ajax, St Marc et canard WC)
210 7 Lionel Morin
   * Bonne documentation
211 7 Lionel Morin
    Cons
212 7 Lionel Morin
213 7 Lionel Morin
214 7 Lionel Morin
   * Nécessite une certaine connaissance de javacript (pas de templates html, mais des libs existent pour contourner)
215 7 Lionel Morin
   * Framework non dirigiste (plusieurs approches dans l'organisation des modèles/vues/contrôleur, pas d'outils de tests intégrés)
216 7 Lionel Morin
   * prévu seulement pour le côté client
217 7 Lionel Morin
h3. Riot
218 7 Lionel Morin
219 7 Lionel Morin
Micro-librairie de construction d'interface web à la manière de React
220 7 Lionel Morin
\url{http://riotjs.com/}
221 7 Lionel Morin
222 7 Lionel Morin
    Pros
223 7 Lionel Morin
224 7 Lionel Morin
225 7 Lionel Morin
   * Utilisation de tags HTML personnalisés
226 7 Lionel Morin
   * Syntaxe simple et puissante
227 7 Lionel Morin
   * DOM Virtuel
228 7 Lionel Morin
   * Faible poids par rapport à React ou Angular
229 7 Lionel Morin
    Cons
230 7 Lionel Morin
231 7 Lionel Morin
232 7 Lionel Morin
   * Librairie ne gérant pas les requêtes XHR
233 7 Lionel Morin
   * Nécessité de compiler le code
234 7 Lionel Morin
h3. WebComponents (Polymer / X-Tag)
235 7 Lionel Morin
236 7 Lionel Morin
\url{https://github.com/x-tag/core}
237 7 Lionel Morin
\url{https://www.polymer-project.org/1.0/}
238 7 Lionel Morin
239 7 Lionel Morin
240 7 Lionel Morin
TODO
241 7 Lionel Morin
242 7 Lionel Morin
    Pros
243 7 Lionel Morin
244 7 Lionel Morin
245 7 Lionel Morin
   * Définition de tags HTML personnalisés
246 7 Lionel Morin
   * Construction de composants d’interfaces par composition
247 7 Lionel Morin
   * Composants utilisables indépendamment des frameworks
248 7 Lionel Morin
   * Bibliothèque de composants prêts à l'emploi (elements.polymer-project.org)
249 7 Lionel Morin
    Cons
250 7 Lionel Morin
251 7 Lionel Morin
252 7 Lionel Morin
   * Framework non dirigiste
253 7 Lionel Morin
   * pas d'automatisation des appels Ajax (voir librairie fetch : \url{https://github.com/github/fetch)}
254 7 Lionel Morin
   * 
255 7 Lionel Morin
256 7 Lionel Morin
h2. Méthodologie de développement
257 7 Lionel Morin
258 7 Lionel Morin
h3. Style de code commun
259 7 Lionel Morin
260 7 Lionel Morin
261 7 Lionel Morin
   * Établir un standard de code par langage de programmation
262 7 Lionel Morin
   * Éditor config : définir la configuration des éditeurs de texte, une configuration pour tous les éditeurs
263 7 Lionel Morin
Priorisation:
264 7 Lionel Morin
265 7 Lionel Morin
   1. Écrire le document style de code
266 7 Lionel Morin
   1. Automatiser la vérification (côté développeur / côté serveur)
267 7 Lionel Morin
h3. Développement piloté par les tests
268 7 Lionel Morin
269 7 Lionel Morin
Le Test driven development (\url{https://fr.wikipedia.org/wiki/Test\_Driven\_Development)} préconise d’écrire les tests unitaires avant d’écrire le code source:
270 7 Lionel Morin
271 7 Lionel Morin
272 7 Lionel Morin
   1. Écrire un premier test ;
273 7 Lionel Morin
   1. Vérifier qu'il échoue (car le code qu'il teste n'existe pas), afin de vérifier que le test est valide ;
274 7 Lionel Morin
   1. Écrire juste le code suffisant pour passer le test ;
275 7 Lionel Morin
   1. Vérifier que le test passe ;
276 7 Lionel Morin
   1. Puis réusiner le code, c'est-à-dire l'améliorer tout en gardant les mêmes fonctionnalités.
277 7 Lionel Morin
Priorisation:
278 7 Lionel Morin
279 7 Lionel Morin
   1. Définir les frameworks de test et la couverture de test
280 7 Lionel Morin
   1. Automatisation côté développeur
281 7 Lionel Morin
   1. Automatisation côté serveur
282 7 Lionel Morin
h3. Développement piloté par les fonctionnalités
283 7 Lionel Morin
284 7 Lionel Morin
L’utilisation de la méthode agile SCRUM permet :
285 7 Lionel Morin
286 7 Lionel Morin
287 7 Lionel Morin
   * de se focaliser sur les fonctionnalités demandées par l’utilisateur final.
288 7 Lionel Morin
   * d’avoir des retours rapides de l’utilisateur sur les fonctionnalités implémentées
289 7 Lionel Morin
Priorisation:
290 7 Lionel Morin
291 7 Lionel Morin
   1. Réviser l'écriture des scénarios (une fonctionnalité = un scénario)
292 7 Lionel Morin
h3. Documentation d’API automatique
293 7 Lionel Morin
294 7 Lionel Morin
295 7 Lionel Morin
   * Génération de la documentation d'API depuis le code
296 7 Lionel Morin
       * API Métier (librairies)
297 7 Lionel Morin
       * API REST
298 7 Lionel Morin
       * API Frontend (composants / services)
299 7 Lionel Morin
   * Cette génération doit être faite de façon automatique dans le processus de livraison/compilation
300 7 Lionel Morin
   * Cette documentation doit être mise à disposition de la communauté (paquet **-doc** et site en ligne)
301 7 Lionel Morin
Priorisation:
302 7 Lionel Morin
303 7 Lionel Morin
   1. Définir les frameworks de documentation
304 7 Lionel Morin
   1. Automatiser la génération (côté développeur)
305 7 Lionel Morin
   1. Automatiser la génération (coté serveur, phase release + diffusion)
306 7 Lionel Morin
h3. Modèle de développement avec Git
307 7 Lionel Morin
308 7 Lionel Morin
Utiliser le modèle de développement  Gitflow (\url{http://nvie.com/posts/a-successful-git-branching-model/)}.
309 7 Lionel Morin
310 7 Lionel Morin
La version AVH (\url{https://github.com/petervanderdoes/gitflow-avh)} du logiciel **gitflow** est celle fournie par défaut sur Debian et Ubuntu, elle est maintenue contrairement à la version originelle.
311 7 Lionel Morin
312 7 Lionel Morin
En résumé:
313 7 Lionel Morin
314 7 Lionel Morin
315 7 Lionel Morin
   * Chaque fonctionnalité est développée dans une branche dédiée (**feature/foo-bar**)
316 7 Lionel Morin
   * Chaque fonctionnalité est intégrée à la branche d’intégration :
317 7 Lionel Morin
       * Si les tests passent
318 7 Lionel Morin
       * Après une relecture/validation du code (Gerrit)
319 7 Lionel Morin
   * La préparation d’une livraison se fait sur une branche dédiée issue de la branche d’intégration (**release/1.2**)
320 7 Lionel Morin
   * La branche **release/**, une fois prête, est fusionnée à la branche de production et un tag de release est créé
321 7 Lionel Morin
Priorisation:
322 7 Lionel Morin
323 7 Lionel Morin
   1. Mise en place de git flow (formation ?, document référent, définition de la configuration par défaut)
324 7 Lionel Morin
h3. Qualité du code
325 7 Lionel Morin
326 7 Lionel Morin
Des processus automatiques doivent être mis en place afin d’assurer une bonne qualité du code produit :
327 7 Lionel Morin
328 7 Lionel Morin
   * S’assurer que le code correspond au coding standard du projet (PyLint / Perl::Critic / JSLint)
329 7 Lionel Morin
   * S’assurer que le code est couvert par des tests unitaires
330 7 Lionel Morin
   * S’assurer que  l'API est documentée
331 7 Lionel Morin
h3. Intégration continue
332 7 Lionel Morin
333 7 Lionel Morin
334 7 Lionel Morin
   * Intégration continue : exécution automatique des tests fonctionnels et unitaires (jenkins)
335 7 Lionel Morin
h3. Déploiement d'environnements de Dev (Vagrant?)