关闭

2016年11月9日

清单4700多万个存储库:重构GitHub列表器

您可能已经注意到我们的存档页面在过去几天里。我们是不是突然发现了新仓库的宝藏?

好吧,还没有……这一增长来自于我们流程的变化,这是迈向更分布式软件遗产的垫脚石。

我们收集和保存软件的工作流程

我们已经分离了收集和保存软件项目的不同步骤:

  1. 列出给定来源(例如锻造厂)存在的所有存储库→列表器成分
  2. 安排所有已知存储库的下载和定期更新→调度程序成分
  3. 执行存储库的下载/更新,并注入所有新的在我们的档案中找到的东西→装载机成分

归档项目数量的突然增加(约1500万个)源于我们在当前最大的项目存储库来源GitHub中列出存储库的方式发生了变化。我们现在做事情的方式是通用的,这个基础可以用来为其他源代码做列表器。

引导软件遗产

github是历史上最大的公共软件开发伪造品之一。我们决定将最初的保护工作重点放在吉特尤其是GitHub,因为它们已经成为现代自由/开源软件(FOSS)开发的实际标准。一旦我们有了一种适当的方法来更新软件目前在开发过程中,人们会更容易开始回顾那些不再移动的东西。

我们编写的第一个加载程序组件之一是Git加载程序,它将git存储库(远程或磁盘上)的URL作为参数,并有效地将其内容加载到Software Heritage存档。

但是第一次我们编写的组件,甚至在我们拥有自己的硬件或Software Heritage存档的数据库模式之前,就是我们的GitHub项目列表。在其核心,这是一件非常简单的事情:它爬行GitHub存储库的滚动API,并将收到的数据插入数据库。这使我们能够慢慢地获得所有公开可用的GitHub存储库的列表。

很早以前,我们还写了一个简单的重复任务调度程序,这让我们可以跑芹菜定期执行任务(具有自适应间隔),将结果异步存储在PostgreSQL数据库中。

然而列表器,调度程序装载机是手动维护的:GitHub列表器每天在扎克为了列出新的存储库,在我们中的一个人运行列表并实际更新调度程序数据库之前,这些新的repo不会被调度。我们也无法禁用已消失的存储库更新。最后,向上直到9月,我们都忽略了GitHub上声明为fork的存储库并且只镜像“基本”存储库(包括其所有挂起的pull请求)。

重新思考(大型)软件源代码列表

GitHub有很多客户流失。当然,很多存储库一直在创建。但作者有时只是简单地删除、重命名或将其存储库委托给其他实体,有很多垃圾邮件存储库(很快就会被删除),一些存储库也会因版权问题而被删除。因此,我们最终尝试对许多不再存在的存储库进行轮询。我们目前的统计数据显示,有370万套死回购,超过4830万套,这几乎是8%。

另一方面,我们的(增量)列表中有一些漏洞,因为一些创建为私有的存储库变成了公共的。2016年9月,在拥有超过10k颗星的800个存储库中,约有100个不在Software Heritage中:只有当新存储库的数字id高于我们看到的上一个存储库时,才会检测到新存储库。很明显,列出GitHub等大型上游来源需要两种不同的更新方式:

  • 做一个增量列表存储库,以尽早安排新存储库的更新;
  • 做一个完整列表“填补空白”以及禁用消失的存储库。

当然,完整列表是一个非常昂贵的操作(根据我们当前的设置,使用20个GitHub API标记大约需要一周时间),因此我们需要以比增量列表运行频率更低的频率运行它。这两个不同的任务被插入到我们的调度程序/工作系统中,所以部署很容易。

与我们以前的处理方式相比,主要的变化是列表器现在直接插入主数据库和调度程序数据库:存储库记录在主数据库中,一旦检测到它们,就会安排它们的定期加载。当我们完成列表器的完整运行时,我们会从调度程序数据库中删除禁用的存储库,以便停止下载它们。

创建自己的列表

我们专注于GitHub,因为这是当今自由/开源软件开发的重要组成部分,我们不得不将有限的开发资源集中在某个地方。但我们知道,越来越多的软件正在所有GitLab公司就在外面。比特桶也有很多活动的存储库。有无数种不同类型的伪造品供人们构建软件,我们的目标是将它们全部存档。

如果您希望在software Heritage中存档您的软件,我们需要能够找到它,这是您做出贡献的机会。我们还没有开发出一个稳定的API,可以让您填补空白,因为我们目前只有GitHub列表器,只有当我们拥有一些多样性时,一个经过验证的API才会有机地出现。如果你是一个有空闲时间的开发人员,你想把自己喜欢的东西归档,请联系并加入我们的开发者社区。我们已经准备好向您介绍当前列表器代码,并帮助您将其应用于其他伪造版本。


-尼古拉斯·丹德里蒙特