一行代码的更改将我们的构建时间缩短了99%

2020-10-26 09:26:12

Urvashi Reddy|软件工程师,工程生产力团队Adam Berry|技术负责人,工程生产力团队Rui Li|软件工程师,工程生产力团队。

Pinterest的工程生产力团队发现了一个很小的变化,它对减少跨管道的构建时间产生了很大的影响。我们发现,在GIT获取过程中设置refspec选项可以减少99%的构建时间。

Pinterest的工程生产力团队负责支持在公司构建和部署软件的工程师。我们的团队维护着大量的基础设施服务,并且经常进行大规模的工作--将Pinterest的所有软件迁移到Bazel,创建名为Hermez的持续交付平台,以及维护每天致力于几百次的monorepos,仅举几例。

我们所有更大的努力都是为了实现让Pinterest的软件开发和交付成为快速而轻松的体验的目标。最近,我们被提醒,小细节也可以对这一目标产生重大影响。我们发现了一个被忽视的Git选项,它极大地缩短了持续集成管道中的构建时间。为了理解这个小小的改变是如何产生如此大的影响的,我们需要分享一些关于我们的Monorepos和我们的管道的信息。

我们在Pinterest上有六个主要的存储库:插接板、擎天柱、Cosmos、Magnus、iOS和Android。每一个都是一个Monorepo,并包含大量特定于语言的服务集合。插接板和公司一样古老,也是最大的单回购。插接板有超过350K的提交,完全克隆时大小为20 GB。

克隆具有大量代码和历史记录的monorepos非常耗时,而且我们需要在我们的持续集成管道中全天频繁地这样做。仅对于插接板,我们在工作日就做了超过60K的GIT拉动。我们的大多数Jenkins管道配置脚本(用Groovy编写)都从“签出”阶段开始,在此阶段我们克隆稍后阶段将构建和测试的存储库。下面是典型的“结账”阶段:

即使我们告诉Git进行浅层克隆,不要获取任何标记,并获取最后50个提交,我们仍然没有尽可能快地运行此操作。这是因为我们没有设置refspec选项。注意,通过不在管道配置脚本中设置它,我们告诉Git获取所有refspecs:+refs/head/*:refs/remotes/Origin/*。在插接板的情况下,该操作将获取超过2500个分支。

只需添加refspec选项并指定我们关心的引用(在本例中为master),我们就可以将引用限制在我们关心的分支上,从而节省大量时间。下面是我们的管道代码中的内容:

这一简单的一行更改将我们的克隆时间减少了99%,并因此显著减少了我们的构建时间。复制了我们最大的回购,插接板从40分钟缩短到了30秒。这表明,有时候我们的小小努力也能产生很大的影响。

像大多数开发人员生产力团队一样,我们从事对我们的日常体验有很大影响的大型服务。然而,有时仅仅是一行修复就可以产生巨大的不同。我们的工作就是理解这一点。

如果您热衷于提高开发人员的工作效率,请加入我们的团队!我们正在招聘我们工程生产力团队的工程师职位。

要了解有关Pinterest工程的更多信息,请查看我们的工程博客,并访问我们的Pinterest实验室网站。要查看和申请空缺机会,请访问我们的职业页面。