in src/plugins/scanners/buildbot.py [0:0]
def scan(KibbleBit, source):
# Simple URL check
buildbot = re.match(r"(https?://.+)", source['sourceURL'])
if buildbot:
source['steps']['ci'] = {
'time': time.time(),
'status': 'Parsing Buildbot job changes...',
'running': True,
'good': True
}
KibbleBit.updateSource(source)
badOnes = 0
pendingJobs = []
KibbleBit.pprint("Parsing Buildbot activity at %s" % source['sourceURL'])
source['steps']['ci'] = {
'time': time.time(),
'status': 'Downloading changeset',
'running': True,
'good': True
}
KibbleBit.updateSource(source)
# Buildbot may neeed credentials
creds = None
if source['creds'] and 'username' in source['creds'] and source['creds']['username'] and len(source['creds']['username']) > 0:
creds = "%s:%s" % (source['creds']['username'], source['creds']['password'])
# Get the job list
sURL = source['sourceURL']
KibbleBit.pprint("Getting job list...")
builders = plugins.utils.jsonapi.get("%s/api/v2/builders" % sURL , auth = creds)
# Save queue snapshot
NOW = int(datetime.datetime.utcnow().timestamp())
queuehash = hashlib.sha224( ("%s-%s-queue-%s" % (source['organisation'], source['sourceID'], int(time.time())) ).encode('ascii', errors='replace')).hexdigest()
# Scan queue items
blocked = 0
stuck = 0
totalqueuetime = 0
labelQueuedBuilds = {}
queueSize = 0
actualQueueSize = 0
building = 0
jobs = []
for builder, data in builders.items():
jobs.append(builder)
if data['state'] == 'building':
building += 1
if data.get('pendingBuilds', 0) > 0:
# All queued items, even offlined builders
actualQueueSize += data.get('pendingBuilds', 0)
# Only queues with an online builder (actually waiting stuff)
if data['state'] == 'building':
queueSize += data.get('pendingBuilds', 0)
blocked += data.get('pendingBuilds', 0) # Blocked by running builds
# Stuck builds (iow no builder available)
if data['state'] == 'offline':
stuck += data.get('pendingBuilds', 0)
# Write up a queue doc
queuedoc = {
'id': queuehash,
'date': time.strftime("%Y/%m/%d %H:%M:%S", time.gmtime(NOW)),
'time': NOW,
'size': queueSize,
'blocked': blocked,
'stuck': stuck,
'building': building,
'ci': 'buildbot',
# Standard docs values
'sourceID': source['sourceID'],
'organisation': source['organisation'],
'upsert': True,
}
KibbleBit.append('ci_queue', queuedoc)
KibbleBit.pprint("Found %u builders in Buildbot" % len(jobs))
threads = []
block = threading.Lock()
KibbleBit.pprint("Scanning jobs using 4 sub-threads")
for i in range(0,4):
t = buildbotThread(block, KibbleBit, source, creds, jobs)
threads.append(t)
t.start()
for t in threads:
t.join()
# We're all done, yaay
KibbleBit.pprint("Done scanning %s" % source['sourceURL'])
source['steps']['ci'] = {
'time': time.time(),
'status': 'Buildbot successfully scanned at ' + time.strftime("%Y/%m/%d %H:%M:%S", time.gmtime(time.time())),
'running': False,
'good': True
}
KibbleBit.updateSource(source)