ci-ampel für jenkins mit raspberrypi und python

13
CI AMPEL THOMAS KOCH - @TOMY_KOCH PYCOLOGNE - AUGUST 2015

Upload: thomas-koch

Post on 19-Aug-2015

202 views

Category:

Software


1 download

TRANSCRIPT

Page 1: CI-Ampel für Jenkins mit RaspberryPi und Python

CIAMPEL

T H O M A S K O C H - @ T O M Y _ K O C HP Y C O L O G N E - A U G U S T 2 0 1 5

Page 2: CI-Ampel für Jenkins mit RaspberryPi und Python

WTF

Page 3: CI-Ampel für Jenkins mit RaspberryPi und Python

CI = CONTINOUS INTEGRATION

• Continous Integration

– umfasst die automatisierte, regelmäßige Erstellung von Builds sowie Ausführung von Tests

• Vorgang wird automatisch ausgelöst durch Einchecken in die Versionsverwaltung (SVN, git etc.)

– Ziel ist Qualitätssicherung bei der Software-Entwicklung

• Integrations-Probleme werden laufend entdeckt und (möglichst zeitnah) behoben

• frühzeitige Warnungen bei Fehlern (z.B. in Unittests)

• Tools: CI-Server

– z.B. Jenkins (Java) https://jenkins-ci.org

– oder buildbot (Python)

Page 4: CI-Ampel für Jenkins mit RaspberryPi und Python

JENKINS CI

Q: https://maestrano.com/apps/1-jenkins

Page 5: CI-Ampel für Jenkins mit RaspberryPi und Python

RELATED WORK

• Build-Ampel– Arduino, RSS-Feed, Build-Ampel (USB-device – 99 EUR)

– http://www.agile-hardware.de/tag/ampel/

• Using a Raspberry PI to control an extreme feedback device– Verwendet Cleware USB traffic light

• http://www.cleware-shop.de/ (ca. 50 EUR)

– Shell-script auf Basis curl und awk• Sowie Clewarecontrol

https://blog.codecentric.de/en/2013/07/using-a-raspberry-pi-to-control-an-extreme-feedback-devices/

Page 6: CI-Ampel für Jenkins mit RaspberryPi und Python

RELATED WORK

• Raspberry Pi Internet Monitor

– Steuerung Industrie-Signallampe über Raspi

– http://www.instructables.com/id/Raspberry-Pi-Internet-Monitor

Page 7: CI-Ampel für Jenkins mit RaspberryPi und Python

ZUTATEN

• Raspberry Pi (Modell B 512MB RAM) http://www.raspberrypi.org

• SD Card 8GB für Raspian https://www.raspbian.org

• Netzteil (5v Micro USB), USB keyboard

• Rot Grün LED Industrial Tower Signalleuchte (24v) - www.ebay.de

• Netzteil (24v)

• Netzwerklabel (oder Wireless 802.11b/g/n USB Adapter)

• 2 Widerstände 180 Ohm

• 1 Optokoppler LTV847

• breakout board, Steckkabel

• ca. 100 EUR insgesamt

Page 8: CI-Ampel für Jenkins mit RaspberryPi und Python

RASPBERRY PI

GPIO

Page 9: CI-Ampel für Jenkins mit RaspberryPi und Python

SOFTWARE<100 LOC• CI-checker.py

– Polling des Jenkins-Servers via Jenkins-API

– verwendet Python-Wrapper http://python-jenkins.readthedocs.org

$ pip install python-jenkins

• Light.py

• Steuerung der Ampel via GPIO Pins und Optokoppler-Schaltung

• verwendet GPIO Python Wrapper RPi.GPIO https://pypi.python.org/pypi/RPi.GPIO

• Controller.py

• Integriert checker und light

• Einfacher check-control-sleep Zyklus

Page 10: CI-Ampel für Jenkins mit RaspberryPi und Python

SOFTWARECI-CHECKER.PY

class CIChecker(object):

def __init__(self, url=JENK_URL, user=JENK_USER, token=JENK_TOKEN, verbose=False):

self.jenkins = jenkins.Jenkins(url, user, token)

self.verbose = verbose

def log(self, msg):

if self.verbose:

print(msg)

def check(self):

"""check all jobs and return True if all is 'green'

False otherwise

"""

jobs = self.jenkins.get_jobs()

self.log("checking %d jobs" % len(jobs))

i = 0

checked = True

for (num, job) in enumerate(jobs):

name = job['name']

color = job['color']

status = (color == 'blue')

self.log("%d: '%s' - job '%s'" % (num, "OK" if status else "--", name))

if not status:

checked = False

break

self.log("checked all jobs - result is '%s'" % ("OK" if checked else "Failed"))

return checked

Page 11: CI-Ampel für Jenkins mit RaspberryPi und Python

SOFTWARELIGHT.PY

import RPi.GPIO as GPIO

PIN_GREEN = 27

PIN_RED = 22

class Light(object):

def __init__(self, pingreen=PIN_GREEN,pinred=PIN_RED):

self.pingreen = pingreen

self.pinred = pinred

GPIO.setmode(GPIO.BCM)

GPIO.setup([pinred,pingreen], GPIO.OUT)

def __del__(self):

GPIO.cleanup()

def red(self):

GPIO.output(self.pingreen, GPIO.LOW)

GPIO.output(self.pinred, GPIO.HIGH)

def green(self):

GPIO.output(self.pinred, GPIO.LOW)

GPIO.output(self.pingreen, GPIO.HIGH)

def off(self):

GPIO.output(self.pinred, GPIO.LOW)

GPIO.output(self.pingreen, GPIO.LOW)

Page 12: CI-Ampel für Jenkins mit RaspberryPi und Python

SOFTWARECONTROLLER.PY

from cichecker import CIChecker

from light import Light

import time

class LightController(object):

def __init__(self, delay=60, verbose=False):

self.checker = CIChecker(verbose=verbose)

self.light = Light(verbose=verbose)

self.delay = delay

def wakeup(self):

if self.checker.check():

self.light.green()

else:

self.light.red()

def sleep(self):

time.sleep(self.delay)

def loop(self):

while True:

self.wakeup()

self.sleep()

if __name__ == "__main__":

controller = LightController(verbose=True)

controller.loop()

Page 13: CI-Ampel für Jenkins mit RaspberryPi und Python

NEXT

• Vom Prototyp zum „Produkt“

– Aufbau auf Platine

– Gehäuse

– 24/7 Betrieb