#!/usr/bin/python3 # -*- coding: utf-8 -*- # # Copyright © 2015-2016 Holger Levsen # based on ~jenkins.d.n:~mattia/status.sh by Mattia Rizzolo # Licensed under GPL-2 # # Depends: python3 # from reproducible_common import * from reproducible_html_indexes import build_leading_text_section import glob bugs = get_bugs() def convert_into_status_html(status): if status != 'None': status, icon, spokenstatus = get_status_icon(status) return status + ' ' + status + '' else: return '' def generate_schedule(arch): """ the schedule pages are very different than others index pages """ log.info('Building the schedule index page for ' + arch + '...') title = 'Packages currently scheduled on ' + arch + ' for testing for build reproducibility' query = 'SELECT sch.date_scheduled, s.suite, s.architecture, s.name, ' + \ 'r.status, r.build_duration, ' + \ '(SELECT coalesce(AVG(h.build_duration), 0) FROM stats_build AS h WHERE h.status IN ("reproducible", "unreproducible") AND h.name=s.name AND h.suite=s.suite AND h.architecture=s.architecture) ' + \ 'FROM schedule AS sch JOIN sources AS s ON sch.package_id=s.id LEFT JOIN results AS r ON s.id=r.package_id ' + \ 'WHERE sch.date_build_started IS NULL AND s.architecture="{arch}" ORDER BY sch.date_scheduled' # 'AND h.name=s.name AND h.suite=s.suite AND h.architecture=s.architecture' in this query and the query below is needed due to not using package_id in the stats_build table, which should be fixed... text = Template('$tot packages are currently scheduled for testing on $arch:') html = '' rows = query_db(query.format(arch=arch)) html += build_leading_text_section({'text': text}, rows, defaultsuite, arch) html += generate_live_status_table(arch) html += '

\n' + tab html += '' html += '\n' for row in rows: # 0: date_scheduled, 1: suite, 2: arch, 3: pkg name 4: previous status 5: previous build duration 6. avg build duration pkg = row[3] duration = convert_into_hms_string(row[5]) avg_duration = convert_into_hms_string(row[6]) html += tab + '' html += '\n' html += '
#scheduled atsuitearchsource packageprevious build statusprevious build durationaverage build duration
 ' + row[0] + '' + row[1] + '' + row[2] + '' html += link_package(pkg, row[1], row[2], bugs) html += ''+convert_into_status_html(str(row[4]))+''+duration+'' + avg_duration + '

\n' destfile = BASE + '/index_' + arch + '_scheduled.html' desturl = REPRODUCIBLE_URL + '/index_' + arch + '_scheduled.html' write_html_page(title=title, body=html, destfile=destfile, arch=arch, style_note=True, refresh_every=60) log.info("Page generated at " + desturl) def generate_live_status_table(arch): query = 'SELECT s.id, s.suite, s.architecture, s.name, s.version, ' + \ 'p.date_build_started, r.status, r.build_duration, ' + \ '(SELECT coalesce(AVG(h.build_duration), 0) FROM stats_build AS h WHERE h.status IN ("reproducible", "unreproducible") AND h.name=s.name AND h.suite=s.suite AND h.architecture=s.architecture) ' + \ ', p.job ' + \ 'FROM sources AS s JOIN schedule AS p ON p.package_id=s.id LEFT JOIN results AS r ON s.id=r.package_id ' + \ 'WHERE p.date_build_started IS NOT NULL AND s.architecture="{arch}" ' + \ 'ORDER BY p.date_build_started DESC' html = '' rows = query_db(query.format(arch=arch)) html += '

\n' + tab html += '' html += '' html += '' html += '' html += '\n' counter = 0 # the path should probably not be hard coded here… builders = len(glob.glob('/var/lib/jenkins/jobs/reproducible_builder_' + arch + '_*')) for row in rows: counter += 1 if counter > builders: html += '' elif builders == 0: html += '' suite = row[1] arch = row[2] pkg = row[3] duration = convert_into_hms_string(row[7]) avg_duration = convert_into_hms_string(row[8]) html += tab + '' html += '' html += '' html += '' html += '' html += '' html += '\n' html += '
#src pkg idsuitearchsource packageversionbuild startedprevious build statusprevious build durationaverage build durationbuilder job
There are more builds marked as currently building in the database (' + str(counter) + ') than there are ' + arch + ' build jobs (' + str(builders) + '). This does not compute, please investigate and fix the cause.
0 build jobs for ' + arch + ' detected. This does not compute, please investigate and fix the cause.
 ' + str(row[0]) + '' + suite + '' + arch + '' + link_package(pkg, suite, arch) + '' + str(row[4]) + '' + str(row[5]) + '' + convert_into_status_html(str(row[6])) + '' + duration + '' + avg_duration + '' + str(row[9]) + '

\n' return html def generate_oldies(arch): log.info('Building the oldies page for ' + arch + '...') title = 'Oldest results on ' + arch html = '' for suite in SUITES: query = 'SELECT s.suite, s.architecture, s.name, r.status, r.build_date ' + \ 'FROM results AS r JOIN sources AS s ON r.package_id=s.id ' + \ 'WHERE s.suite="{suite}" AND s.architecture="{arch}" ' + \ 'AND r.status != "blacklisted" ' + \ 'ORDER BY r.build_date LIMIT 15' text = Template('Oldest results on $suite/$arch:') rows = query_db(query.format(arch=arch,suite=suite)) html += build_leading_text_section({'text': text}, rows, suite, arch) html += '

\n' + tab html += '' html += '\n' for row in rows: # 0: suite, 1: arch, 2: pkg name 3: status 4: build date pkg = row[2] html += tab + '' html += '\n' html += '
#suitearchsource packagestatusbuild date
 ' + row[0] + '' + row[1] + '' html += link_package(pkg, row[0], row[1], bugs) html += ''+convert_into_status_html(str(row[3]))+'' + row[4] + '

\n' destfile = BASE + '/index_' + arch + '_oldies.html' desturl = REPRODUCIBLE_URL + '/index_' + arch + '_oldies.html' write_html_page(title=title, body=html, destfile=destfile, arch=arch, style_note=True, refresh_every=60) log.info("Page generated at " + desturl) if __name__ == '__main__': for arch in ARCHS: generate_schedule(arch) generate_oldies(arch)