在夏天的一段时间,我们开始考虑将Okcupid的桌面WebApp转换为更具温泉风格的体验。188bet金宝搏官网“为什么不?”我们问。“这很奇怪,我们早些时候没有开始这样做!”可能是别人说的话。

也许一天后,我回答了“哦”。

为了处理任何自尊的SPA所需的代码拆分和延迟加载,我们需要在编译的文件名中包含内容哈希。

urls-best

这是一个问题,因为(不祥,汉斯zimmer噪音,或者可能是一个响亮的唱片抓痕)Okcupid的Web开发基础架构很大程度上依赖检查编译的JavaScript和CSS进入版本控制。188bet金宝搏官网使用不同哈希的平面文件泛洪存储库不是一个选项。

在每个人都生气之前,让我们备份一秒钟:

部署如何工作

直到最近,我们的工作流程看起来像这样:

  1. 写一些JavaScript或CSS。
  2. 提交对我们的前端存储库的更改。
  3. 运行webpack要编译它们,使用手工滚动插件通过NFS将编译的文件发送到DEV服务器和主存储库。
  4. ssh进入dev服务器。
  5. 将编译的文件提交到主存储库。
  6. json文件中的手工编辑行来处理缓存,每个已编译文件的一个值。
  7. 将JSON文件提交到主存储库。
  8. 部署已编译的文件。
  9. 单独部署JSON文件,其中文件名的新值将作为新的查询字符串作为新的查询字符串。

我花了大约一个月来开发一个部署过程的完整心理模型。如果有任何打破,则使用Git恢复到编译文件的超出日期版本的快速回滚,将我们的两个存储库留在一个强调我的状态下的状态。这是耗时,烦人的和容易出错的,但它也很多时候工作,所以我相信你了解我们的困境。

我开始将项目套装为一些低悬垂的水果,并发现WebPack-Manifest-Plugin。通过为每个编译文件生成唯一的内容哈希,插件可以替换我们的过程的一部分,从而重复 - 我们在大JSON文件中递增的数字,并且可以通过忘记逗号或其他任何平台上的应用程序。

测试插件首先顺利进行,但我很快就实现了CSS文件被分配了与他们的JS对应物相同的内容哈希值。事实证明,WebPack 3的内容散列(就像几乎所有常见的JavaScript基础架构)都不知道通过WebPack的提取文本插件制作CSS文件的内容。common.min.js.common.min.css.是一种相同的文件,插件说,直到他们不是。

Spen-best

我们将需要一些东西来生成CSS文件的单独内容哈希。Extract-Text-Plugin包括一个要在文件名本身中包含它们的功能,但我们还没有准备好。

