$30 off During Our Annual Pro Sale. View Details »

Evy - Serveur d'Intégration Continue Distribué

Evy - Serveur d'Intégration Continue Distribué

Basé sur Redis et étant modulaire, Evy est peut-être une solution entre Jenkins et Buildbot.

Stéphane Wirtel

October 27, 2013
Tweet

More Decks by Stéphane Wirtel

Other Decks in Programming

Transcript

  1. Evy
    Serveur d’Intégration Continue Distribué

    View Slide

  2. Qui suis-je ?
    Stéphane WIRTEL
    !2

    View Slide

  3. Février 2014 à Bruxelles
    Au fait !

    View Slide

  4. Pourquoi suis-je là ?
    !4

    View Slide

  5. • pour parler du Runbot (CI) d’OpenERP
    • échanger des idées d’un éventuel remplaçant
    • et pour le fun !
    !5

    View Slide

  6. C’est quoi ce Runbot !
    !6

    View Slide

  7. Le Runbot - La Bête
    • Serveur d’intégration continue
    • Propre à OpenERP
    • en Python, Of course ;-)
    • parce que nous avions des problèmes avec
    Buildbot (je sais plus !)
    !7

    View Slide

  8. !8
    Interface du Runbot

    View Slide

  9. • Build le dernier commit de plusieurs branches
    • Si build ok -> Instanciation de l’OpenERP
    • Interface simple
    • HTTP Proxy avec nginx
    !9
    Le “Pour”

    View Slide

  10. • Monolitique (non-extensible)
    • Non-distribué
    • Exécuté toutes les X minutes
    • Installation très fastidieuse
    • bzr branch lp:~openerp-dev/openerp-tools/trunk
    !10
    Le “Contre”

    View Slide

  11. Ok, que proposes-tu ?
    !11

    View Slide

  12. Evy
    Serveur d’Intégration Continue Distribué

    View Slide

  13. View Slide

  14. Objectifs
    • Modularité
    • Scalabilité
    • Distribué
    • Extensible
    !
    !
    • Monitoring
    • API HTTP Versionnée
    • Configurable (YAML)
    • Installation rapide
    !14

    View Slide

  15. Glossaire
    • Proxy
    • Manager
    • Worker
    • Queue
    • Plugin (Capacité)
    !
    • Job
    • Build
    • Context d’exécution
    !15

    View Slide

  16. Architecture
    !16

    View Slide

  17. Modularité
    • Proxy
    • Manager
    • Workers
    • Plugins
    !17

    View Slide

  18. Scalabilité
    • Ajout de Workers
    • Ajout de Manager
    • Ajout de Proxy (reverse-proxy, nginx)
    !18

    View Slide

  19. Distribué
    • Redis
    • Queue
    • Workers
    !19

    View Slide

  20. Extensible
    • Création de plugins
    • Utilisation de stevedore (entrypoints)
    !20

    View Slide

  21. Monitoring
    !21

    View Slide

  22. API HTTP
    • Versionnée
    • RESTful
    • SSL
    • etc…
    !22

    View Slide

  23. API - Exemple
    > http GET http://localhost:19000/api/v1/builds/48f5f6f041bd4190af6504663150d67a!
    HTTP/1.1 200 OK!
    Connection: close!
    Content-Length: 57!
    Content-Type: application/json!
    Date: Sun, 27 Oct 2013 05:02:54 GMT!
    Server: gunicorn/18.0!
    !
    {!
    "identifier": "48f5f6f041bd4190af6504663150d67a",!
    "status": "in progress"!
    }!
    !23

    View Slide

  24. Installation
    !24
    apt-get install redis-server!
    !
    pip install evy-worker evy-master evy-plugin-email!

    View Slide

  25. Redis
    • In Memory / Persistence on Disk
    • Queue
    • Utilisé pour la configuration globale du système
    !25

    View Slide

  26. Proxy
    • HTTP API
    • RESTful
    • Versionné
    • Interface Web
    • Interface pour voir les queues
    !26

    View Slide

  27. Workers
    • Capacité
    • Ecoute sur sa propre queue
    • Fait sa TACHE !
    • Configuration (YAML).
    !27

    View Slide

  28. Manager
    • Extension d’un Worker
    • Utilisation du Plugin “Manager”
    • Dispatch un build en fct(plugin) à éxécuter
    !28

    View Slide

  29. Plugins
    • Stevedore
    • Configuration
    • Capacité
    !
    !
    !
    • Exemples
    • Email
    • Nginx
    • Bzr
    !29

    View Slide

  30. Plugin Email
    !30
    #!/usr/bin/env python!
    from setuptools import setup!
    !
    import release!
    !
    setup(!
    author=release.author,!
    author_email=release.author_email,!
    name=release.name,!
    version=release.version,!
    install_requires=[!
    'EvyWorker',!
    ],!
    entry_points={!
    'evy.plugins': [!
    'email = plugin:Email',!
    ]!
    }!
    )!

    View Slide

  31. from evyworker.logging import logger!
    !
    class Email(object):!
    def __init__(self):!
    pass!
    !
    def run(self, job, build, plugin, config, context=None):!
    logger.info("We do something in this method")!
    return {}!
    !31
    Plugin Email

    View Slide

  32. Job
    !32
    • Modèle d’un travail à réaliser
    • Statique

    View Slide

  33. Exemple 1
    !33
    name: Hello!
    plugins:!
    - email!
    config:!
    email:!
    from: [email protected]!
    to: [email protected]!
    subject: Hello!
    body: How are you ?!

    View Slide

  34. Exemple 2
    name: OpenERP Build 7.0!
    plugins:!
    - bzr_fetch_source!
    - openerp_build!
    - openerp_execute!
    - openerp_nginx_http_proxy!
    - update_web_site!
    - email!
    config:!
    bzr_fetch_source:!
    branches:!
    addons: 'lp:openobject-addons/7.0'!
    server: 'lp:openobject-server/7.0'!
    web: 'lp:openerp-web/7.0'!
    openerp_nginx_http_proxy:!
    server_name: 'demo.openerp.com'!
    port: 6543!
    ssl: true!
    context:!
    working_directory: /mount/srv/build/!
    !34

    View Slide

  35. Messages
    • Message entrant
    • Message interne
    !35

    View Slide

  36. Message entrant
    • De Internet vers le Proxy
    • JSON
    !36
    {!
    "job": "Hello",!
    "plugins": {!
    "email": {!
    "from": "[email protected]",!
    "to": "[email protected]",!
    "subject": "Bonjour de Evy",!
    "body": "Le monde merveilleux de Python",!
    }!
    }!
    }!

    View Slide

  37. La réponse ;-)
    HTTP/1.1 202 ACCEPTED!
    Connection: close!
    Content-Length: 57!
    Content-Type: application/json!
    Date: Sun, 27 Oct 2013 04:58:46 GMT!
    Location: http://localhost:19000/api/v1/builds/48f5f6f041bd4190af6504663150d67a!
    Server: gunicorn/18.0!
    X-Evy-Build: 48f5f6f041bd4190af6504663150d67a!
    !
    {!
    "identifier": "48f5f6f041bd4190af6504663150d67a"!
    }!
    !37

    View Slide

  38. Message interne
    • Entre Redis et Workers
    • Pickle
    !38

    View Slide

  39. Message interne - Exemples
    {!
    "job": "Hello",!
    "build": "48f5f6f041bd4190af6504663150d67a",!
    "plugin": "email",!
    "config": {!
    "from": "[email protected]",!
    "to": "[email protected]",!
    "subject": "Bonjour de Evy",!
    "body": "Le monde merveilleux de Python"!
    },!
    "context" : {!
    }!
    }!
    • Envoyé vers le Worker
    !39

    View Slide

  40. Message interne
    {!
    "job": "Hello",!
    "build": "48f5f6f041bd4190af6504663150d67a",!
    "status": "done",!
    "plugin": "email",!
    "context": {!
    }!
    }!
    {!
    "job": "Hello",!
    "build": "48f5f6f041bd4190af6504663150d67a",!
    "status": "failed",!
    "plugin": "email",!
    }!
    • Retour du Worker
    !40

    View Slide

  41. Command Line
    • Utilise l’API HTTP
    • Permet de créer des jobs
    • Gérer un build
    • Extensible en local/remote
    !41

    View Slide

  42. Et l’avenir ?
    • Unit Test
    • Documentation
    • Utilisation d’un File
    System distribué
    • Déplacer les logs vers
    LogStash ou Riemann
    • Plugin pour déploiement
    continu
    • Git Hook
    • Python-Eve
    • JSON (Message Interne)
    • ZMQ
    • Cron
    • Recettes
    !42

    View Slide

  43. Au fait ;-)
    • A la dernière minute -> Place vacante
    !43

    View Slide

  44. Contribuer
    !44
    git://github.com/matrixise/evy-*

    View Slide

  45. Merci !
    @matrixise
    Stéphane WIRTEL
    https://github.com/matrixise

    View Slide