A program to create deterministic zip files.
A tool to generate consistent zip files.
This tool was specifically built to prevent zip file changes from triggering
AWS Lambda function updates when running
terraform apply. Before this change,
every re-build of the zipfile would result in a different zip even if its
contents had not changed.
This tool currently only runs on python3.7 in order to use deflate compression level 9.
pip install deterministic_zip
Creating a deterministic_zip
Run the following, and verify that your zip produces the same sha256 hash:
echo "The first file." > first echo "The second file." > second deterministic_zip archive.zip first second sha256sum archive.zip
If you have
\n line endings the result should be:
If you have
\r\n line endings (Windows) the result should be:
How does it work?
Great question! There are three tricks to building a deterministic zip.
Files must be added to the zip in the same order. Directory iteration order may vary across machines, resulting in different zips.
deterministic_zipsorts all files before adding them to the zip archive.
Files in the zip must have consistent timestamps. If I share a directory to another machine, the timestamps of individual files may differ, depsite identical content. To achieve timestamp consistency,
deterministic_zipsets the timestamp of all added files to
2019-01-01 00:00:00. Please note that this does not affect the timestamp of the source files.
Files in the zip must have consistent permissions. File permissions look like
-rw-r--r--for a file that is readable by all users, and only writable by the user who owns the file. Similarly executable files might have permissions that look like:
deterministic_zipsets the permission of all files to either
-r-xr-xr-x. The latter is only used of the user running
deterministic_ziphas execute access on the file.
Release history Release notifications | RSS feed
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Hashes for deterministic_zip-0.1-py3-none-any.whl