On Fri, 7 Nov 2014 22:47:58 +0000 Holger Levsen wrote: > https://jenkins.debian.net/userContent/reproducible.json is now generated > daily at 00:01 UTC and has the following structure+contents: ... > "blacklisted", "FTBFS","reproducible","unreproducible", "unreproducible-with- > buildinfo", "404" and "not for us". Excellent, thanks for that! The attached work-in-progress patch implements an action item (for blacklisted, FTBFS, unreproducible and unreproducible-with-buildinfo packages) and a link in the build cluster in the right column for all packages mentioned in the data. Remaining work: * get some review on the approach and action item text * figure out how to control when the data is downloaded * extended description for the action item * tests -- bye, pabs https://wiki.debian.org/PaulWise
From 76943dcc157cae0f508a8a5588f3c6354f43e452 Mon Sep 17 00:00:00 2001 From: Paul Wise <pabs@debian.org> Date: Wed, 26 Nov 2014 18:55:50 +0800 Subject: [PATCH] WIP: add reproducible builds (Closes: #739497) --- .../debian/templates/debian/logcheck-links.html | 4 ++ distro_tracker/vendor/debian/tracker_panels.py | 8 +++ distro_tracker/vendor/debian/tracker_tasks.py | 83 ++++++++++++++++++++++ 3 files changed, 95 insertions(+) diff --git a/distro_tracker/vendor/debian/templates/debian/logcheck-links.html b/distro_tracker/vendor/debian/templates/debian/logcheck-links.html index ffaf2d4..f3e1b2a 100644 --- a/distro_tracker/vendor/debian/templates/debian/logcheck-links.html +++ b/distro_tracker/vendor/debian/templates/debian/logcheck-links.html @@ -13,4 +13,8 @@ {% endif %} <span>,</span> <span><a title="clang compiler build log" href="http://buildd-clang.debian.net/package.php?{{ query_string }}">clang</a></span> +{% if item.context.has_reproducibility %} +<span>,</span> +<span><a title="report about build reproducibility" href="{{ item.context.reproducibility_url }}">reproducibility</a></span> +{% endif %} {% endwith %} diff --git a/distro_tracker/vendor/debian/tracker_panels.py b/distro_tracker/vendor/debian/tracker_panels.py index 930d4b1..30cb320 100644 --- a/distro_tracker/vendor/debian/tracker_panels.py +++ b/distro_tracker/vendor/debian/tracker_panels.py @@ -77,12 +77,20 @@ class BuildLogCheckLinks(LinksPanel.ItemProvider): logcheck_url = \ "https://qa.debian.org/bls/packages/{hash}/{pkg}.html".format( hash=self.package.name[0], pkg=self.package.name) + try: + infos = self.package.packageextractedinfo_set.get(key='reproducibility') + has_reproducibility = True + except PackageExtractedInfo.DoesNotExist: + has_reproducibility = False + reproducibility_url = "https://jenkins.debian.net/userContent/rb-pkg/{pkg}.html".format(pkg=self.package.name) return [ TemplatePanelItem('debian/logcheck-links.html', { 'package_query_string': query_string, 'has_checks': has_checks, 'logcheck_url': logcheck_url, + 'has_reproducibility': has_reproducibility, + 'reproducibility_url': reproducibility_url, 'has_experimental': has_experimental, }) ] diff --git a/distro_tracker/vendor/debian/tracker_tasks.py b/distro_tracker/vendor/debian/tracker_tasks.py index 03d26b9..5b654bd 100644 --- a/distro_tracker/vendor/debian/tracker_tasks.py +++ b/distro_tracker/vendor/debian/tracker_tasks.py @@ -2275,3 +2275,86 @@ class UpdatePackageScreenshotsTask(BaseTask): extracted_info.append(screenshot_info) PackageExtractedInfo.objects.bulk_create(extracted_info) + + + +class UpdateBuildReproducibilityTask(BaseTask): + ACTION_ITEM_TYPE_NAME = 'debian-build-reproducibility' + ITEM_DESCRIPTION = { + 'blacklisted': '<a href="{url}">Blacklisted</a> from build reproducibility testing', + 'FTBFS': '<a href="{url}">Fails to build</a> in reproducible build mode', + 'reproducible': None, + 'unreproducible': '<a href="{url}">Does not build reproducibly</a> and no build info is produced', + 'unreproducible-with-buildinfo': '<a href="{url}">Does not build reproducibly</a> in reproducible build mode', + '404': None, + 'not for us': None, + } + + def __init__(self, force_update=False, *args, **kwargs): + super(UpdateBuildReproducibilityTask, self).__init__(*args, **kwargs) + self.force_update = force_update + self.action_item_type = ActionItemType.objects.create_or_update( + type_name=self.ACTION_ITEM_TYPE_NAME) + + def set_parameters(self, parameters): + if 'force_update' in parameters: + self.force_update = parameters['force_update'] + + def get_build_reproducibility_content(self): + url = 'https://jenkins.debian.net/userContent/reproducible.json' + return get_resource_content(url) + + def get_build_reproducibility(self): + reproducibilities = self.get_build_reproducibility_content() + reproducibilities = json.loads(reproducibilities) + reproducibilities = dict([(item['name'], item['status']) for item in reproducibilities]) + return reproducibilities + + def update_action_item(self, package, item): + action_item = package.get_action_item_for_type(self.action_item_type.type_name) + if action_item is None: + action_item = ActionItem( + package=package, + item_type=self.action_item_type, + severity=ActionItem.SEVERITY_NORMAL) + + status = item.get('status') + if not (status and status in ITEM_DESCRIPTION and ITEM_DESCRIPTION[status]): + action_item.delete() + return + + url = "https://jenkins.debian.net/userContent/rb-pkg/{pkg}.html".format(pkg=package.name) + action_item.short_description = self.ITEM_DESCRIPTION[status].format(url=url) + action_item.save() + + def execute(self): + reproducibilities = self.get_build_reproducibility() + if reproducibilities is None: + return + + with transaction.atomic(): + PackageExtractedInfo.objects.filter(key='reproducibility').delete() + + packages = [] + extracted_info = [] + + for item in reproducibilities: + try: + package = SourcePackageName.objects.get(name=item['name']) + packages.append(package) + self.update_action_item(package, item) + except SourcePackageName.DoesNotExist: + continue + + try: + reproducibility_info = package.packageextractedinfo_set.get(key=self.EXTRACTED_INFO_KEY) + reproducibility_info.value['reproducibility'] = item + except PackageExtractedInfo.DoesNotExist: + reproducibility_info = PackageExtractedInfo( + key=self.EXTRACTED_INFO_KEY, + package=package, + value=item) + extracted_info.append(reproducibility_info) + + ActionItem.objects.delete_obsolete_items([self.action_item_type], packages) + PackageExtractedInfo.objects.bulk_create(extracted_info) -- 2.1.3
Attachment:
signature.asc
Description: This is a digitally signed message part