in src/plugins/scanners/jenkins.py [0:0]
def scanJob(KibbleBit, source, job, creds):
""" Scans a single job for activity """
NOW = int(datetime.datetime.utcnow().timestamp())
jname = job['name']
if job.get('folder'):
jname = job.get('folder') + '-' + job['name']
dhash = hashlib.sha224( ("%s-%s-%s" % (source['organisation'], source['sourceURL'], jname) ).encode('ascii', errors='replace')).hexdigest()
found = True
doc= None
parseIt = False
found = KibbleBit.exists('cijob', dhash)
# Get $jenkins/job/$job-name/json...
jobURL = "%s/api/json?depth=2&tree=builds[number,status,timestamp,id,result,duration]" % job['fullURL']
KibbleBit.pprint(jobURL)
jobjson = plugins.utils.jsonapi.get(jobURL, auth = creds)
# If valid JSON, ...
if jobjson:
for build in jobjson.get('builds', []):
buildhash = hashlib.sha224( ("%s-%s-%s-%s" % (source['organisation'], source['sourceURL'], jname, build['id']) ).encode('ascii', errors='replace')).hexdigest()
builddoc = None
try:
builddoc = KibbleBit.get('ci_build', buildhash)
except:
pass
# If this build already completed, no need to parse it again
if builddoc and builddoc.get('completed', False):
continue
KibbleBit.pprint("[%s-%s] This is new or pending, analyzing..." % (jname, build['id']))
completed = True if build['result'] else False
# Estimate time spent in queue
queuetime = 0
TS = int(build['timestamp']/1000)
if builddoc:
queuetime = builddoc.get('queuetime', 0)
if not completed:
queuetime = NOW - TS
# Get build status (success, failed, canceled etc)
status = 'building'
if build['result'] in ['SUCCESS', 'STABLE']:
status = 'success'
if build['result'] in ['FAILURE', 'UNSTABLE']:
status = 'failed'
if build['result'] in ['ABORTED']:
status = 'aborted'
# Calc when the build finished (jenkins doesn't show this)
if completed:
FIN = int(build['timestamp'] + build['duration']) / 1000
else:
FIN = 0
doc = {
# Build specific data
'id': buildhash,
'date': time.strftime("%Y/%m/%d %H:%M:%S", time.gmtime(FIN)),
'buildID': build['id'],
'completed': completed,
'duration': build['duration'],
'job': jname,
'jobURL': jobURL,
'status': status,
'started': int(build['timestamp']/1000),
'ci': 'jenkins',
'queuetime': queuetime,
# Standard docs values
'sourceID': source['sourceID'],
'organisation': source['organisation'],
'upsert': True,
}
KibbleBit.append('ci_build', doc)
# Yay, it worked!
return True
# Boo, it failed!
KibbleBit.pprint("Fetching job data failed!")
return False