Xavier HAUSHERR, CTO chez Overblog, présentera le processus complet de développement du projet Overblog qui est basé sur les méthodologies suivantes: Scrum, Git Flow, Github, Jenkins, PhpUnit/Symfony pour les tests unitaires, Watir/Cucumber pour les tests fonctionnels. La présentation détaillera la façon dont nous avons adapté Git Flow à Scrum, nos processus de déploiement, de tests ainsi que notre flux de mise en production.
1. Git Flow: un processus de
développement Agile
Xavier HAUSHERR
2. A propos
Xavier HAUSHERR
CTO
Twitter: @xkobal
Blog: xavier.over-blog.com
3. Git Flow: un processus de développement Agile
Le projet Overblog
4. Qui sommes nous ?
Né en 2004, Overblog est la plateforme de blogs Européenne n°1.
Nous sommes la première plateforme a avoir mis en place le partage
de revenu publicitaire généré par l’audience.
La nouvelle version est sortie en Juin 2012 avec un très bon retour des
blogueurs. Elle ne cesse depuis d’évoluer fonctionnellement.
C’est aussi:
3 millions de blogs dans 5 langues
38 millions de visiteurs uniques par mois
275 millions pages vues par mois
16ème audience française
Plus de 80 serveurs pour servir les blogs
5. Nom de code «Kiwi»
Refonte complète du produit
Une forte orientation vers les réseaux sociaux
Une équipe de 10 personnes
Utilisation de nouvelles technologies
Nouvelle architecture
Un projet orienté service
7 mois de développement
1 année d’évolution
Sortie de nouvelles fonctionalités avant l’été
6. Git Flow: un processus de développement Agile
Du cycle en V à l’agilité
7. Evolution du process
- Planning en V
- Gantt
- Flou au démarrage
- Manque de spécifications fonctionnelles
- Evolution très rapide des besoins produits
Scrum
10. Détail d’un sprint Scrum chez Overblog
Semaine 1 Lundi Mardi Mercredi Jeudi Vendredi
Sprint Planning Daily Meeting Daily Meeting Daily Meeting Daily Meeting
Mise en Prod
Release n-1 Poker Planning Poker Planning
Semaine 2 Lundi Mardi Mercredi Jeudi Vendredi
Daily Meeting Daily Meeting Daily Meeting Daily Meeting Daily Meeting
Debug / Refacto Debug / Refacto
Demo Code Review
Poker Planning Feature Freeze Retrospective
11. Nos besoins de développement Agile
Coder sans mettre en péril le projet
Travailler à deux ou plus sur des features
Tester chaque fonctionnalité avant mise en production
Intégration continue pour certaines fonctionnalités
Release pour les grosses fonctionnalités
Gestion des urgences
Être accepté par l’équipe Scrum
12. Git Flow: un processus de développement Agile
feature-* master release-* hotfix-* stable
Tag 1.0
Bugfixes
Production
Tag 1.1
+ Intégration continue
Tag 1.2
Intégration continue
Tag 1.3
Git Flow Github Flow
feature-* master release-* hotfix-* stable
Feature for
Release 0 next release Tag 1.0
Feature for
future release
Bugfixes
=
Production
Tag 1.1
Intégration continue
Overblog Flow
Tag 1.2
Start of
Feature release
Freeze branch for
2.0
Only
bugfixes !
Mise en
Tag 2.0
production
13. Git flow
feature-* develop release-* hotfix-* master
Feature for
Release 0 next release Tag 1.0
Feature for
future release
Bugfixes
Production
Tag 1.1
Start of
Feature release
Freeze branch for
2.0
Only
bugfixes !
Mise en Tag 2.0
production
http://nvie.com/posts/a-successful-git-branching-model/
14. Git flow
feature-* develop
Feature for
Release 0 next release
Feature branches
15. Git flow
feature-* develop release-* master
Release 0 Tag 1.0
Start of
Feature release
Freeze branch for
2.0
Only
bugfixes !
Mise en Tag 2.0
production
Release branches
16. Git flow
feature-* develop release-* master
Release 0 Tag 1.0
Feature for
future release
Start of
Feature release
Freeze branch for
2.0
Mise en Tag 2.0
production
Long feature branches
17. Git flow
develop hotfix-* master
Release 0 Tag 1.0
Bugfixes
Production
Tag 1.1
Hotfix branches
18. Nos besoins de développement Agile
Coder sans mettre en péril le projet
Travailler à deux ou plus sur des features
Tester chaque fonctionnalité avant mise en production
Intégration continue pour certaines fonctionnalités
Release pour les grosses fonctionnalités
Gestion des urgences
Être accepté par l’équipe Scrum
Connection décentralisée
Merge compliqué
Qui merge ?
Quand tester ?
19. Github Flow
feature-* master
develop release-* hotfix-* stable
master
Feature for
Release 0 next release Tag 1.0
Feature for
future release
Bugfixes
Production
Tag 1.1
Intégration continue
Tag 1.2
Start of
Feature release
Freeze branch for
2.0
Only
bugfixes !
Mise en Intégration continue
Tag 1.3
2.0
production
Scott Chacon
software developer & Git evangelist @Github
http://scottchacon.com/2011/08/31/github-flow.html
20. Github Flow
feature-* master release-* hotfix-* stable
Tag 1.0
Bugfixes
Production
Tag 1.1
Intégration continue
Tag 1.2
Intégration continue
Tag 1.3
Scott Chacon
software developer & Git evangelist @Github
http://scottchacon.com/2011/08/31/github-flow.html
21. Nos besoins de développement Agile
Coder sans mettre en péril le projet
Travailler à deux ou plus sur des features
Tester chaque fonctionnalité avant mise en production
Intégration continue pour certaines fonctionnalités
Release pour les grosses fonctionnalités
Gestion des urgences
Être accepté par l’équipe Scrum
Plus de release
22. Overblog Flow
feature-* develop
master release-* hotfix-* master
stable
Feature for
Release 0 next release Tag 1.0
Feature for
future release
Bugfixes
Production
Tag 1.1
Intégration continue
Tag 1.2
Start of
Feature release
Freeze branch for
2.0
Only
bugfixes !
Mise en Tag 2.0
production
23. Overblog Flow
feature-* master release-* hotfix-* stable
Feature for
Release 0 next release Tag 1.0
Feature for
future release
Bugfixes
Production
Tag 1.1
Intégration continue
Tag 1.2
Start of
Feature release
Freeze branch for
2.0
Only
bugfixes !
Mise en Tag 2.0
production
24. Git Flow: un processus de développement Agile
Les Tests unitaires et fonctionnels
25. Un processus de déploiement Agile
Prod Server
Fun
c tion
a l Te
sts
Production
delivery
Te sts
tio nal
c
Fun
Run Unit Tests Quality Manager
V
Va
ll
id
da
at
e
e
ts
&
&
es
M
lT
er
rg
na
gee
Staging Server
io
Pu
Pu
ct
n
lll R
Fu
R
eq
q u
ue
Unit
st
st
Tests
sts
Pull Reque
Test Server
Developers Product Owner
26. Un processus de déploiement Agile
Prod Server
Fun
c tion
a l Te
sts
Production
delivery
Te sts
tio nal
c
Fun
Run Unit Tests Quality Manager
V
Va
ll
id
da
at
e
e
ts
&
&
es
M
lT
er
rg
na
gee
Staging Server
io
Pu
Pu
ct
n
lll R
Fu
R
eq
q u
ue
Unit
st
st
Tests
sts
Pull Reque
Test Server
Developers Product Owner
27. Un processus de déploiement Agile
Prod Server
Fun
c tion
a l Te
sts
Production
delivery
Te sts
tio nal
c
Fun
Run Unit Tests Quality Manager
V
Va
ll
id
da
at
e
e
ts
&
&
es
M
lT
er
rg
na
gee
Staging Server
io
Pu
Pu
ct
n
lll R
Fu
R
eq
q u
ue
Unit
st
st
Tests
sts
Pull Reque
Test Server
Developers Product Owner
28. Un processus de déploiement Agile
Prod Server
Fun
c tion
a l Te
sts
Production
delivery
Te sts
tio nal
c
Fun
Run Unit Tests Quality Manager
V
Va
ll
id
da
at
e
e
ts
&
&
es
M
lT
er
rg
na
gee
Staging Server
io
Pu
Pu
ct
n
lll R
Fu
R
eq
q u
ue
Unit
st
st
Tests
sts
Pull Reque
Test Server
Developers Product Owner
29. Un processus de déploiement Agile
Prod Server
Fun
c tion
a l Te
sts
Production
delivery
Te sts
tio nal
c
Fun
Run Unit Tests Quality Manager
V
Va
ll
id
da
at
e
e
ts
&
&
es
M
lT
er
rg
na
gee
Staging Server
io
Pu
Pu
ct
n
lll R
Fu
R
eq
q u
ue
Unit
st
st
Tests
sts
Pull Reque
Test Server
Developers Product Owner
30. Tests unitaires PHP
PHPUnit
Environnement de test Symfony 2
Lancés par jenkins
namespace OverblogBlogBlogBundleTestsTwigNodeVisitor;
use OverblogBlogBlogBundleTwigNodeVisitorMethodCallOptimizerNodeVisitor;
class MethodCallOptimizerNodeVisitorTest extends PHPUnit_Framework_TestCase
{
public function testSingle()
{
$env = $this->getTwig(array('tpl' => '{{ foo.bar }}'));
$env->addNodeVisitor(new MethodCallOptimizerNodeVisitor(array(
array('foo', 'getbar')
)));
$src = $env->getLoader()->getSource('tpl');
$php = $env->compileSource($src, 'tpl');
$this->assertContains(
'$context["foo"]->getbar()',
$php
);
}
}
31. Tests unitaires Javascript
YUI Test
Lancés par jenkins
Navigateur Chromium dans un environnement VLC
var suite = new Y.Test.Suite("Timeline : TimelineView");
suite.add(
new Y.Test.Case({
name: "Test TimelineView",
testRender: function ()
{
Y.Assert.areEqual(
4,
Y.all('.statuses button').size()
);
Y.Assert.areEqual(
2,
Y.all('.class button').size()
);
Y.Assert.areEqual(
3,
Y.all('.advanced select').size()
);
},
});
Y.Test.Runner.add(suite);
32. Tests fonctionnels
Cucumber
Lancés par jenkins
Navigateurs controlés par Watir
@comment @ie
Scenario: I can add a comment
When I connect to my comment account
When I initialize a post with title "Test comments" and text "You can comment"
When I publish
Then I see success message "POST_PUBLISHED"
Then I need to sleep a little
Given I visit my comment blog
When I open article "Test comments"
Then I don't see errors
When I add a comment with:
| name | text |
| Anonym comment | This article is top |
Then I don't see errors
Then I should see "Your comment has been published"
Given I visit my comment blog
When I open article "Test comments"
Then I see comment:
| name | text |
| Anonym comment | This article is top |
When I goto admin
When I delete the article with:
| title |
| Test comments |
Then I see success message "POST_DELETED"