WALLABAG : COMMENT ON A MIGRÉ VERS
SYMFONY 3
Par Jérémy Benoist ( ) et Nicolas Lœuillet ( )@j0k @nicosomb
wallabag.org
wallabag : comment on a migré vers Symfony 3 — PHP Tour 2016 — @j0k & @nicosomb
NOUS DEUX
Jérémy Benoist
lead developer chez 20minutes
Nicolas Lœuillet
développeur chez Smile
PLAN
Historique
Etat des lieux
La migration
Les étapes en cours et à venir
FONCTIONNALITÉS ET HISTOIRE
CE QUE ÇA FAIT
HISTOIRE
POURQUOI ÇA N'ÉTAIT PAS MIEUX AVANT
PREMIÈRE VERSION DE "WALLABAG"
ENVIRONNEMENT PHP
PHP >= 5.3.3
Pas de framework
Des classes PHP de plusieurs centaines de lignes
LACUNES TECHNIQUES
Dépendances versionnées
Pas d'API
Pas de tests
Pas de PR par l'équipe
MAJ BDD manuelle
Déploiement manuel via Filezilla
Équipe de deux personnes
FRÉQUENCE DES MISES À JOUR
Pas de calendrier dé ni
10 versions mineures en deux ans
Pas de vrai respect de SEMVER
POURQUOI C'EST MIEUX MAINTENANT
DEUXIÈME VERSION DE WALLABAG
ENVIRONNEMENT PHP
PHP >= 5.5.9
Compatible PHP 7
Compatible HHVM (même si personne ne s'en sert)
Symfony 3
ON COMBLE LES LACUNES TECHNIQUES
Sorte de De nition of Done :
Documentation utilisateur
Tests unitaires et / ou fonctionnels
Review du code
Déploiement via Capistrano (sur v2.wallabag.org)
Migrations BDD
Le moins d'actions manuelles possible
Équipe plus conséquente : une core team, des traducteurs,
des développeurs
FRÉQUENCE DES MISES À JOUR
Roadmap établie
Respect de SEMVER
Une version mineure tous les 3 mois
API POUR LES APPLICATIONS EXTERNES
Facilite l'intégration avec des applications tierces
QUELQUES BENCHMARKS
ANALYSE DU CODE
v1 v2
Fichiers 396 129
Code 94.922 lignes
240 lignes / chier
8.822 lignes
68 lignes / chier
Commentaires 37.855 lignes 2.462 lignes
Sensio Insight 29/100
2 ans pour la
médaille Platinum
32/100
3 semaines pour la
médaille Platinum
Scrutinizer 4,95/10
(1 erreur critique,
+700 majeures)
9,39/10
(4 erreurs majeures)
CHARGEMENT DES PAGES
Analyses faites avec Black re sur PHP 7.0.6
v1 v2
Liste d'articles (460) 330ms
17 Mo
689ms
31 Mo
Un article 89ms
10 Mo
281ms
17 Mo
Liste des tags (20) 85ms
10 Mo
314ms
19 Mo
EN CONCLUSION ...
C'est pas très fameux pour la v2 tout ça !
Un framework, c'est lourd
Le plain PHP c'est forcément rapide
Pas trop focalisé sur la perf, pour le moment
Plusieurs pistes d'améliorations (Redis, APC, Black re, etc.)
Surtout un confort de développement pour les devs
EN ROUTE POUR LA V2 !
LE CHOIX DU FRAMEWORK
EXTRACTION DE CONTENU
LA principale fonctionnalité de wallabag
Assuré par , dans la v1
Pas vraiment open source ...
Et pas très pratique à utiliser ...
Full-Text RSS
// $ftr should be URL where you installed this application
$ftr = 'http://example.org/full-text-rss/';
$article = 'http://www.bbc.co.uk/news/world-europe-21936308';
$request = $ftr.'makefulltextfeed.php?format=json&url='.$article;
// Send HTTP request and get response
$result = @file_get_contents($request);
EXTRACTION DE CONTENU
MAIS, sa capacité d'extraction est ef cace !
Utilise le microformat
Utilise les données de
Basée sur php-readability
Et sur des site_con g (dans un repo séparé)
hNews
Schema.org
➜ Forker en gardant cette logique
EXTRACTION DE CONTENU
, un fork de Full-Text RSS v3.3graby
Mise en place de test fonctionnels sur l'existant
Ré-organisation / refonte
site_con g via Composer
Ajout de tests
Et c'est plus propre à utiliser ...
use GrabyGraby;
$article = 'http://www.bbc.co.uk/news/world-europe-21936308';
$graby = new Graby();
$result = $graby->fetchContent($article);
LA MIGRATION EN SOI
Par itération
Le socle Symfony
La connexion utilisateur
La con guration
La commande wallabag:install
L'ajout d'un lien
L'ajout de tags
Etc.
Globalement, tout a été réécrit, étape par étape
LA V2 N'EST PAS ISO AVEC LA V1
v2.0.0 ➜ focaliser sur le fonctionnement de base
v2.0.x ➜ focaliser sur la stabilité
v2.x ➜ amélioration des fonctionnalités (tag,
recherche, etc.)
LIBRAIRIES UTILISÉES POUR L'API
FOSRestBundle
NelmioCorsBundle
FOSOAuthServerBundle
BazingaHateoasBundle
NelmioApiDocBundle
Si seulement était sorti plus tôt :)API Platform 2.0
LISTING DES FEATURES PAR LIBRAIRIE
Utilisateur ➜ FosUserBundle
Filtres ➜ FormFilterBundle
Changement de thème ➜ LiipThemeBundle
Export ➜ phpepub, tcpdf, php-mobi
Règle de tagging ➜ RulerZ ( @KPhoen)
Maintenance ➜ MaintenanceBundle
Two factor authentication ➜ TwoFactorBundle
Annotations ➜ AnnotatorJS
LES DIFFICULTÉS
INSTALLATION DE L'APPLICATION
L'application doit être disponible pour tout le monde !
sur un serveur dédié
sur un serveur mutualisé
sur un ... raspberry (c'est pas gagné ...)
Et installable par tout le monde
"tout le monde" inclut des personnes novices
INSTALLATION DE L'APPLICATION
Deux solutions choisies :
Via une archive incluant les dépendances
Via Git & Composer
INSTALLATION DE L'APPLICATION
Plutôt basique pour la v1
wget http://wllbg.org/latest
unzip latest
+ quelques lignes de SQL
Dans l'ensemble aucun souci ✅
INSTALLATION DE L'APPLICATION
Tentative n°1
git clone https://github.com/wallabag/wallabag.git -b v2
cd wallabag
composer install
php app/console wallabag:install
Trop orienté dev
Installe toutes les deps "dev"
C'était bien au début ™
INSTALLATION DE L'APPLICATION
Tentative n°2
composer create-project wallabag/wallabag wallabag 2.0.0-alpha.1
cd wallabag
php app/console wallabag:install
Toujours trop orienté dev
Simple amélioration de la version précédente
INSTALLATION DE L'APPLICATION
Tentative n°3
SYMFONY_ENV=prod composer create-project wallabag/wallabag 
wallabag "2.0.*@alpha" --no-dev
cd wallabag
php app/console wallabag:install --env=prod
Uniquement les packages de prod
MAJ impossible à cause de create-project
INSTALLATION DE L'APPLICATION
Tentative n°4 (l'actuelle)
git clone git@github.com:wallabag/wallabag.git
cd wallabag
git checkout 2.0.4
SYMFONY_ENV=prod composer install --no-dev -o --prefer-dist
php app/console wallabag:install --env=prod
Toujours bien en version de prod
Facilite la mise à jour (par les tags)
Mais toujours des soucis de mémoire
AUTRES DIFFICULTÉS
Les migrations de données SQLite
Les demandes de site_con g
Les issues de personnes pas très techniques
LES ÉTAPES EN COURS
LES ÉTAPES EN COURS
RabbitMQ, pour les gros traitements
Elasticsearch ( @damienalexandre)
Dockerization par @JoliCode en salle C
Gérer les dépendances CSS et JS via
API : INTÉGRATIONS DÉJÀ RÉALISÉES
: clone libre de IFTTTTrigger-Happy.eu
github.com/foxmask/django-th
@TriggerHappyEu
API : INTÉGRATIONS DÉJÀ RÉALISÉES
Application Windows Phone (Android et iOS en cours de
réalisation)
Addon pour Firefox
: plugin pour ajouter dans wallabag
depuis Tiny Tiny RSS
Librairies , et
ttrss-to-wallabag-v2
Python Java .NET
API : INTÉGRATIONS SOUHAITÉES
Cozy Cloud
ownCloud
Fabricants de liseuses
Firefox, Gnome (pour remplacer Pocket)
LES ÉTAPES À VENIR
TO INFINITY... AND BEYOND
Un front en React
Une solution SaaS
Intégration dans des applis tierces
Reeder
IFTTT
Etc.
MERCI !
DES QUESTIONS ?

wallabag, comment on a migré vers symfony3

  • 1.
    WALLABAG : COMMENTON A MIGRÉ VERS SYMFONY 3 Par Jérémy Benoist ( ) et Nicolas Lœuillet ( )@j0k @nicosomb wallabag.org wallabag : comment on a migré vers Symfony 3 — PHP Tour 2016 — @j0k & @nicosomb
  • 2.
    NOUS DEUX Jérémy Benoist leaddeveloper chez 20minutes Nicolas Lœuillet développeur chez Smile
  • 3.
    PLAN Historique Etat des lieux Lamigration Les étapes en cours et à venir
  • 4.
  • 5.
  • 6.
  • 7.
    POURQUOI ÇA N'ÉTAITPAS MIEUX AVANT
  • 8.
  • 9.
    ENVIRONNEMENT PHP PHP >=5.3.3 Pas de framework Des classes PHP de plusieurs centaines de lignes
  • 10.
    LACUNES TECHNIQUES Dépendances versionnées Pasd'API Pas de tests Pas de PR par l'équipe MAJ BDD manuelle Déploiement manuel via Filezilla Équipe de deux personnes
  • 11.
    FRÉQUENCE DES MISESÀ JOUR Pas de calendrier dé ni 10 versions mineures en deux ans Pas de vrai respect de SEMVER
  • 12.
  • 13.
  • 14.
    ENVIRONNEMENT PHP PHP >=5.5.9 Compatible PHP 7 Compatible HHVM (même si personne ne s'en sert) Symfony 3
  • 15.
    ON COMBLE LESLACUNES TECHNIQUES Sorte de De nition of Done : Documentation utilisateur Tests unitaires et / ou fonctionnels Review du code Déploiement via Capistrano (sur v2.wallabag.org) Migrations BDD Le moins d'actions manuelles possible Équipe plus conséquente : une core team, des traducteurs, des développeurs
  • 16.
    FRÉQUENCE DES MISESÀ JOUR Roadmap établie Respect de SEMVER Une version mineure tous les 3 mois
  • 17.
    API POUR LESAPPLICATIONS EXTERNES Facilite l'intégration avec des applications tierces
  • 18.
  • 19.
    ANALYSE DU CODE v1v2 Fichiers 396 129 Code 94.922 lignes 240 lignes / chier 8.822 lignes 68 lignes / chier Commentaires 37.855 lignes 2.462 lignes Sensio Insight 29/100 2 ans pour la médaille Platinum 32/100 3 semaines pour la médaille Platinum Scrutinizer 4,95/10 (1 erreur critique, +700 majeures) 9,39/10 (4 erreurs majeures)
  • 20.
    CHARGEMENT DES PAGES Analysesfaites avec Black re sur PHP 7.0.6 v1 v2 Liste d'articles (460) 330ms 17 Mo 689ms 31 Mo Un article 89ms 10 Mo 281ms 17 Mo Liste des tags (20) 85ms 10 Mo 314ms 19 Mo
  • 21.
    EN CONCLUSION ... C'estpas très fameux pour la v2 tout ça ! Un framework, c'est lourd Le plain PHP c'est forcément rapide Pas trop focalisé sur la perf, pour le moment Plusieurs pistes d'améliorations (Redis, APC, Black re, etc.) Surtout un confort de développement pour les devs
  • 22.
  • 23.
    LE CHOIX DUFRAMEWORK
  • 24.
    EXTRACTION DE CONTENU LAprincipale fonctionnalité de wallabag Assuré par , dans la v1 Pas vraiment open source ... Et pas très pratique à utiliser ... Full-Text RSS // $ftr should be URL where you installed this application $ftr = 'http://example.org/full-text-rss/'; $article = 'http://www.bbc.co.uk/news/world-europe-21936308'; $request = $ftr.'makefulltextfeed.php?format=json&url='.$article; // Send HTTP request and get response $result = @file_get_contents($request);
  • 25.
    EXTRACTION DE CONTENU MAIS,sa capacité d'extraction est ef cace ! Utilise le microformat Utilise les données de Basée sur php-readability Et sur des site_con g (dans un repo séparé) hNews Schema.org ➜ Forker en gardant cette logique
  • 26.
    EXTRACTION DE CONTENU ,un fork de Full-Text RSS v3.3graby Mise en place de test fonctionnels sur l'existant Ré-organisation / refonte site_con g via Composer Ajout de tests Et c'est plus propre à utiliser ... use GrabyGraby; $article = 'http://www.bbc.co.uk/news/world-europe-21936308'; $graby = new Graby(); $result = $graby->fetchContent($article);
  • 27.
    LA MIGRATION ENSOI Par itération Le socle Symfony La connexion utilisateur La con guration La commande wallabag:install L'ajout d'un lien L'ajout de tags Etc. Globalement, tout a été réécrit, étape par étape
  • 28.
    LA V2 N'ESTPAS ISO AVEC LA V1 v2.0.0 ➜ focaliser sur le fonctionnement de base v2.0.x ➜ focaliser sur la stabilité v2.x ➜ amélioration des fonctionnalités (tag, recherche, etc.)
  • 29.
    LIBRAIRIES UTILISÉES POURL'API FOSRestBundle NelmioCorsBundle FOSOAuthServerBundle BazingaHateoasBundle NelmioApiDocBundle Si seulement était sorti plus tôt :)API Platform 2.0
  • 30.
    LISTING DES FEATURESPAR LIBRAIRIE Utilisateur ➜ FosUserBundle Filtres ➜ FormFilterBundle Changement de thème ➜ LiipThemeBundle Export ➜ phpepub, tcpdf, php-mobi Règle de tagging ➜ RulerZ ( @KPhoen) Maintenance ➜ MaintenanceBundle Two factor authentication ➜ TwoFactorBundle Annotations ➜ AnnotatorJS
  • 31.
  • 32.
    INSTALLATION DE L'APPLICATION L'applicationdoit être disponible pour tout le monde ! sur un serveur dédié sur un serveur mutualisé sur un ... raspberry (c'est pas gagné ...) Et installable par tout le monde "tout le monde" inclut des personnes novices
  • 33.
    INSTALLATION DE L'APPLICATION Deuxsolutions choisies : Via une archive incluant les dépendances Via Git & Composer
  • 34.
    INSTALLATION DE L'APPLICATION Plutôtbasique pour la v1 wget http://wllbg.org/latest unzip latest + quelques lignes de SQL Dans l'ensemble aucun souci ✅
  • 35.
    INSTALLATION DE L'APPLICATION Tentativen°1 git clone https://github.com/wallabag/wallabag.git -b v2 cd wallabag composer install php app/console wallabag:install Trop orienté dev Installe toutes les deps "dev" C'était bien au début ™
  • 36.
    INSTALLATION DE L'APPLICATION Tentativen°2 composer create-project wallabag/wallabag wallabag 2.0.0-alpha.1 cd wallabag php app/console wallabag:install Toujours trop orienté dev Simple amélioration de la version précédente
  • 37.
    INSTALLATION DE L'APPLICATION Tentativen°3 SYMFONY_ENV=prod composer create-project wallabag/wallabag wallabag "2.0.*@alpha" --no-dev cd wallabag php app/console wallabag:install --env=prod Uniquement les packages de prod MAJ impossible à cause de create-project
  • 38.
    INSTALLATION DE L'APPLICATION Tentativen°4 (l'actuelle) git clone git@github.com:wallabag/wallabag.git cd wallabag git checkout 2.0.4 SYMFONY_ENV=prod composer install --no-dev -o --prefer-dist php app/console wallabag:install --env=prod Toujours bien en version de prod Facilite la mise à jour (par les tags) Mais toujours des soucis de mémoire
  • 39.
    AUTRES DIFFICULTÉS Les migrationsde données SQLite Les demandes de site_con g Les issues de personnes pas très techniques
  • 40.
  • 41.
    LES ÉTAPES ENCOURS RabbitMQ, pour les gros traitements Elasticsearch ( @damienalexandre) Dockerization par @JoliCode en salle C Gérer les dépendances CSS et JS via
  • 42.
    API : INTÉGRATIONSDÉJÀ RÉALISÉES : clone libre de IFTTTTrigger-Happy.eu github.com/foxmask/django-th @TriggerHappyEu
  • 43.
    API : INTÉGRATIONSDÉJÀ RÉALISÉES Application Windows Phone (Android et iOS en cours de réalisation) Addon pour Firefox : plugin pour ajouter dans wallabag depuis Tiny Tiny RSS Librairies , et ttrss-to-wallabag-v2 Python Java .NET
  • 44.
    API : INTÉGRATIONSSOUHAITÉES Cozy Cloud ownCloud Fabricants de liseuses Firefox, Gnome (pour remplacer Pocket)
  • 45.
  • 46.
    TO INFINITY... ANDBEYOND Un front en React Une solution SaaS Intégration dans des applis tierces Reeder IFTTT Etc.
  • 47.