def scanJob()

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