Example #1
0
 def tick_1(self, log):
     """Every minute, grab the jobs from all configured servers."""
     for server_url in get_servers():
         api_url = server_url+'api/json/?tree=jobs[name,url,healthReport[description,score],lastBuild[building,timestamp],lastCompletedBuild[result],lastSuccessfulBuild[duration]]'
         try:
             data = json.load(urllib2.urlopen(api_url))
         except urllib2.URLError:
             # Server unreachable, remove all jobs
             Job.objects.filter(server_url=server_url).delete()
             return
         jobs_seen = set()
         for job_data in data['jobs']:
             fields = {'url': job_data['url']}
             if 'lastCompletedBuild' in job_data:
                 result = job_data['lastCompletedBuild'].get('result')
                 if result is None:
                     fields['status'] = None
                 else:
                     fields['status'] = result == 'SUCCESS'
             if 'lastBuild' in job_data:
                 if job_data['lastBuild']['building']:
                     # Currently building, compute progress
                     last_build_duration = job_data.get('lastSuccessfulBuild', {}).get('duration')
                     if not last_build_duration:
                         fields['progress'] = 0
                     else:
                         start_time = datetime.datetime.fromtimestamp(job_data['lastBuild']['timestamp'] / 1000)
                         start_time = pytz.utc.normalize(pytz.timezone(conf.TIME_ZONE).localize(start_time).astimezone(pytz.utc)).replace(tzinfo=None)
                         current_build_delta = datetime.datetime.utcnow() - start_time
                         current_build_duration = (current_build_delta.days * 86400) + current_build_delta.seconds
                         last_build_duration = last_build_duration / 1000 # Milliseconds
                         fields['progress'] = current_build_duration * 100 / last_build_duration
                         log.debug('!!!!!!!!!!! %s,%s,%s,%s,%s', start_time, current_build_delta, current_build_duration, last_build_duration, fields['progress'])
                 else:
                     fields['progress'] = 100
             job, created = Job.objects.get_or_create(server_url=server_url, name=job_data['name'], defaults=fields)
             if not created:
                 # Update to latest data
                 Job.objects.filter(id=job.id).update(**fields)
             jobs_seen.add(job.id)
         # Remove all jobs that we didn't see this time
         Job.objects.filter(server_url=server_url).exclude(id__in=jobs_seen).delete()
Example #2
0
 def render(self, request, opts):
     data = {
         'id': opts['id'],
         'server_url': opts.get('server_url', ''),
         'job': opts.get('job', ''),
         'servers': get_servers(),
         'jobs': [],
         'css_class': '',
         'progress': 0,
     }
     if data['server_url']:
         data['jobs'] = Job.objects.filter(server_url=data['server_url'])
     if data['job']:
         try:
             data['job'] = Job.objects.get(id=data['job'])
             data['css_class'] = {True: 'green', False: 'red'}.get(data['job'].status, 'purple')
             data['progress'] = data['job'].progress
         except Job.DoesNotExist:
             data['job'] = ''
     return 'jenkins.html', data