Gitea Action 构建缓存加速指南(实战七)

📝 前言

这是 DevOps 专题的第十篇,回顾一下前几篇的内容:

这一篇我们继续介绍如何使用 Gitea Actions 来配置构建缓存,从而大幅提升构建性能,缩减构建时间。

🧭 背景介绍

随着 DevOps 与自托管 CI/CD 的普及,Gitea Action 作为 Gitea 的内建 CI 解决方案,越来越多被用于中小团队的日常开发与部署流程中。

在每次构建过程中,重复下载安装依赖包是最常见、最耗时的操作。

如何进一步提高构建效率是大家比较关注的问题。

本指南将围绕构建缓存的加速实践展开,帮助你最大化地利用本地资源、提升构建效率,打造更流畅的开发体验。

🔍 使用场景

主要适用于以下场景:

  • 构建时间长、依赖复杂的项目(如 Node.js、Java、Python、Go)
  • 依赖包重复下载安装(如 npm、pip、maven、go modules)
  • 希望将依赖缓存至宿主机或远程缓存服务

📋 前提条件

在开始前,请确认以下环境准备已完成:

🚀 详细步骤

1️⃣ 编写工作流文件

这里我们以一个前端的项目为例,该项目使用yarn作为包管理器。

创建.gitea/workflows/build.yaml文件,内容参考如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# 已隐藏部分配置,限于篇幅这里仅展示关键 action
jobs:
build:
runs-on: host
outputs: # 声明作业的输出变量
datetime: ${{ steps.datetime.outputs.datetime }}
steps:
#.....省去拉取源码等其他配置....
- name: Cache dependencies
# 官方地址: actions/cache@v4
uses: http://git.luhome.com/actions/cache@v4
id: yarn-cache
with:
# 配置需要缓存的路径
path: |
~/.cache/yarn
.next/cache
node_modules
key: ${{ runner.os }}-yarn-${{ hashFiles('yarn.lock') }}
restore-keys: |
${{ runner.os }}-yarn-


# 安装依赖 (如果缓存未命中,才会执行)
- name: Install dependencies
run: |
yarn config set registry https://registry.npmmirror.com/
yarn install
if: steps.yarn-cache.outputs.cache-hit != 'true'

# 这里将 yarn 命令进行拆分,不再将依赖安装和构建放到一起
- name: static build
run: |
yarn build

配置说明:

  • cache action: 这次我们引入了一个新的action cache,这是官方提供的专门用于构建时存储和恢复缓存的。
  • path: 指定要缓存的文件或目录路径,我这里列的是NodeJS的常见路径,如果是其他语言需要换成别的,比如Java 就缓存~/.m2/repository
  • key: 缓存的唯一键,这里我是通过生成yarn.lock的hash作为键的一部分,当yarn.lock 文件发生变更,如引入新的依赖时,缓存就失效。
  • restore-keys: 缓存模糊查找关键词,当 key 没有命中缓存时,系统会依次尝试用restore-keys中的前缀模糊匹配已有缓存。我这里直接写的是很大返回的一个路径,这样即使lock文件轻微改动也能复用部分缓存,避免完全从零开始。
  • steps.yarn-cache.outputs.cache-hit: 在安装依赖的步骤中我们新添加了一个**if判断**,这是由cache action提供的一个变量,当输出为true时则代表命中了缓存,我这里是判断不为true才执行这个步骤,也即是未命中缓存执行安装依赖。

PS: 需要注意的是steps.<yarn-cache>需要跟上一步的**步骤id**保持一致。

2️⃣ 推送代码触发构建

只需将代码推送至 main 分支,Gitea Actions 会自动触发工作流进行构建。

当首次构建时未命中缓存会按正常全部执行,而当第二次再运行时就可以查看到跳过了依赖安装这一步。

可以在 Gitea 的”Actions”界面查看执行进度与日志。

出现圆圈斜杠图标时,则表示该步骤已被跳过了,也即是我们缓存依赖成功啦~

✅ 总结

最后总结一下,不得不说缓存是计算机科学里面非常重要的一项技术。

通过 GitHub 官方的 actions/cache,我们可以在 Gitea Actions 中轻松实现:

  • 高效率构建
  • 避免重复下载依赖
  • 自动化控制缓存命中逻辑

该方案是实现构建加速的首选之一。