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
WTF
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)
JENKINS CI
Q: https://maestrano.com/apps/1-jenkins
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/
RELATED WORK
• Raspberry Pi Internet Monitor
– Steuerung Industrie-Signallampe über Raspi
– http://www.instructables.com/id/Raspberry-Pi-Internet-Monitor
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
RASPBERRY PI
GPIO
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
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
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)
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()
NEXT
• Vom Prototyp zum „Produkt“
– Aufbau auf Platine
– Gehäuse
– 24/7 Betrieb