(深叹我们将需要一种方法来从文件名中拉出内容哈希。幸运的是,webpack-manifest-plugin包含一个地图让我们混淆在清单中的任何条目的方法,但是我们认为适合。例如,我们可以使用从其文件名派生的准确源自SSS文件的JS-Idits散列。

拉回哈希巴斯特

(我们意识到WebPack 4可以更明智地做出更明智的,但Commonschunk / Splitchunks Schism将直接与Okcupid的使用率相撞,升级升级掉落超出范围。如果你不知道我是什么188bet金宝搏官网谈论,我很嫉妒你。)

通过更正的清单进入到位,我们可以自由地将哈希从CSS文件名中跳出来。通过将编译的文件发送到我们的Dev服务器之前,我们可以在不手动编辑任何JSON的情况下部署。

不知何故,它的工作。我们正在路上。

通过编程方式破坏缓存,我们的部署可以从端到端自动化。这意味着我们可以开始工作获取文件脱离版本控件,这反过来允许我们在文件名中包含内容哈希,开始创建SPA,并继续使用我们的生活。

每个人都有一个问题:如果平面文件不将在我们的服务器上托管,那么他们会被托管?一群美国耸了耸肩,同时说“S3”,之后很快就创造了一个桶。

依赖S3的一个优点是存在S3-plugin-webpack,将WebPack编译的结果夹在用户选择的S3存储桶中。向开发人员的帽子 - 设置它是一个微风,除了我忘记S3不是真正的文件系统,因此如果您尝试使用相对路径上传到它,因此完全怪异。

通过该问题,我们可以继续前进到第二个:如果我们不会在版本控制中跟踪我们的构建我们将跟踪它们?不幸的是,这一个以上的两个角色来回答:

部署如何运作

  1. 与它相同的是:写作,提交,编译。
  2. 将平面文件和WebPack Masspests发送到S3而不是我们的Dev服务器。
  3. 每个webpack构建都是给出了一个版本,这是一个由构建最近的Git Commit连接到时间戳的字符串。
    3A。一个行deploy_log.为此创建数据库表版本
    3B。每个版本对应于WebPack Manifest,它在S3下生活$ {修订} / $ {platform} / manifest.json
  4. 如果一个版本被标记为积极的在数据库中,OkCupid将指其对188bet金宝搏官网应的清单。

使用该系统到位,以及用于管理我们部署的基于Web的仪表板,我们能够将我们的文件与Classic一起包含common.49313671.Min.css.命名约定。

仪表板。

我们有:它是一个几乎一对一的替代品曾经是一个大令人困惑的笨拙。然而,“近”,筹集了足够的眉毛,提出了一个实验:我们的一半用户将通过S3获得资产,一半会让他们成为老式的方式。在一个完美的世界中,这些用户组之间的统计数据将是平等的。

如果您已经阅读了这一点,您可能已经知道这两个事实,但是:世界不完美和额外的HTTP请求会产生差异。从S3中获取WebPack清单引入了一个这样的请求,这增加了一个这样的请求,通过足够的毫秒来坦克我们的总数/滑动量增加了约1.5%。不可持续。

如果通过HTTP获取清单不会是一个选项,那么下一个最简单的解决方案似乎将沿着百分之一的JSON储存版本在数据库中并将其提取。“为什么不?”我们问。“这很奇怪,我们早些时候没有开始这样做!”可能是别人说的话。

我部署了大约五分钟后,我收到了来自Erwan,我们的系统架构师的桌面上的点击。在指向他的监视器之后,各种各样的图表都像烟花一样起飞,他解释说,如果我没有回滚任何我刚刚在大约二十分钟内完成的东西,那么数据库将开始无反应。

我滚了回来了。

事实证明,我们的部署日志的后端服务在基础上实现了缓存。我们使用的方法,调用get_active_deploy,回来了版本但没有额外的信息。为了获取部署的清单,a第二方法是必需的。在每个页面视图上。在每个平台上。

你看看我要去哪里。在我对实验不起作用的挫败方面,我将从臀部射击并在不到十分钟的时间内增加Okcupid数据库呼叫的数量约30%。188bet金宝搏官网

随着我的致命的那个方面了解,我们的后端工程师Josh的一些令人难以置信的最后一分钟帮助,创建了一种新的方法,完成了更全面的响应,我们可以要求的所有缓存。我们遇到了实验,这次成功(阅读:没有发生任何事情)。从存储库中删除了扁平文件,我们的部署进程的人为错误可能会显着减少,一切都很好。

无平面文件

大量的Okcup188bet金宝搏官网id的技术债务是在我们的时间决定方面略微提前的结果,以便在之后很快就可以在更广泛采用的方式解决的问题。我们做出自己的床的程度意味着没有人有过这些基础架构问题,更少于解决了它们。习惯于拜占庭和尴尬的系统可以使其难以想象在它之外的事情如何,并且决定专门为某些珍贵的开发人员时间占据潜在的研发来解决方案而不是轻微的。但几个月后,该项目成功了,我们的网络团队的生活质量显着提高了。

本月不久,它需要我完成我的构建过程的心理模型,我被分配了一个叫做类似的票“不要检查编译文件”。大约一年半后,我完成了它。(但是,在那段时间里,票恰好埋藏了,在大约五分钟后,我放弃了试图关闭它。)


如果没有别的,我希望这篇文章激励一些人用一些遗留代码来玩Jenga。如果事实证明是不好的建议,请随时麻烦我推特,或 - 甚至更好 -来这里工作亲自在我身上。