首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

加 3 行代码减少 80% 构建时间

推荐关注

作者:Whilconn

https://juejin.cn/post/7135756687134162980

背景

最近接手的项目在的构建机上构建耗时比较久,日常构建耗时都在 20min 以上,即使改动一行代码也要构建这么久。构建耗时截图如下:

构建耗时较长导致日常测试和正式发版都会浪费很多时间等待,对研发流程影响较大(主要是我忍不了)。因此需要对构建速度进行优化。

优化思路分析

要优化项目的构建速度,得先了解构建流程:

开发人员推送代码到 ,触发 服务器的

被触发后,会调用提前配置好的

被调用后,会执行对应项目的构建任务

构建任务开始后先拉取项目源码到构建机,再使用构建镜像

构建镜像分为两个阶段,先使用构建前端项目,然后把构建产物拷贝到基础镜像

在这个流程中,可以优化的环节只有构建镜像这一步,其他环节的耗时基本可以忽略不计。而在不大改项目的情况下能起到明显提速效果的方案是:缓存策略。构建镜像时可以用到的缓存包括两类:和。

是指所产生的可重用镜像层,只要中的命令及相关的源文件未改变,就能直接使用这些镜像缓存。这种缓存策略在代码不改变的情况下效果很好,构建耗时甚至可以控制在 10 秒内。而对于日常开发情况下,代码频繁变化,如果应用本身构建时间又很长,则需要使用。(上一篇文章《docker build 缓存失效分析》中有 docker 层缓存相关介绍,也可以看看官方文档[1]、中文文档[2],本文不再赘述)

是指应用构建所产生的中间产物,这些中间产物主要是目录中的物理文件,其中包括下载的依赖包和产生的目录文件。而每次都会初始化全新的环境用于构建,新环境中不存在目录,因此每次都是重新写入而无法复用,得想办法复用该目录下的文件;另外需要开启缓存功能,才会输出缓存文件到目录。

综上,优化思路主要是两点:1、开启应用层构建缓存(如);2、持久化目录,确保每次和都能复用该目录下的文件。

开启应用层构建缓存

项目使用的技术是,构建主要依靠,底层实际调用的是,应用构建缓存主要来自。需要手工开启缓存功能(官方文档传送门[3]),配置属性为即可。

实际操作只有 1 步, 找到设置,代码如下:

本地首次构建,无缓存的情况下,耗时 13min 左右。

启用缓存后在本地进行二次构建,有缓存的情况下,无论是否修改源码构建耗时均为 4min 左右,比优化前的 13min 有明显提升。 构建耗时截图如下:

实际上,的缓存只在和模式下生效,在上述构建测试中其实不起作用。 实测删除中的配置,或者配置为,二次构建时间也是 4min 左右。

之所以构建速度提升了那么多,是因为的配置中开启了和的缓存功能,另外配置也默认开启了缓存功能。从缓存目录中也能看到它们的缓存文件。

所以,这一步其实啥也不用做,如果想进一步提速可以升级到。

持久化目录

想在环境中持久化需要使用到的功能,该功能有几个前置条件:

版本必须高于 18.09

需要手工启用,可在命令前添加环境变量启用

如果前两个条件不满足,则需要具备和构建机的读写权限,以调整构建环境参数

修改,使用运行和指令(说明文档传送门[4])

开启还有其他特性[5],比如输出日志更友好,基本每一步都会输出耗时,就这一条,值了!

实际操作分为 2 步:

1、修改配置,在命令前加上环境变量。修改后镜像构建命令长这样:

2、修改,将和指令改为。修改后长这样:

文档说由于 为实验特性,需要在 文件开头加上如下代码:。在环境下,加了上述代码反而构建报错,原因是加载外网资源失败,删除后构建成功。这不就是玄学吗?

优化结果

在配置好缓存策略后,模拟日常开发修改项目代码触发自动构建流程,构建耗时从 20min+下降到 4min+,总体耗时减少 80%。整个优化过程修改了的一行配置,另外在中添加了3行代码,改动很少但效果很不错。

参考资料

[1]

官方文档: https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#leverage-build-cache

[2]

中文文档: https://vuepress.mirror.docker-practice.com/appendix/best_practices/#%E6%9E%84%E5%BB%BA%E7%BC%93%E5%AD%98

[3]

传送门: https://v4.webpack.js.org/configuration/other-options/#cache

[4]

传送门: https://vuepress.mirror.docker-practice.com/buildx/buildkit/#run-mount-type-cache

[5]

其他特性: https://docs.docker.com/develop/develop-images/build_enhancements/#new-docker-build-command-line-build-output

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20230220A02NS000?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券