加速 CI/CD
缓存用于加速 CI/CD。让我们在本课中学习如何使用缓存。
你目前已经定义了两个 GitHub 工作流。对于每个新服务,你将引入一个新的工作流,以真正实现服务之间的独立性。当仅有一个服务发生变化时,这也能显著加快 CI/CD 流水线的速度。当拉取请求合并到 master 分支时,工作流文件会按顺序为指定服务执行两个任务:
- test
- deploy
这两个任务首先安装根目录的 NPM 包,然后安装所有服务的所有 NPM 包。当我们处理拉取请求并频繁推送更改时,这种重复性操作非常耗时,整个工作流运行大约需要 5 分钟。随着我们可能添加更多步骤或安装新的 NPM 模块,这个时间只会越来越长。
利用缓存
我们可以利用 缓存 显著提升流程速度!点击 Run 并开始创建一个新分支:
1git switch -c speed-up-CI-CD
我们只需要在两个工作流配置中,每个任务的 actions/checkout@v2 步骤之后添加以下步骤即可。
1- name: Restore dependencies 2 id: cache 3 uses: actions/cache@master 4 with: 5 path: | 6 node_modules 7 */*/node_modules 8 */*/*/node_modules 9 */*/*/*/node_modules 10 key: ${{ runner.os }}-${{hashFiles('**/package-lock.json')}}
只要任意一个 package-lock.json 文件没有变化,我们就会使用缓存的 node_modules 目录,每个工作流步骤可节省约 60 秒。随着我们添加更多服务,node_modules 目录中的 NPM 包越来越多,节省的时间也会持续增加。
首先,关于上面带有 * 的三个 node_modules 路径。这是为了覆盖以下目录:
services/web/node_modulesservices/web/firebase/node_modulesservices/web/firebase/functions/node_modules
通过更多优化,可以进一步提高效率,但上述方式已经是一个合理且有效的起点,足以展示缓存的能力。
使用缓存变量
此缓存步骤会输出一个变量,告诉我们缓存是否命中。如果命中缓存,我们可以跳过接下来的两个步骤:
- 安装依赖
- 启动所有服务
要配置这一点,请更新两个工作流配置文件 services-web-firebase-functions-src-firestoreposts-on-create-cross-post-to-devto.yml 和 services-web.yml 中的上述两个步骤,使其匹配如下内容:
1- name: Install dependencies 2 if: steps.cache.outputs.cache-hit != 'true' 3 run: npm install 4- name: Bootstrap all services 5 if: steps.cache.outputs.cache-hit != 'true' 6 run: npm run bootstrap
点击 Run 保存更改。
No configuration found for ID: 916a84594e915182c4cc44c76b7e88440bedecb5835c45b1fdd38c25d35c6065
PRESS RUN 将代码推送到 GitHub。
No configuration found for ID: 258e8b21ffd0dbb01e545271ee802454f2dd0e373a3cf0e40ffa594935b721ea
前往你的 GitHub 仓库,为 speed-up-CI-CD 分支创建并合并拉取请求。如需帮助,请参考课程中关于创建拉取请求的课时。