一条线使克隆速度提高了100倍

我们的性能优化团队发现了一个很小的变化,它对所有管道的构建速度都有很大的影响。我们发现,refspec及时设置参数git fetch可使克隆步骤加快100倍。



工程生产力小组负责支持在Pinterest上构建和部署软件的工程师。我们的团队支持许多基础设施服务,并且经常从事大型项目的工作-将所有软件迁移到Bazel,创建一个称为Hermez的连续交付平台。他们还支持mono-repository,每天在那里发送数百次提交,而这并不是他们的全部任务。



我们努力使Pinterest上的软件开发和交付快速而轻松。最近,生活再次表明,即使最小的细节也可以产生巨大的影响。我们在Git中发现了一个小细节,它极大地减少了我们持续集成流程中的构建时间。要了解这一小变化如何产生如此大的影响,我们需要共享有关我们的单一存储库和管道的一些信息。



单一储存库和输送机



我们在Pinterest上有六个主要存储库:Pinboard,Optimus,Cosmos,Magnus,iOS和Android。这些都是具有大量特定于语言的服务的单一存储库。 Pinboard是自公司成立以来维护的最大的单一存储库。完全克隆后,它的提交超过350k,大小为20GB。



克隆具有大量代码和悠久历史的Mono资源库需要花费大量时间,在我们的持续集成管道中,我们每天必须经常这样做。仅针对Pinboard,在工作日内,我们就会生产6万多种产品。git pull...大多数Jenkins管道配置脚本(用Groovy编写)始于Checkout步骤,在此我们克隆存储库,该存储库将在以后的步骤中进行构建和测试。这是典型的Checkout阶段的样子:







如果直接使用Git CLI:







``

即使不完整/浅层克隆,也没有提取任何标签并且仅在最近50次提交中,该操作仍未尽其所能。这是因为我们没有设置refspec参数。请注意,缺少此参数意味着检索所有refspec的命令:+ refs / heads / *:refs / remotes / origin / *。对于Pinboard,处理了超过2500个分支。



通过简单地添加refspec选项并指定我们感兴趣的链接(在本例中,仅来自主链接),可以将处理范围限制为所需的分支,并节省大量时间。这就是我们的管道中的样子:







简单的一行更改就将克隆时间减少了100倍,结果,大大缩短了构建时间。最大的Pinboard存储库的克隆时间从40分钟减少到30秒。这表明有时即使最小的努力也会产生巨大的影响。



All Articles