Size: 15981
Comment: add a link to some early history
|
Size: 15984
Comment: formatting
|
Deletions are marked like this. | Additions are marked like this. |
Line 111: | Line 111: |
== Reproducible World Summit, December 1-3, 2015, Athens, Greece | == Reproducible World Summit, December 1-3, 2015, Athens, Greece == |
Please keep in mind that history is written by the winners. Let's just hope for not too much betrayal. Another way to say this is an African proverb: until the lion learns how to write, every story will glorify the hunter.
Contents
-
Tell the tale
- An old idea
- Private property + Snowden effect
- Kick-off
- First mass-rebuilds
- .buildinfo control files
- strip-nondeterminism
- Giving up on build paths
- Improved comparison tool
- Continuous integration
- dpkg-genbuildinfo
- FOSDEM 2015 and aftermath
- To be sorted out
- Google Summer of Code 2015
- CCCamp 2015
- DebConf15
- Continous tests for Coreboot, OpenWrt, NetBSD, FreeBSD, Archlinux and Fedora
- Reproducible World Summit, December 1-3, 2015, Athens, Greece
- Archive wide rebuilds
- Presentations
- Publicity
- Weekly reports
- Contributors
Tell the tale
A history of reproducible builds in Debian and around.
An old idea
The idea of reproducible builds is not very new. It was implemented for GNU tools in the early 1990s. In Debian world, it was mentioned first in 2000, and then more explicitly in 2007 on debian-devel: “I think it would be really cool if the Debian policy required that packages could be rebuild bit-identical from source.” The reactions were unfortunately not really enthusiastic both times.
Private property + Snowden effect
The interest on reproducible builds picked up again with Bitcoin. Users of bitcoins needed a way to trust that they were not downloading corrupted software. Initial versions of Gitian were written in 2011 to solve the problem. It drives builds using virtual machines and Git.
The global surveillance disclosures in 2013 raised the interest even further. Mike Perry worked on making the Tor Browser build reproducibly in fear of a “malware that attacks the software development and build processes themselves to distribute copies of itself to tens or even hundreds of millions of machines in a single, officially signed, instantaneous update”.
Kick-off
The success of making such a large piece of software build reproducibly proved that it was feasible for other projects. This prompted Lunar to organize a discussion at DebConf13 happening July 2013. Even scheduled at the last minute, there was still about thirty attendees who were very much interested, amongst them members of the technical committee and a few other core teams. Minutes are available.
After some more research during the conference, a wiki page was created. The initial approach was to get Debian to “buy-in” on the idea by making five packages from different maintainers build reproducibly. However, it quickly appeared that before fixing issues in the toolchain, it would not be possible to even get a single package to be reproducible.
First mass-rebuilds
Lunar came up with the first patches for dpkg at the August 2013. This enabled hello to build reproducibly. The first large scale rebuild was performed soon after by David Suárez, with variations on time and build path. 24% of 5240 source packages were identified as reproducible. The first version of a “smart” comparison script was written to help reviewing differences.
A second mass rebuild was made before the presentation in the distro devroom at FOSDEM’14. It used a slightly different approach regarding build paths and had binutils built in deterministic mode. 67% of 6887 source packages were found reproducible. A result applauded by the FOSDEM crowd.
The presentation sparked interest and woke up the mailing-list created some months ago. Tomasz Buchert wrote a lintian check for gzip files. Stéphane Glondu worked on sorting logs and experimenting with alternatives for build path issues.
.buildinfo control files
In parallel, several approaches on where and how to record the build environment were considered. The first idea was to use the .changes control file through a substitution variable (719854). Instead, Guillem Jover suggested to add new fields by passing --changes-option="-DBuild-Env=… to dpkg-buildpackage. As for the value, we discovered dh-buildinfo written by Yann Dirson, described as a “debhelper addon to track package versions used to build a package”. Fit for reproducible builds!
What happened for a year was presented at DebConf14. The reception was unexpectedly good and the follow-up BoF truly productive. For one thing, a suitable way to record the build environment was sketched out.
One issue about using .changes files is that they are not kept in the archive. So to be used as a way to record the environment, they would need to be distributed with the archive. But this would be a misunderstanding of their purpose. As their name implies, .changes control files represent changes to archive. They were inherently designed to be transient.
So instead, we had the idea of a new .buildinfo control file which would be added to the archive alongside binary packges — and be uploaded by referencing them in .changes. We quickly drafted a specification, and a couple of days later Niko Tyni came up with an addition to debhelper which created a .buildinfo using the output of the aforementioned dh-buildinfo.
strip-nondeterminism
Before DebConf14, an explicit timestamp was given during rebuilds, extracted from the .changes file. However, during the discussions, there was a consensus that the date of the latest entry in the debian/changelog file could be used as the reference timestamp when needed.
This helped another idea: a generic tool that would post-process different file formats to remove timestamps or other source of non-determinism. Andrew Ayer further took the task of creating strip-nondeterminism. The first released version handled files created by gzip, Zip, Jar, Javadoc, and .a files.
Giving up on build paths
Initially we though that variations happening when building the package from different build path should be eliminated. This has proven difficult. The main problem that has been identified is that full path to source files are written in debug symbols of ELF files.
First attempt used the -fdebug-prefix-map option which allows to map the current directory to a canonical one in what gets recorded. But compiler options get written to debug file as well. So it has to be doubled with -gno-record-gcc-switches to be used for reproducibility. The first large scale rebuild has proven that it was also hard to determine what the actual build path has been accurately.
Second attempt used debugedit which is used by Fedora and other to change the source paths to a canonical location after the build. Unfortunately, gcc write debug strings in a hashtable. debugedit will not reorder the table after patching the strings, so the result is still unreproducible. Adding this feature to debugedit looked difficult. We can still make the approach work by passing -fno-merge-debug-strings but this is space expensive. The second large scale rebuild used the latter approach. It was still difficult to guess the initial build path properly. Stéphane Glondu was the first to suggest to using a canonical build path to solve the issue.
During discussions at DebConf14, we revisited the idea, and felt it was indeed appropriate to decide on a canonical build path. It has an added benefit of making it easier to use debug packages: one simply has to unpack the source in the right place, no extra configuration required.
Finally, it was agreed to add a Build-Path field to .buildinfo as it made it easier to reproduce the initial build if the canonical build location would change.
Improved comparison tool
After strip-nondeterminism initial upload and integrating some more changes discussed during DebConf14 in dpkg and debhelper, Lunar experimented with 172 core packages. 30% were reproduced without further modifications.
As the current tools to understand differences between builds were slow and hard to read, Lunar wrote debbindiff. It replaced inefficient shell scripts by structured Python with a HTML output.
Continuous integration
At the end of September 2014, Holger Levsen started to work on extending jenkins.debian.net to perform continuous integration for build reproducibility. Packages from sid started to be built and rebuild. This initially introduced variations for time and file ordering, and was extended later on to also use different users, groups, hostnames, and locales.
The results were visible through a new reproducible.debian.net website. The process of analyzing reproducibility failures could now be more easily shared. New contributors indeed showed up and started submitting sorting out common issues and providing patches.
dpkg-genbuildinfo
The turn of 2015 saw the replacement of the prototype .buildinfo generator by a new implementation suitable for proper inclusion in dpkg. Previously, only packages using dh could generate .buildinfo and could thus be considered reproducible. After updating the experimental toolchain, the change allowed to reach the mark of 80% source packages reproducible.
FOSDEM 2015 and aftermath
The presentation Stretching out for trustworthy reproducible builds was well received at FOSDEM 2015 and was followed up by
https://tracker.debian.org inclusion, see 739497
Debian Developer's Packages Overview (DDPO) inclusion
- debbindiff gained .rpm support
Debian Maintainer Dashbord inclusion
Finally, for now, not even two weeks after FOSDEM 2015 a mail with the subject "Reproducible Builds — proof of concept successful for 83% of all sources in main" was send to debian-devel-announce@lists.ddebian.org officially anouncing the project to the Debian developer community at large.
To be sorted out
2015-03-26: binutils 2.25-6 is built with --enable-deterministic-archives
testing testing and experimental now, pkg sets available too.
2015-05-27: iceweasel 38.0.1-5 is reproducible.
Google Summer of Code 2015
During the summer of 2015 akira and Dhole will be working on moving forward reproducible builds as a Google Summer of Code project. Follow the links to check the accepted akira's application and Dhole's application. Dhole also made a blog post about how Dhole got into GSoC 2015.
CCCamp 2015
Short mention of Lunar's talk to be written here. Add links.
DebConf15
To be written: the first real life meeting of the Debian team. Talk given, roundstable discussion, hacking session. Mentioned in several talks, incl DPL key note. SOURCE_DATE_EPOCH was invented around this time too.
Continous tests for Coreboot, OpenWrt, NetBSD, FreeBSD, Archlinux and Fedora
to be written: tests for these six projects have been added between Juni and December 2015…
Reproducible World Summit, December 1-3, 2015, Athens, Greece
to be written, maybe some photos to be shared, pointers to reports, new mailinglists, new irc channel, an even wider community has started to grow, website.
Do you want to make the rest of the story? ?Join us!
Archive wide rebuilds
2013-09-07 by David Suárez. 24% of 5240 source packages reproducible. Variations: time, build path.
2014-01-26 by David Suárez. 67% of 6887 source packages reproducible. Variations: time, build path.
2014-09-19 by Lunar, 30% of 172 source core packages reproducible. Variations: time, file order.
Updated daily since 2014-09-28 by jenkins.debian.net. On 2014-11-11, 13213 (61.4%) out of 21448 packages are reproducible.
Presentations
Include: Nothing found for "^= Presentations ="!
Got a spare moment? Please migrate this to our new webpages…
With free software, anyone can inspect the source code for malicious flaws. But Debian provide binary packages to its users. The idea of “deterministic” or “reproducible” builds is to empower anyone to verify that no flaws have been introduced during the build process by reproducing byte-for-byte identical binary packages from a given source.
More information about reproducible builds in general are available at reproducible-builds.org.
Contents
Publicity
This section lists URLs, people, and dates for when other people have publicly expressed interest, or shared information about, the project.
Mike Perry, 2013-08-20: Deterministic Builds Part One: Cyberwar and Global Compromise
Jake Edge, 2013-08-21: Security software verifiability
Holger Levsen, 2014-09-26: Reproducible builds? I never did any - manually
Lunar, 2014-12-29: Reproducible builds against RC bugs
Lunar, 2015-01-15: 80%
Jake Edge, 2015-01-21: Lots of progress for Debian's reproducible builds (discussion on LWN, HN, reddit)
Kristian Kißling, 2015-01-27: Debian bringt Reproducible Builds voran in linux-magazin.de (Note: the article contains several misunderstandings.)
Hanno Böck, 2015-02-02: "Vertrauen durch reproduzierbare Build-Prozesse" pages 1, 2 in Golem.de (German)
Hans-Joachim Baader, 2015-02-16: Reproduzierbare Builds in Debian nähern sich in pro-linux.de (German)
2015-02-16: Debian Project Reaches 83% Reproducible Builds for Source Packages in softpedia.com.
Tannhausser, 2015-02-17: Debian mejora su seguridad con los reproducible builds in La Mirada del Replicante (Spanish)
Darren Pauli, 2015-02-23: Debian on track to prove binaries' origins in The Register
Arun, 2015-02-24: Debian working on reproducible builds in ?TuxDiary
2015-02-24: Debian está trabajando en compilaciones reproducibles in Detrás del pingüino (Spanish)
2015-02-27: Debian security initiative for reproducible builds reaches milestone in ?TechRepublic by James Sanders
2015-05-06: http://www.linux-magazin.de/Ausgaben/2015/06/Reproducible-Builds in Linux-Magazin 06/2015 by Daniel Stender (in German)
2015-05-10: Reproducible builds on Debian for GSoC 2015 by dhole
2015-09-06: How Debian Is Trying to Shut Down the CIA and Make Software Trustworthy Again, J.M. Porup, Motherboard
2015-09-10: How Debian and other open-source projects are making software more trustworthy, Chris Hoffman, PCWorld.
2016-01-21: Hello tests.reproducible-builds.org by h01ger
2016-03-31: Reproducible Signal builds for Android (though it's not bit by bit identical and needs an apkdiff tool to claim it's reproducibility)
2016-04-04: Establishing Correspondence Between an Application and its Source Code - How Combining Two Completely Separate Open Source Projects Can Make Us All More Secure by Emily Ratliff
2017-05-03: Construcciones Reproducibles, in Software Gurú magazine, number 54 (Mexico), by Gunnar Wolf
Weekly reports
Stretch cycle
2015-05-03: Reproducible builds: first week in Stretch cycle by Lunar
2015-05-11: Reproducible builds: week 2 in Stretch cycle by Lunar
2015-05-17: Reproducible builds: week 3 in Stretch cycle by Lunar
2015-05-25: Reproducible builds: week 4 in Stretch cycle by Lunar
2015-06-01: Reproducible builds: week 5 in Stretch cycle by Lunar
2015-06-08: Reproducible builds: week 6 in Stretch cycle by Lunar
2015-06-15: Reproducible builds: week 7 in Stretch cycle by Lunar
2015-06-22: Reproducible builds: week 8 in Stretch cycle by Lunar
2015-06-29: Reproducible builds: week 9 in Stretch cycle by Lunar
2015-07-07: Reproducible builds: week 10 in Stretch cycle by Lunar
2015-07-12: Reproducible builds: week 11 in Stretch cycle by Lunar
2015-07-20: Reproducible builds: week 12 in Stretch cycle by Lunar
2015-07-26: Reproducible builds: week 13 in Stretch cycle by Lunar
2015-08-03: Reproducible builds: week 14 in Stretch cycle by Lunar
2015-08-10: Reproducible builds: week 15 in Stretch cycle by Lunar
2015-08-16: Reproducible builds: week 16 in Stretch cycle by Lunar
2015-08-25: Reproducible builds: week 17 in Stretch cycle by Lunar
2015-09-01: Reproducible builds: week 18 in Stretch cycle by Lunar.
2015-09-06: Reproducible builds: week 19 in Stretch cycle by Lunar.
2015-09-14: Reproducible builds: week 20 in Stretch cycle by Lunar.
2015-09-21: Reproducible builds: week 21 in Stretch cycle by Lunar.
2015-09-27: Reproducible builds: week 22 in Stretch cycle by Lunar.
2015-10-04: Reproducible builds: week 23 in Stretch cycle by Lunar.
2015-10-14: Reproducible builds: week 24 in Stretch cycle by Lunar.
2015-10-18: Reproducible builds: week 25 in Stretch cycle by Lunar.
2015-10-26: Reproducible builds: week 26 in Stretch cycle by Lunar.
2015-11-02: Reproducible builds: week 27 in Stretch cycle by Lunar.
2015-11-09: Reproducible builds: week 28 in Stretch cycle by Lunar.
2015-11-15: Reproducible builds: week 29 in Stretch cycle by Lunar.
2015-11-23: Reproducible builds: week 30 in Stretch cycle by Lunar.
2015-12-01: Reproducible builds: week 31 in Stretch cycle by Lunar.
2015-12-11: Reproducible builds: week 32 in Stretch cycle by Lunar.
2015-12-14: Reproducible builds: week 33 in Stretch cycle by Lunar.
2015-12-20: Reproducible builds: week 34 in Stretch cycle by Lunar.
2016-01-03: Reproducible builds: week 35 in Stretch cycle by Lunar.
2016-01-03: Reproducible builds: week 36 in Stretch cycle by Lunar.
2016-01-14: Reproducible builds: week 37 in Stretch cycle by Lunar.
2016-01-17: Reproducible builds: week 38 in Stretch cycle by Lunar.
2016-01-24: Reproducible builds: week 39 in Stretch cycle by Lunar.
2016-02-02: Reproducible builds: week 40 in Stretch cycle by Lunar.
2016-02-08: Reproducible builds: week 41 in Stretch cycle by Lunar.
2016-02-14: Reproducible builds: week 42 in Stretch cycle by Lunar.
2016-02-21: Reproducible builds: week 43 in Stretch cycle by Lunar.
2016-03-05: Reproducible builds: week 44 in Stretch cycle by Lunar.
2016-03-10: Reproducible builds: week 45 in Stretch cycle by Lunar.
2016-03-14: Reproducible builds: week 46 in Stretch cycle by Lunar.
2016-03-21: Reproducible builds: week 47 in Stretch cycle by Lunar.
2016-03-26: Reproducible builds: week 48 in Stretch cycle.
2016-04-02: Reproducible builds: week 49 in Stretch cycle.
2016-04-09: Reproducible builds: week 50 in Stretch cycle.
2016-04-16: Reproducible builds: week 51 in Stretch cycle.
2016-04-23: Reproducible builds: week 52 in Stretch cycle.
2016-04-30: Reproducible builds: week 53 in Stretch cycle.
2016-05-07: Reproducible builds: week 54 in Stretch cycle.
2016-05-14: Reproducible builds: week 55 in Stretch cycle.
2016-05-14: Reproducible builds: week 55 in Stretch cycle.
2016-05-21: Reproducible builds: week 56 in Stretch cycle.
2016-05-28: Reproducible builds: week 57 in Stretch cycle.
2016-06-04: Reproducible builds: week 58 in Stretch cycle.
2016-06-11: Reproducible builds: week 59 in Stretch cycle.
2016-06-18: Reproducible builds: week 60 in Stretch cycle.
2016-06-25: Reproducible builds: week 61 in Stretch cycle.
2016-07-02: Reproducible builds: week 62 in Stretch cycle.
2016-07-23: Reproducible builds: week 65 in Stretch cycle.
2016-08-06: Reproducible builds: week 67 in Stretch cycle.
2016-08-13: Reproducible builds: week 68 in Stretch cycle.
2016-08-20: Reproducible builds: week 69 in Stretch cycle.
2016-08-27: Reproducible builds: week 70 in Stretch cycle.
2016-09-03: Reproducible builds: week 71 in Stretch cycle.
2016-09-10: Reproducible builds: week 72 in Stretch cycle.
2016-09-17: Reproducible builds: week 73 in Stretch cycle.
2016-09-24: Reproducible builds: week 74 in Stretch cycle.
2016-10-01: Reproducible builds: week 75 in Stretch cycle.
2016-10-08: Reproducible builds: week 76 in Stretch cycle.
2016-10-15: Reproducible builds: week 77 in Stretch cycle.
2016-10-22: Reproducible builds: week 78 in Stretch cycle.
2016-10-29: Reproducible builds: week 79 in Stretch cycle.
2016-11-05: Reproducible builds: week 80 in Stretch cycle.
2016-11-12: Reproducible builds: week 81 in Stretch cycle.
2016-11-19: Reproducible builds: week 82 in Stretch cycle.
2016-11-26: Reproducible builds: week 83 in Stretch cycle.
2016-12-03: Reproducible builds: week 84 in Stretch cycle.
2016-12-10: Reproducible builds: week 85 in Stretch cycle.
2016-12-17: Reproducible builds: week 86 in Stretch cycle.
2016-12-24: Reproducible builds: week 87 in Stretch cycle.
2016-12-31: Reproducible builds: week 88 in Stretch cycle.
2017-01-07: Reproducible builds: week 89 in Stretch cycle.
2017-01-14: Reproducible builds: week 90 in Stretch cycle.
2017-01-21: Reproducible builds: week 91 in Stretch cycle.
2017-01-28: Reproducible builds: week 92 in Stretch cycle.
2017-02-04: Reproducible builds: week 93 in Stretch cycle.
2017-02-11: Reproducible builds: week 94 in Stretch cycle.
2017-02-18: Reproducible builds: week 95 in Stretch cycle.
2017-02-25: Reproducible builds: week 96 in Stretch cycle.
2017-03-04: Reproducible builds: week 97 in Stretch cycle.
2017-03-11: Reproducible builds: week 98 in Stretch cycle.
2017-03-18: Reproducible builds: week 99 in Stretch cycle.
2017-03-25: Reproducible builds: week 100 in Stretch cycle.
GSoC 2015: akira
2015-06-07: GSoC 2015 Week 2: Move forward reproducible builds by akira
2015-06-15: GSoC 2015 Week 3: Move forward reproducible builds by akira
2015-06-21: GSoC 2015 Week 4: Move forward reproducible builds by akira
2015-06-29: GSoC 2015 Week 5: Move forward reproducible builds by akira
2015-07-06: GSoC 2015 Week 6: Move forward reproducible builds by akira
2015-07-13: GSoC 2015 Week 7: Move forward reproducible builds by akira
2015-07-20: GSoC 2015 Week 8: Move forward reproducible builds by akira
2015-07-27: GSoC 2015 Week 9: Move forward reproducible builds by akira
2015-08-03: GSoC 2015 Week 10: Move forward reproducible builds by akira
2015-08-03: GSoC 2015 Week 11: Move forward reproducible builds by akira
2015-08-19: GSoC 2015 Week 12: Move forward reproducible builds by akira
GSoC 2015: Dhole
2015-06-07: GSoC 2015 Week 2: Move forward reproducible builds by dhole
2015-06-14: GSoC 2015 Week 3: Move forward reproducible builds by dhole
2015-06-21: GSoC 2015 Week 4: Move forward reproducible builds by dhole
2015-06-28: GSoC 2015 Week 5: Move forward reproducible builds by dhole
2015-07-06: GSoC 2015 Week 6: Move forward reproducible builds by dhole
2015-07-13: GSoC 2015 Week 7: Move forward reproducible builds by dhole
2015-07-20: GSoC 2015 Week 8: Move forward reproducible builds by dhole
2015-07-25: GSoC 2015 Week 9: Move forward reproducible builds by dhole
2015-07-31: GSoC 2015 Week 10: Move forward reproducible builds by dhole
2015-08-07: GSoC 2015 Week 11: Move forward reproducible builds by dhole
2015-08-16: GSoC 2015 Week 12: Move forward reproducible builds by dhole
Contributors
- akira (Maria Valentina Marin)
- Alexis Bienvenüe
- Andrew Ayer
- Asheesh Laroia
- Ceridwen
- Chris Lamb
- Chris West
- Christoph Berg
- Daniel Kahn Gillmor
- Daniel Shahaf
- David Suarez
- Dhole
- Dmitry Bogatov
- Drew Fisher
- Esa Peuha
- Fabian Wolff
- Guillem Jover
- Hans-Christoph Steiner
- Helmut Grohne
- Holger Levsen
- HW42
- Intrigeri
- Jelmer Vernooij
- josch (Johannes Schauer)
- Juan Picca
- Lunar (Jérémy Bobbio)
- Mathieu Bridon
- Mattia Rizzolo
- Nicolas Boulenguez
- Niels Thykier
- Niko Tyni
- Paul Gevers
- Paul Wise
- Peter De Wachter
- Philip Rinn
- Reiner Herrmann
- hefee (Sandro Knauß)
- Sascha Steinbiss
- Satyam Zode
- Scarlett Clark
- Santiago Vila
- Stefano Rivera
- Stéphane Glondu
- Steven Chamberlain
- Tom Fitzhenry
- Valerie Young
- Valentin Lorentz
- Wookey
- Ximin Luo