Renovate Forgejo Tags 数据源全解析:从 Git 标签到自动化依赖更新
【免费下载链接】renovateHome of the Renovate CLI: Cross-platform Dependency Automation by Mend.io项目地址: https://gitcode.com/GitHub_Trending/re/renovate
本篇技术指南以 Renovate 仓库中 lib/modules/datasource/forgejo-tags/readme.md 为核心,系统讲解forgejo-tags数据源的工作原理、API 调用链、配置方式与典型使用场景(pre-commit、GitHub Actions)。读完你将掌握如何让 Renovate 从 Forgejo 仓库的 Git 标签中读取版本、解析提交摘要(digest),并正确配置私有 Forgejo 实例的注册源。
一、什么是 forgejo-tags 数据源
forgejo-tags是 Renovate 内置的数据源(datasource)之一,其作用是从 Forgejo。
按 readme.md 的说明,该数据源默认使用https://code.forgejo.org作为注册源来查找标签,这与源码中static readonly defaultRegistryUrls = ['https://code.forgejo.org']的定义完全一致:
static readonly defaultRegistryUrls = ['https://code.forgejo.org'];也就是说,当你在配置中没有显式指定registryUrls时,Renovate 会自动把查询目标指向 Forgejo 官方实例 code.forgejo.org。
二、工作原理:底层 API 调用链
ForgejoTagsDatasource继承自 lib/modules/datasource/datasource.ts 中的基础Datasource类,并使用专门的 HTTP 客户端ForgejoHttp(定义于 lib/util/http/forgejo.ts)发起请求。整个数据获取过程可以分为三个核心方法。
2.1 版本列表:getReleases
getReleases负责拉取仓库的全部标签列表,其核心逻辑位于_getReleases(index.ts):
const url = `${ForgejoTagsDatasource.getApiUrl(registryUrl)}repos/${repo}/tags`; const tags = (await this.http.getJson(url, { paginate: true }, Tags)).body;请求的 API 端点为GET /api/v1/repos/{owner}/{repo}/tags,其中packageName直接作为仓库路径使用(例如forgejo-helm/forgejo-helm)。请求开启了paginate: true,由ForgejoHttp的requestJsonUnsafe实现自动翻页——它读取响应头x-total-count获取总数,并循环递增page查询参数,直到把所有标签全部拉齐(见 forgejo.ts)。
拿到原始 JSON 后,数据会经过 schema.ts 中基于 zod 的运行时校验,只保留需要的字段:
const TagCommit = z.object({ sha: z.string(), created: MaybeTimestamp, }); export const Tag = z.object({ name: z.string(), commit: TagCommit, });随后被映射为标准化的ReleaseResult:
releases: tags.map(({ name, commit }) => ({ version: name, gitRef: name, newDigest: commit.sha, releaseTimestamp: commit.created, })),每个标签都会生成包含version(标签名)、gitRef(标签名)、newDigest(标签指向的提交 SHA)、releaseTimestamp(标签创建时间)的发布记录。测试用例 index.spec.ts 验证了这一映射:输入v13.0.0标签后,输出version: 'v13.0.0'、newDigest: '35fcb41c...'、releaseTimestamp: '2023-08-21T16:27:29.000Z'等结构化数据。
2.2 提交摘要:getDigest
getDigest的行为取决于是否传入newValue(index.ts):
- 传入
newValue(目标标签)时:调用getTagCommit,请求GET /api/v1/repos/{repo}/tags/{tag},返回该标签指向的 commit SHA; - 未传入
newValue时:请求GET /api/v1/repos/{repo}/commits?stat=false&verification=false&files=false&page=1&limit=1,返回仓库默认分支最新一次提交的 SHA;若仓库没有任何提交,则返回null(该分支场景在 index.spec.ts 中有专门测试覆盖)。
这种"标签摘要 + 分支最新提交"的双模式设计,使forgejo-tags既能支撑标签版本更新,也能支撑基于当前分支状态的 digest 刷新。
2.3 注册源地址的规范化
getApiUrl和getRegistryURL两个静态方法负责地址规范化(index.ts):如果用户传入的registryUrl末尾带/api/v1,会被先剥离,再统一补上/api/v1/后缀,保证无论用户配置哪种写法都能正确拼接 API 路径。
三、配置方式
3.1 基本配置
forgejo-tags数据源支持标准的 Renovate 配置字段:datasource、packageName、registryUrls。默认注册源为https://code.forgejo.org,无需任何配置即可使用:
{ "packageRules": [ { "matchDatasources": ["forgejo-tags"], "matchPackageNames": ["forgejo-helm/forgejo-helm"], "versioning": "semver" } ] }其中packageName即owner/repo形式的仓库标识,例如forgejo-helm/forgejo-helm;它同时被用于拼接sourceUrl(registryUrl + packageName,见getSourceUrl),因此 Renovate 生成的 PR 可以正确关联到源码仓库。
3.2 使用私有/自建 Forgejo 实例
若你的标签托管在私有或自建的 Forgejo 实例上,通过registryUrls覆盖默认地址即可。以下配置让 Renovate 从https://git.example.com查询标签:
{ "packageRules": [ { "matchDatasources": ["forgejo-tags"], "matchPackageNames": ["my-org/my-tool"], "registryUrls": ["https://git.example.com"] } ] }ForgejoTagsDatasource.getRegistryURL会以用户提供的registryUrl优先,仅在缺失时回退到默认的 code.forgejo.org。
3.3 私有仓库的鉴权
私有仓库场景下,还需配合 hostRules 配置 token。Renovate 的 hostRules 匹配机制会为forgejo-tags数据源(hostType 为forgejo)应用对应主机的凭据。例如在renovate.json中:
{ "hostRules": [ { "matchHost": "git.example.com", "hostType": "forgejo", "token": "your-forgejo-token" } ] }结合私有 Forgejo 实例的registryUrls,即可让 Renovate 在鉴权通过后拉取私有仓库的标签列表。
四、典型应用场景:pre-commit 与 GitHub Actions
forgejo-tags不是孤立的数据源,它在 Renovate 的多个 manager 中被实际使用,这也是它最典型的落地场景。
4.1 pre-commit 钩子仓库
lib/modules/manager/pre-commit/extract.ts 中的determineDatasource函数会根据仓库地址自动判定数据源:当 pre-commit 配置中的仓库地址指向 Forgejo 平台时(detectPlatform(repository) === 'forgejo'),会返回:
return { datasource: ForgejoTagsDatasource.id, registryUrls: [`https://${hostname}`], };即自动使用forgejo-tags数据源,并以仓库 hostname 作为注册源。这意味着你的.pre-commit-config.yaml中形如repo: https://code.forgejo.org/owner/repo的钩子条目,会被自动识别并跟踪其 Git 标签更新。该逻辑还支持通过 hostRules 中 hostType 为forgejo的规则进一步确认(extract.ts)。
4.2 GitHub Actions / 自托管 Actions
lib/modules/manager/github-actions/extract.ts 同样引入了ForgejoTagsDatasource(第 211 行附近),用于解析自托管 GitHub Actions 中指向 Forgejo 仓库的引用,使uses: https://code.forgejo.org/owner/action@v1.2.3这类引用也能获得标签版本更新。
4.3 与 gitea-tags 的关系
需要特别说明的是,Forgejo 与 Gitea 同源但分叉,Renovate 社区正逐步将 Forgejo 支持从gitea-tags数据源迁移到独立的forgejo-tags。lib/modules/datasource/gitea-tags/readme.md 中明确提示:使用 Forgejo 的用户应改用forgejo-tags数据源,并且未来版本将从gitea-tags中移除 Forgejo 支持。因此新的集成应优先选用forgejo-tags。
五、缓存机制
为避免对 Forgejo API 的重复请求,getReleases、getTagCommit、getDigest三个入口都通过 lib/util/cache/package/with-cache.ts 中的withCache包装。缓存命名空间为datasource-forgejo-tags,缓存键由注册源、仓库名和类型拼接而成:
static getCacheKey(registryUrl, repo, type): string { return `${ForgejoTagsDatasource.getRegistryURL(registryUrl)}:${repo}:${type}`; }不同操作使用不同的type后缀(tags、tag-${tag}、digest),互不干扰;getReleases与getDigest还启用了fallback: true,在缓存异常时可回退到真实请求,保证数据源的高可用性。
六、测试验证:行为即契约
lib/modules/datasource/forgejo-tags/index.spec.ts 通过 httpMock 完整覆盖了数据源的对外行为契约,可作为理解其语义的权威参考:
- getReleases:分别验证了默认注册源(code.forgejo.org)与自定义注册源(codeberg.org)下标签列表的拉取与映射;
- getDigest:验证了未传
newValue时从 commits 接口取最新提交 SHA,以及仓库无提交时返回null; - getTagCommit:验证了传入
newValue(如v9.0.1)时,通过GET /api/v1/repos/{repo}/tags/{tag}返回对应 commit SHA。
这些测试同时印证:自定义注册源(如 Codeberg)完全兼容该数据源——只要是 Forgejo 兼容的 API 实现,都可以通过registryUrls接入。
七、小结
forgejo-tags数据源是 Renovate 生态中针对 Forgejo 平台的官方标签查询方案,其核心要点可以归纳为:
- 默认注册源为
https://code.forgejo.org,可通过registryUrls覆盖为任意 Forgejo 兼容实例; - 通过
GET /api/v1/repos/{owner}/{repo}/tags自动分页拉取全部标签,并标准化为带gitRef、newDigest、releaseTimestamp的发布记录; getDigest支持"指定标签取摘要"与"默认分支最新提交"两种模式;- 在 pre-commit 与 GitHub Actions 场景中被自动选用,实现 Forgejo 仓库引用的全自动版本跟踪;
- 内置
datasource-forgejo-tags缓存命名空间,降低 API 调用压力。
如需深入了解,可继续阅读 数据源实现、响应校验 schema、HTTP 客户端与分页实现 及 测试用例。
【免费下载链接】renovateHome of the Renovate CLI: Cross-platform Dependency Automation by Mend.io项目地址: https://gitcode.com/GitHub_Trending/re/renovate
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考