/kai/lib/buildbot.py

https://bitbucket.org/bbangert/kai/ · Python · 45 lines · 33 code · 4 blank · 8 comment · 3 complexity · c59bbd1a4c31a1f3d8e5c6ac496fd613 MD5 · raw file

  1. """Query and interact with the buildbot via XMLRPC for info"""
  2. import xmlrpclib
  3. from datetime import datetime
  4. import pylons
  5. from pytz import timezone
  6. buildbot_server = xmlrpclib.Server(pylons.config['buildbot_server'])
  7. day = 60 * 60 * 24
  8. def recent_builds(num_builds=2):
  9. """Fetchs all builds for num_builds, and sorts them into
  10. an organized dict
  11. For performance, this function caches itself for 30 seconds at a
  12. time
  13. """
  14. mycache = pylons.cache.get_cache(__file__ + 'recent_builds')
  15. def get_items():
  16. results = buildbot_server.getAllLastBuilds(num_builds)
  17. builders = {}
  18. tzinfo = timezone('US/Pacific')
  19. for res in results:
  20. start = datetime.fromtimestamp(res[2], tzinfo)
  21. end = datetime.fromtimestamp(res[3], tzinfo)
  22. elapsed = res[3] - res[2]
  23. build = dict(name=res[0], version=res[1],
  24. start=start, end=end, branch=res[4],
  25. revision=res[5], results=res[6], text=res[7],
  26. reasons=res[8], elapsed=elapsed)
  27. builders.setdefault(build['name'], []).append(build)
  28. for ver, items in builders.items():
  29. builders[ver] = sorted(items, cmp=lambda x,y: cmp(y['end'], x['end']))
  30. return builders
  31. return mycache.get_value(key='', createfunc=get_items, expiretime=30)
  32. def build_info(name, build_number):
  33. mycache = pylons.cache.get_cache(__file__ + 'build_info')
  34. if isinstance(build_number, basestring):
  35. build_number = int(build_number)
  36. def get_build():
  37. results = buildbot_server.getBuild(name, build_number)
  38. return results
  39. return mycache.get_value(key='%s%s' % (name, build_number), createfunc=get_build, expiretime=day)