enthought/pyface

Bug report: image_volume.py time_stamp breaks reproducible builds

bmwiedemann opened this issue · 5 comments

Environment

OS: all (openSUSE-Tumbleweed-20230728)
Python version: all

Description

While working on reproducible builds for openSUSE, I found that
building our python-pyface package twice resulted in such diffs:

--- old//usr/lib/python3.11/site-packages/pyface/image/library/icons.zip/image_volume.py        2023-07-30 13:29:14.000000000 +0200
+++ new//usr/lib/python3.11/site-packages/pyface/image/library/icons.zip/image_volume.py        2039-09-01 02:45:16.000000000 +0200
@@ -4,7 +4,7 @@
     category='General',
     keywords=[],
     aliases=[],
-    time_stamp='20230730132924',
+    time_stamp='20390901024527',
     info=[

There should be a way to get deterministic build results, e.g. allow to override the build timestamp with SOURCE_DATE_EPOCH.

Steps to Reproduce

do a clean build twice

Thanks for the report, although I don't think this is an issue with Pyface. I'm not sure why your build is touching the icons.zip file. You should be able to treat that as a fixed asset from the point of view of linux packaging.

It seems, icons.zip is modified by the unittests:
https://code.opensuse.org/package/python-pyface/blob/3ea62406bddb3d455d2d0cc4be6661d24d7b95ea/f/python-pyface.spec#_88
maybe in pyface/image/tests/test_image.py ?

Yes, I think there are tests which test the correct regeneration of the zip archives. Tests shouldn't be run on as part of actually creating a build artefact though? I'd think you'd want to run the tests on the result of the reproducible build.

This seems to be an effect of how we build with rpmbuild. There tests run before bundling up files. Will try to avoid it there.

We solved it now via https://build.opensuse.org/request/show/1131679 by copying PYTHONPATH / python_sitelib before a test.