[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#739497: reproducible.json now exists



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


Reply to: