Au secours, mon chef m'a demandé de passer au DevOps
-
Upload
antonyguilloteau -
Category
Software
-
view
66 -
download
2
Transcript of Au secours, mon chef m'a demandé de passer au DevOps
Au secours, mon chef m'a demandé de passer au
DevOps !
32% des projets sont réussis 84% des projets dépassent le délai 64% des fonctionnalités développées ne sont pas utilisées
Source : Chaos report 2009
Les projets cycles en V
Antony GUILLOTEAU@aguilloteau
Takeuchi et Nonaka(1982)
TODO
Design Code Test Deploy
Design Code Test DeployCode Test Code Test Code Test
Waterfall
Agile
DevOpsDesign
Design Code Test Deploy
Waterfall
Design Code Test DeployCode Test Code Test Code Test
Agile
Les 4 valeurs du Manifeste Agile(2001)
#1 Les individus et leurs interactions plus que les processus et les outils
#2 Des logiciels opérationnels plus qu’une documentation exhaustive
#3 La collaboration avec les clients plus que la négociation contractuelle
#4 L’adaptation au changement plus que le suivi d’un plan
Les objectifs du DevOps
#1 Améliorer la coopération entre Dev et Ops#2 Améliorer la livraison du produit#3 Fluidifier l’élaboration du produit
Livrer rapidement
Développer avec la cible
TODO
Monitorer pour prévenir
Un produit stable
Être résilient
29% des entreprises ont adopté une démarche DevOps17% sont en phase de réflexion ou d’expérimentation19% utilisent la démarche DevOps pour toutes leurs applications
Le DevOps en France
Etude IDC – Octobre 2016
https://www.linkedin.com/pulse/dynamics-devops-adoption-dr-pallab-saha
Plan Code Build Test Release Deploy Operate
Agile Development
Continuous Integration
Continuous Delivery
Continuous Operations
Continous Deployment
Agile Development
Continuous Integration
Continuous Delivery
Continuous Deployment
Continuous Operations
DevOps
PORTAIL
VENTE
Partenaire
Partenaire
Partenaire
ClientClient
Client
3 équipes SCRUM
Usine logicielle d’entreprise
Livraison tous les 2 sprints
50 Millions de commandes en base
15 Millions de requêtes / jour
Des croyances• Les équipes sont pluridisciplinaires• D’entreprise : Tendre vers le DevOps, les
équipes sont autonomes dans la mise en œuvre
• Personnelles : team member multi-compétents
Agile Development
Continuous Integration
Continuous Delivery
Continuous Deployment
Continuous Operations
DevOps
Automatisation des tests fonctionnels
Plan Code Build Test Release Deploy Operate
Exemple de code cucumber
Scénario: LT103-03-01-Recherche de solution multi-GO avec la date de départ sans tarif à condition d'aller-retour Soit une recherche de solutions train aller-retour sur un trajet multi GO Quand j'appelle le service de recherche de solutions tarifaires pour l'aller Alors des solutions sont remontées Et des solutions régionales "Pays de Loire" sont présentes
Alors(~'^des solutions (nationales|régionales) (?:"([^"]*)" ?|) sont présentes$'){ String go, String region ->
if (region == null) { assert false, "Il faut indiquer une région" }
// Récupération de l'OD à partir de son nom fonctionnel GOsData gOsData = GOsData.getGOsData(go) searchSolutionsAssertor.assertProposalsContainGo(gOsData.connector)}
Zucchini pour suivre les exécutions des scénarios Cucumber
Automatisation des tests de performance
Plan Code Build Test Release Deploy Operate
Exemple de scénario Gatling
Object SearchScenario {
private val category = csv("category.csv").random private val keyword = csv("keyword.csv").random
val scn : ScenarioBuilder = scenario("Search") .exec().feed(keyword).randomSwitch( 80d -> exec(http("Search by keyword").get("/search?q=${keyword}").check(status.is(200))), 20d -> exec(http("Search by category").get("/search?q=${category}").check(status.is(200))) )}
class GatlingSimulation extends Simulation { val httpConf = http.baseURL("http://localhost:8080/").userAgentHeader("Gatling").disableCaching setUp( SearchScenario.scn.inject(rampUsersPerSec(1) to(20) during(5 minutes)) ).protocols(httpConf)}
Agile Development
Continuous Integration
Continuous Delivery
Continuous Deployment
Continuous Operations
DevOps
Architecture multi-composant
ComposantComposant Composant
Plan Code Build Test Release Deploy Operate
Extrait code orchestrateur de releasepublic void createReleaseBranch(Delivery delivery, Execution execution) throws Exception { for (DeliveredComponent component : delivery.getComponents()) { FullGitRepo gitRepo = new FullGitRepo(configuration.getWorkspace(), component.getComponent());
execution.executeOnce(component.getComponent().getName(), "create release branch", () -> { gitRepo.createBranch(computeReleaseBranchName(delivery.getReleaseVersion()), delivery.getBranch()); if (!delivery.isDryRun()) { gitRepo.push(); } });
execution.executeOnce(component.getComponent().getName(), "update pom for next snapshot", () -> { gitRepo.switchToBranch(delivery.getBranch()); gitRepo.hardReset(); File pomFile = gitRepo.findFile("pom.xml"); Properties mavenProps = new Properties(); mavenProps.setProperty("developmentVersion", delivery.getNextSnapshotVersion().toString()); dependenciesService.updateDependenciesInPom(delivery, component, pomFile, delivery.getNextSnapshotVersion()); gitRepo.add("."); gitRepo.commit("[ReleaseTool] update module and dependencies versions in pom.xml to " + delivery.getNextSnapshotVersion()); if (!delivery.isDryRun()) { gitRepo.push(); } }); }}
Agile Development
Continuous Integration
Continuous Delivery
Continuous Deployment
Continuous Operations
DevOps
Suivi des mises en production
Plan Code Build Test Release Deploy Operate
Agile Development
Continuous Integration
Continuous Delivery
Continuous Deployment
Continuous Operations
DevOps
Supervision et centralisation des logs
Plan Code Build Test Release Deploy Operate
Exemple de requête Sparkval ref_rdd = sc.textFile("/user/logflmp1/2017-02-01/*/log_haproxy*.log")
case class HaProxyLine(frontend: String, backend: String, instance : String, timestamp8601: String, errorCode: String, elapsedTimeMs: String)
val haProxyLines = ref_rdd.map(s => s.split(" ")).map( s => HaProxyLine( s(3).substring(3).replace("~", ""), s(4).substring(0, s(4).lastIndexOf("/")), s(4).substring(s(4).lastIndexOf("/") + 1), s(2), s(6), s(7)) ).toDF().registerTempTable("haproxylines")
val columnsGlobalStats = s"frontEnd, backEnd, instance, splitToGroup(timestamp8601), splitToTZ(timestamp8601)"
val columnsErrors = s"$columnsGlobalStats, errorCode"
val dataFrame = sqlContext.sql( "select frontEnd, backEnd, instance, splitToGroup(timestamp8601), splitToTZ(timestamp8601),
count(*), avg(elapsedTimeMs) " + "from haproxylines group by $columnsGlobalStats") val dataFrameError = sqlContext.sql( "select $columnsErrors, count(*), avg(elapsedTimeMs) " + "from haproxylines where errorCode >= 400 group by $columnsErrors")
val rdd = dataFrame.rdd
Plan Code Build Test Release Deploy Operate
Aujourd’huiUne prise de recul
Taux de dispo de 99,5 %
5 bugs bloquants découverts en production
Livraison tous les 2 sprints
Les activités d’un développeur c’est
Agile Development
Continuous Integration
Continuous Delivery
Continuous Deployment
Continuous Operations
DevOps
DevOps
Agile Development
Continuous Integration
Continuous Delivery
Continuous Deployment
Continuous Operations
Le DevOps c’est du dév …Et avant tout une philosophie
https://goo.gl/forms/YCZbdwMNStBqGgZq2
Merci pour votre feedback