想象一下,将您的CI/CD管道时间从26分钟削减到仅1分钟的时间。
听起来像是一个梦,对吗?
好吧,我去过那里并在Notionlytics做到了这一点。它只需要一系列的性能优化和一些创造性的思维。
所以,让我们潜入并探索我用来实现这一显着改进的技术。
切换齿轮
PNPM
首先,我进行了两个至关重要的基础设施。我告别了Yarn,并接受了以速度和效率而闻名的包装经理pnpm。 PNPM凭借其三阶段的安装过程,迅速处理依赖项分辨率,目录结构计算和链接依赖项。
结果?
安装时间的显着改善。
Turborepo
继续前进,我将NX与Turborepo交换为管理Monorepos。 TurborePo的缓存任务对于存储构建,测试和绒毛等各种脚本的结果和日志证明是无价的。此外,其并行任务执行大大减少了构建时间。
nx无疑令人印象深刻,说实话,我已经习惯了。尽管如此,现在是时候进步了:TurborePo提供了一种更简单的方法,感觉更快。
如果可以的话,请我
PNPM
为了最大化性能提高,我将缓存纳入了我们的CI工作流程。
利用actions/cache action动作,我们实施了一种策略来存储和检索依赖关系,以防止冗余安装。
这是完成方法:
- name: Configure pnpm cache
id: pnpm-cache
run: echo "STORE_PATH=$(pnpm store path)" >> $GITHUB_OUTPUT
- uses: actions/cache@v3
with:
path: ${{ steps.pnpm-cache.outputs.STORE_PATH }}
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
restore-keys: |
${{ runner.os }}-pnpm-store-
Turborepo
现在,对于令人兴奋的部分: turborepo缓存。首先,优势在于TurborePo在初始构建后记住输出的能力。随后的构建仅重建发生了变化的内容。
但是,等等,还有更多!
turborepo还提供 turborepo远程缓存功能,使我们能够在CI构建之间保留构建输出。
虽然Vercel充当Turbo的默认远程缓存目的地,但我偶然发现了一个了不起的发现:setup-github-actions-caching-for-turbo-一种github动作,可以在Github Actions本身内构建工件的缓存,而无需任何额外的费用!
这是如何设置它的方法:
- name: Configure Turbo cache
uses: dtinth/setup-github-actions-caching-for-turbo@v1
那样简单。该设置无麻烦,并且可以无缝地工作。
部署
Cloudflare页面
部署是CI/CD管道中的关键时刻,因此我通过从Vercel托管到Cloudflare Pages进行了优化此阶段。
CloudFlare页面由于使用Wrangler CLI的并行部署,提供永远无静态资产的托管和Lightning-Fast File Hoshing,因此出现了清晰的获胜者。
一个值得注意的优势是用于部署CloudFlare的CLI会自动对资产进行哈希检查。这意味着,如果您使用代码拆分,则只能上传更改的块,从而更快地部署。
语义释放
要进一步简化部署,我介绍了semantic-release。此工具自动将提交标签自动化并跟踪自上一个版本以来的更改。结果,部署现在仅在出现新标签时才发生,为我们节省了宝贵的分钟。
基准
所以,让我们谈谈数字。
最初,包括静态的monorepo。代码更改。随着项目的增长,这次只会增加。
但是,在实施所有性能优化之后,以下是我们获得的结果:
- 没有缓存: 12分6秒(降低50%!)
- 使用缓存:
- node.js: 7分钟和1秒(由于构建和推动Docker映像而导致相对较慢)
- React Cra应用程序: 3分22秒
- Next.js应用: 1分钟和19秒
- 基础架构/文档/繁琐的变化: 1分钟2秒
我会说这些是相当不错的改进:我们不仅将CI/CD管道持续时间削减了一半以上,而且我们现在有更快的响应时间来改变MonorePo的任何一部分。现在,我们可以将功能和错误修复到生产速度更快,压力更少。
。感谢您的阅读!
您对这些结果有何看法?您想分享任何提示吗?让我们在下面的评论中继续对话。
P.S。:如果您喜欢这个 - 您可能会喜欢我最近做的其他一些事情:
AI-powered changelog updates on Slack, every Monday, with GitHub Actions
You'll never have to deal with outdated TODO comments again
在Twitter上关注我:@MaxPrilutskiy