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()
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