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