3. CI = CONTINOUS INTEGRATION
• Continous Integration
– umfasst die automatisierte,regelmäßige Erstellung von Builds sowieAusführung von Tests
• Vorgang wird automatisch ausgelöst durch Einchecken in dieVersionsverwaltung (SVN, git etc.)
– Ziel ist Qualitätssicherung bei der Software-Entwicklung
• Integrations-Probleme werden laufend entdeckt und (möglichst zeitnah) behoben
• frühzeitigeWarnungen bei Fehlern (z.B. in Unittests)
• Tools: CI-Server
– z.B. Jenkins (Java) https://jenkins-ci.org
– oder buildbot (Python)
5. 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/
6. RELATED WORK
• Raspberry Pi Internet Monitor
– Steuerung Industrie-Signallampe über Raspi
– http://www.instructables.com/id/Raspberry-Pi-Internet-Monitor
7. 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 IndustrialTower Signalleuchte (24v) - www.ebay.de
• Netzteil (24v)
• Netzwerklabel (oder Wireless 802.11b/g/n USB Adapter)
• 2Widerstände 180 Ohm
• 1 Optokoppler LTV847
• breakout board,Steckkabel
• ca. 100 EUR insgesamt
9. 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
10. SOFTWARE
CI-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