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.

8987d77750701f93bb78228c86d2c205?s=128

Stéphane Wirtel

October 27, 2013
Tweet

Transcript

  1. 5.

    • pour parler du Runbot (CI) d’OpenERP • échanger des

    idées d’un éventuel remplaçant • et pour le fun ! !5
  2. 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
  3. 9.

    • Build le dernier commit de plusieurs branches • Si

    build ok -> Instanciation de l’OpenERP • Interface simple • HTTP Proxy avec nginx !9 Le “Pour”
  4. 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”
  5. 13.
  6. 14.

    Objectifs • Modularité • Scalabilité • Distribué • Extensible !

    ! • Monitoring • API HTTP Versionnée • Configurable (YAML) • Installation rapide !14
  7. 15.

    Glossaire • Proxy • Manager • Worker • Queue •

    Plugin (Capacité) ! • Job • Build • Context d’exécution !15
  8. 18.

    Scalabilité • Ajout de Workers • Ajout de Manager •

    Ajout de Proxy (reverse-proxy, nginx) !18
  9. 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
  10. 25.

    Redis • In Memory / Persistence on Disk • Queue

    • Utilisé pour la configuration globale du système !25
  11. 26.

    Proxy • HTTP API • RESTful • Versionné • Interface

    Web • Interface pour voir les queues !26
  12. 27.

    Workers • Capacité • Ecoute sur sa propre queue •

    Fait sa TACHE ! • Configuration (YAML). !27
  13. 28.

    Manager • Extension d’un Worker • Utilisation du Plugin “Manager”

    • Dispatch un build en fct(plugin) à éxécuter !28
  14. 29.

    Plugins • Stevedore • Configuration • Capacité ! ! !

    • Exemples • Email • Nginx • Bzr !29
  15. 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',! ]! }! )!
  16. 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
  17. 33.

    Exemple 1 !33 name: Hello! plugins:! - email! config:! email:!

    from: foo@bar.com! to: bar@foo.com! subject: Hello! body: How are you ?!
  18. 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
  19. 36.

    Message entrant • De Internet vers le Proxy • JSON

    !36 {! "job": "Hello",! "plugins": {! "email": {! "from": "stephane@wirtel.be",! "to": "orga@pycon.fr",! "subject": "Bonjour de Evy",! "body": "Le monde merveilleux de Python",! }! }! }!
  20. 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
  21. 39.

    Message interne - Exemples {! "job": "Hello",! "build": "48f5f6f041bd4190af6504663150d67a",! "plugin":

    "email",! "config": {! "from": "stephane@wirtel.be",! "to": "orga@pycon.fr",! "subject": "Bonjour de Evy",! "body": "Le monde merveilleux de Python"! },! "context" : {! }! }! • Envoyé vers le Worker !39
  22. 40.

    Message interne {! "job": "Hello",! "build": "48f5f6f041bd4190af6504663150d67a",! "status": "done",! "plugin":

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

    Command Line • Utilise l’API HTTP • Permet de créer

    des jobs • Gérer un build • Extensible en local/remote !41
  24. 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