Peur
Peu fréquente
Erreurs manuelles
Personnes tiers
Problème : Combien de temps pour changer un libellé ?
http://www.agilenutshell.com/agile_vs_waterfall
Objectif : feedback régulier
Cible : build
Problème : 1 seul déploiement
Martin Fowler : « Continuous Delivery is a software development discipline where you build software in such a way that the
software can be released to production at any time. »
http://www.bmc.com/blogs/continuous-delivery-continuous-deployment-continuous-integration-whats-difference
Feedback régulier
Mise en production sécurisée
Découverte d'une nouvelle méthodologie
Théorie VS Pratique
Remise en cause des pratiques habituelles
Qu'est-ce qu'une bonne pratique ?
Recommandation
Validée dans la majorité des situations
Peut être adaptée
Dépend du contexte
N'est pas définitive
Oser essayer
« On a toujours fait ça comme ça ! »
« Tout le monde fait comme ça ! »
« Peut-être qu'un jour... »
Respect de la méthodologie
1 commit = 1 mise en production
Projet "normal"
(env. 95% des cas ?)
Projet final
bibliothèque
Pas de version concurrentes
Projet multi-modules
front / back / ...
Multi-dépôts
Git flow
Tests manuels
Release
Tag
Scripts SQL
Déploiement manuel
Orchestrateur
Tests
unitaire, intégration, fonctionnel (Cerberus), performance, manuel, ...
Environnement
DEV, QA, Preview, PROD, ...
Pipeline
séquentiel/parallèle, fork/join, boutons, ...
pipeline {
agent any
stages {
stage('Build') {
parallel {
stage('Back') {
steps {
dir(path: 'back') {
echo 'mvn clean install'
}
}
}
stage('Front') {
steps {
dir(path: 'front') {
echo 'ng build'
}
}
}
}
}
stage('Cerberus - Deploy') {
parallel {
stage('Back') {
steps {
echo '...'
}
}
stage('Front') {
steps {
echo '...'
}
}
}
}
stage('Cerberus - Test') {
steps {
echo '...'
}
}
stage('Pre-Prod') {
parallel {
stage('Performance') {
steps {
echo '...'
}
}
stage('Preview') {
steps {
echo '...'
}
}
}
}
stage('Prod - Confirm') {
steps {
input 'Deploy to production?'
}
}
stage('Prod - Deploy') {
steps {
echo '...'
}
}
}
}
100% automatisé !
« Pas d'humain, pas de problème... »
Maîtrisé
Modulable
Linéaire
Jusqu'à la production
Stable / Sécurisé
Versionning des dépendances ?
État entre les 2 commits ?
Pipeline : duplication ? join ? hook ?
Les projets sont-ils totalement indépendants ?
La dépendance va-t-elle être réutilisée ailleurs ?
Leur cycle de vie sont-ils différents ?
Comparer les coûts !
Centraliser les modules dans le même dépôt
back-office, front-office, documentation, tests, ...
Maitrise des versions
Tests
end-to-end
Déploiement
Pipeline unique & simple
Outils & Fichier de configuration
Mono-repository niveau entreprise !
Facebook (Mercurial), Google (Perforce)
Release
Hotfix : idem
Opérations manuelles
perte de temps, risque
Merges
conflit, risque
Historique incompréhensible
historique non-linéaire
A quoi servent les branches ?
Plusieurs versions avec cycle de vie différents
(bibliothèque)
En a-t-on réellement besoin ?
Ne pas utiliser de branche
except: local & feature
Travailler sur le master
/trunk
Historique linéaire
Absence de sprint (agile)
Très grosse modification
master
/trunk
only niveau entreprise !
Shazam
Liberté de tout casser
Hypothèse de la vitre brisée
Lock master
+ Pull request + validation
Revue de code
Ceux des revues de code
Partage des connaissances
Un grand pouvoir implique de grandes responsabilités !
Les très grosses modifications
Merge
/Rebase
(des coéquipiers)
Mise en production
Revert
Feature flipping / Feature Toge es
if (ff.isEnabled("SEND_EMAIL"))
mailSender.send("Hello world!", "gibbs@ncis.us")
En 2 temps
Administration
Gestion des droits
Méthode agile : sous-tâches, incrémental/itératif
Suppression de table (BDD) : renommage
Bascule dynamique
Revue de code continue
Avec parcimonie
Testing
Mise en production = release
Montée de version
Tag
Nommage de la version ?
<majorversion [> . <minorversion [> . <incrementalversion ] ] [>
- <buildnumber | qualifier ]>
pull
/update
inutile
Historique incompréhensible
Pourquoi change-t-on de version ?
Pourquoi tague-t-on la version ?
Sources : version constante
Packaging : facultatif
incrémental, timestamp, révision gestion de versions, ...
fichier interne, suffix, ...
Script numéroté
Exécution manuelle
Actions manuelles
Versionning
Rollback
Liquibase
versionning, multi-SGBC, intégration (Maven, Jenkins)
<?xml version="1.0" encoding="UTF-8"?>
<databaseChangeLog>
<changeSet id="1" author="pinguet62">
<createTable tableName="person">
<column name="id" type="int" autoIncrement="true">
<constraints primaryKey="true" nullable="false"/>
</column>
<column name="name" type="varchar(50)"/>
</createTable>
</changeSet>
</databaseChangeLog>
Intégré au pipeline
Client lourd
Base de données
Indisponibilité
Webapp
Auto-update
Electron
Docker & co.
Amazon
11.6 sec
Facebook
2 / jour
1 dépôt
1 pipeline complet
Commit sur master
/trunk
Docker & co.
Simple, basique !