Slide 1

Slide 1 text

Evy Serveur d’Intégration Continue Distribué

Slide 2

Slide 2 text

Qui suis-je ? Stéphane WIRTEL !2

Slide 3

Slide 3 text

Février 2014 à Bruxelles Au fait !

Slide 4

Slide 4 text

Pourquoi suis-je là ? !4

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

C’est quoi ce Runbot ! !6

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

!8 Interface du Runbot

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

• 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”

Slide 11

Slide 11 text

Ok, que proposes-tu ? !11

Slide 12

Slide 12 text

Evy Serveur d’Intégration Continue Distribué

Slide 13

Slide 13 text

No content

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

Architecture !16

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

Distribué • Redis • Queue • Workers !19

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

Monitoring !21

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

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',! ]! }! )!

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

Messages • Message entrant • Message interne !35

Slide 36

Slide 36 text

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",! }! }! }!

Slide 37

Slide 37 text

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

Slide 38

Slide 38 text

Message interne • Entre Redis et Workers • Pickle !38

Slide 39

Slide 39 text

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

Slide 40

Slide 40 text

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

Slide 41

Slide 41 text

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

Slide 42

Slide 42 text

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

Slide 43

Slide 43 text

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

Slide 44

Slide 44 text

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

Slide 45

Slide 45 text

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