我如何将部署时间切成分数,并通过github动作实现了闪电的部署
#javascript #网络开发人员 #生产率 #githubactions

想象一下,将您的CI/CD管道时间从26分钟削减到仅1分钟的时间。

听起来像是一个梦,对吗?

好吧,我去过那里并在Notionlytics做到了这一点。它只需要一系列的性能优化和一些创造性的思维。

所以,让我们潜入并探索我用来实现这一显着改进的技术。

Taylor swift dive

切换齿轮

PNPM

首先,我进行了两个至关重要的基础设施。我告别了Yarn,并接受了以速度和效率而闻名的包装经理pnpm。 PNPM凭借其三阶段的安装过程,迅速处理依赖项分辨率,目录结构计算和链接依赖项。

结果?

安装时间的显着改善。

Turborepo

继续前进,我将NXTurborepo交换为管理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

那样简单。该设置无麻烦,并且可以无缝地工作。

An excited little girl

部署

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