调试校验和不匹配错误

斯科特•莫舍
2023-01-22 11:07

本文将介绍几种在收到客户端校验和不匹配错误时进一步调试的方法。这不会涵盖所有原因,因为不同的客户端处理校验和的方式不同,但将重点关注接收此错误时的一般调试过程。

首先,校验和不匹配错误意味着客户端收到了带有意外校验和的工件。这应该总是在客户端中输出预期的校验和和实际的校验和。

调试步骤

大多数(如果不是全部)出现此错误都会涉及远程存储库。首先,我们要在Artifactory中对错误中的实际和预期校验和输出执行校验和搜索。我们将想看看在Artifactory实例中的多个存储库中是否引用了“相同的”工件。

要检查的初始配置是围绕在多个具有不同校验和的存储库中包含工件的任何虚拟存储库。我们可以查看虚拟存储库的解析顺序,以便更好地理解返回二进制文件的原因

需要考虑的不同场景

我们将提供一些具体的示例,概述导致此错误的最常见原因:

1.用户从远程存储库下载工件,对二进制文件进行简单更改,然后重新部署到本地存储库。在本例中,我们将工件包含在本地存储库和远程存储库中,所有这些都包含在单个虚拟中。虚拟将不会也不能为工件保存多个校验和。根据客户机的不同,我们可能会遇到这样的问题:客户机期望从远程存储库获得公共包,但由于虚拟解析顺序,本地存储库返回一个意外的二进制/校验和。

解决方案/解决方案:在不更新版本的情况下更改二进制文件被认为是糟糕的做法。根据要返回的二进制文件,可以清除缓存并为虚拟包生成更新的元数据,也可以重命名本地包以增加/更新版本。

2.一个远程存储库已经提取并缓存了包。我们将此工件存储在本地,并对远程注册表上的工件进行了更改。在这种情况下,我们从远程注册中心提取的元数据将具有与本地缓存包不同的校验和。

解决方案/解决方案:在这种情况下,我们需要删除缓存的二进制文件,以便Artifactory返回到远程注册表以获取更新的包。

3.虚拟程序具有多个远程存储库,其中两个远程注册中心上存在相同的包和版本,但校验和不同。一个简单的例子可以从以下两个链接中看到:

https://anaconda.org/anaconda/_libgcc_mutex/files
https://anaconda.org/conda-forge/_libgcc_mutex/files

在这里,我们看到linux-64/_libgcc_mutex-0.1-main.tar。Bz2是“相同的”二进制文件,但校验和不同。这可能会在Artifactory中引起问题,具体取决于解析顺序和缓存。虚拟存储库将首先查看本地存储库,然后查看远程缓存存储库,最后通过远程存储库访问远程端点。如果我们期望的包没有缓存,而另一个二进制文件已经缓存在另一个存储库中,我们可以看到校验和不匹配。

解决方案/解决方案:为特定的远程存储库设置“优先级分辨率”将解决此问题。“优先级解析”意味着它将在查看其他存储库的缓存之前搜索此存储库的远程端点。这可以在远程存储库配置的Advanced选项卡中设置。

还有许多其他原因,其中一些特定于包类型,如果我们遇到与上述示例不一致的校验和不匹配错误,请与JFrog支持团队一起打开一个案例,以进一步挖掘其他可能的原因。