缓存依赖项以提升速度
通过复用已生成的依赖项和构建输出实现缓存,大幅提升工作流执行速度
缓存依赖项以提升速度 是 CoddyKit 上的免费 CI/CD with GitHub Actions & DevOps Pipelines 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 CI/CD with GitHub Actions & DevOps Pipelines 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 CI/CD with GitHub Actions & DevOps Pipelines 课程共包含 4 节课。
使用缓存加速工作流程
您是否注意到工作流程每次都会重新下载相同的依赖项?这会拖慢运行速度!
GitHub 操作中的缓存可以存储并重复使用之前运行中的文件,从而显著加快后续工作流程的执行速度。
认识缓存操作
GitHub 提供了一个名为 actions/cache@v3 的特殊操作。此操作旨在保存和恢复文件,让您的工作流程运行得更快。
它非常智能:在尝试恢复缓存之前,会先检查缓存是否已存在;如果不存在,则会保存缓存。
缓存键和路径
actions/cache 的两个关键参数是 key 和 path:
key:用于标识缓存的唯一字符串。如果找到具有此键的缓存,就会将其恢复。path:您希望缓存的文件路径或目录。它告诉操作要保存或恢复哪些内容。
键通常包含依赖项文件的哈希值,以确保依赖项发生变化时缓存会失效。
缓存 Node.js 依赖项
让我们为 Node.js 项目缓存 node_modules。我们将使用 hashFiles,根据 package-lock.json 创建一个动态键。
请尝试运行以下简单的工作流程代码片段:
name: Node.js CI with Cache
on: [push]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Cache Node.js modules
uses: actions/cache@v3
with:
path: node_modules
key: npm-${{ hashFiles('package-lock.json') }}
restore-keys: |
npm-
- name: Install dependencies
run: npm ci
- name: Run tests
run: npm test使用恢复键进行回退
如果您的精确 key 与任何缓存都不匹配,该怎么办?这时,restore-keys 就派上用场了!
restore-keys 提供一个回退键列表,用于搜索缓存。如果主键(例如 npm-${{ hashFiles(...) }})未命中,GitHub 操作会按顺序尝试使用 restore-keys 查找缓存。
在我们的示例中,npm- 会尝试查找所有以“npm-”开头的缓存;如果只有依赖项的小版本发生变化,这会非常有用。
缓存 Python 依赖项
缓存并不只适用于 Node.js!您可以将相同的原则应用于 Python 等其他语言。在这里,我们缓存 Python 的虚拟环境和 pip 缓存。
这里使用 hashFiles('requirements.txt') 生成键,而路径指向虚拟环境和 pip 的缓存目录。
name: Python CI with Cache
on: [push]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.x'
- name: Cache Python dependencies
uses: actions/cache@v3
with:
path: |
~/.cache/pip
.venv
key: pip-${{ hashFiles('requirements.txt') }}
restore-keys: |
pip-
- name: Install dependencies
run: |
python -m venv .venv
.venv/bin/pip install -r requirements.txt
- name: Run tests
run: .venv/bin/python -m unittest discover缓存何时失效
缓存只有在足够新时才有用。如果依赖项发生变化,缓存也应随之变化!
如果您的主 key(例如 npm-${{ hashFiles('package-lock.json') }})发生变化,缓存会自动失效。如果更新了 package-lock.json,哈希值就会变化,并且会创建新的缓存。
您还可以手动更改键来强制重建缓存(例如,添加版本后缀,如 npm-v2-${{ hashFiles(...) }})。
缓存范围和限制
了解缓存的后台工作方式很有帮助:
- 范围:缓存按存储库和分支分别设定范围。
main分支上的缓存不会用于功能分支,除非您明确配置lookup-path。 - 大小限制:每个缓存最大可达 10GB。
- 保留期限:缓存会在最后一次访问后保留 7 天。旧的、未使用的缓存会自动移除。
智能缓存实践
要充分利用缓存:
- 使用
hashFiles:始终将缓存键关联到依赖项清单文件(例如package-lock.json、requirements.txt)。 - 明确指定
path:只缓存必要的内容(例如node_modules、~/.cache/pip)。 - 使用
restore-keys:提供回退键,以提高缓存命中率。 - 避免缓存易变数据:不要缓存经常变化的文件,或每次运行都很大且独有的文件(例如用于部署的构建产物)。
缓存键挑战
您有一个使用 Maven 的 Java 项目。其依赖项定义在 pom.xml 中,Maven 通常会将下载的 JAR 文件存储在 ~/.m2/repository 中。
哪种缓存配置最能确保 Maven 依赖项得到缓存,并在 pom.xml 发生变化时正确失效?
回顾:使用缓存提速
做得很好!您已经学会了如何在 GitHub 操作中实现缓存,从而显著加快持续集成/持续交付工作流程。
actions/cache操作就是您的工具。- 使用
key和path定义缓存的内容和方式。 hashFiles创建动态键,实现智能失效。restore-keys提供有价值的回退键。
通过智能缓存依赖项,您可以节省构建时间和计算资源,让流水线运行得更加高效!
常见问题解答
「缓存依赖项以提升速度」课时是免费的吗?
是的 — 「缓存依赖项以提升速度」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 CI/CD with GitHub Actions & DevOps Pipelines 课程的其余内容,请升级到 CoddyKit PRO。 CI/CD with GitHub Actions & DevOps Pipelines 课程共包含 4 节课。
「缓存依赖项以提升速度」这节课中我会学到什么?
通过复用已生成的依赖项和构建输出实现缓存,大幅提升工作流执行速度 你通过在浏览器中直接运行的动手代码来练习 CI/CD with GitHub Actions & DevOps Pipelines,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 CI/CD with GitHub Actions & DevOps Pipelines 需要有经验吗?
无需任何先前经验。CoddyKit 上的 CI/CD with GitHub Actions & DevOps Pipelines 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。
「缓存依赖项以提升速度」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 CI/CD with GitHub Actions & DevOps Pipelines 课中编写并运行代码吗?
能。每节 CI/CD with GitHub Actions & DevOps Pipelines 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 适用于多环境的矩阵构建
- 缓存依赖项以提升速度
- 可复用工作流与操作
- 条件执行与任务依赖