创建确定的ZIP文件的程序。
deterministic-zip的Python项目详细描述
确定性压缩
生成一致zip文件的工具。
此工具是专门为防止ZIP文件更改触发而构建的
aws lambda函数在运行terraform apply
时更新。在这次改变之前,
每次重新构建zipfile都会导致不同的zip,即使
内容没有改变。
要求
此工具当前仅在python3.7上运行,以便使用deflate压缩 9级。
安装
pip install deterministic_zip
创建确定的压缩文件
运行以下命令,并验证zip是否生成相同的sha256散列:
echo"The first file." > first echo"The second file." > second deterministic_zip archive.zip first second sha256sum archive.zip
如果有\n
行尾,则结果应为:
3afbd7c9b42bd5539ffd5c40499d3d1825157ed83791dce8d7ff2694189d28d6
如果有\r\n
行尾(窗口),则结果应为:
40e16270d62f15e7a192e88b1b301fa6540c86e7e897036b56be513341d376ed
它是如何工作的?
好问题!构建确定性zip有三个技巧。
文件必须按相同的顺序添加到zip中。目录迭代顺序 可能因机器而异,导致拉链不同。
deterministic_zip
在将所有文件添加到zip存档之前对其进行排序。zip中的文件必须具有一致的时间戳。如果我将目录共享给 另一台机器,单个文件的时间戳可能不同,depsite 相同的内容。为了实现时间戳一致性,
deterministic_zip
将所有添加文件的时间戳设置为2019-01-01 00:00:00
。请注意 这个不会影响源文件的时间戳。zip中的文件必须具有一致的权限。文件权限查找 就像
-rw-r--r--
对于所有用户都可读的文件,并且只有 可由拥有该文件的用户写入。类似的可执行文件可能 拥有如下权限:-rwxr-xr-x
或-rwx------
。deterministic_zip
将所有文件的权限设置为-r--r--r--
,或-r-xr-xr-x
。后者仅用于运行deterministic_zip
对文件具有执行访问权限。