我有一个问题,我的自动构建需要压缩目录的内容和Sha256sum zip文件。很容易。
但是,下一次自动构建需要压缩相同的内容和Sha256sum zip文件,以查看是否有任何源代码更改。
本地我运行了以下命令并且每次都生成一个具有相同哈希值的zip(预期,因为我没有更改任何代码):
zip -q -r -X my-directory.zip my_directory/* --exclude ".gitignore" "requirements.txt" "*__pycache__/*" "*/\infrastructure/*"
sha256sum my-directory.zip | awk '{ print $1 }' > my-directory.zip.hash
cat my-directory.zip.hash
我的构建运行相同的命令,但是在每次运行开始时它正在检查GitHub中的代码(因为构建在docker容器内运行),这导致不同的哈希,尽管没有代码更改。 / p>
我通过删除repo并重新克隆来在本地重新创建问题。
有什么想法吗?我认为它是元数据或某种类型,但是没有运气就尝试了不同的排除命令。
答案 0 :(得分:1)
我认为这是由于构建系统检出文件所致,并且构建的本质是一天中的时间与先前的构建有所不同,因此atime,ctime,mtime发生了变化。 Zip将这些修改时间带入存档,它们就像提取之前的样子一样。文件相同,但是存档中的时间戳记正在更改,因此存档也在更改。
作为构建的一部分(terrain lambda_function资源+ jenkins),我添加了一个构建步骤:
find . -exec touch -t 200010101010 {} +
这会将访问和修改时间重置为指定的时间,而不是检出或复制的时间,现在我对zip文件具有一致的校验和。
答案 1 :(得分:0)
您当前的方法看起来容易出错。
它依赖于精心构造的--exclude
参数,
并假设没有意外的文件。
那非常脆弱。
更好的方法是使用git archive
命令创建zip:
git archive HEAD -o my-directory.zip my_directory
这将忽略忽略的文件和不属于存储库的其他文件。 这应该保证一致的结果。
但请注意,git archive
添加了提交ID作为注释。
如果出于某种原因要删除它,可以通过运行以下附加命令来执行此操作:
zip -z my-directory.zip < /dev/null
答案 2 :(得分:0)
通过--exclude
手动排除模式似乎并不可靠。此外,您不会排除.git
文件夹,该文件夹未包含在zip文件中,但可能会以某种方式干扰哈希值。
您应该正确配置.gitignore
个文件并使用git archive
。这是从git存储库导出文件的最佳方式。
尝试以这种方式更改工作流程:
git archive HEAD -o project-archive.zip
sha256sum project-archive.zip | awk '{ print $1 }' > project-archive.zip.hash
你会得到预期的结果。