Au secours, mon chef m'a demandé de passer au DevOps

Preview:

Citation preview

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

Recommended