ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

使用 Renovate 管理 Hermit 私有包:从 index.json 发布到 defaultRegistryUrls 配置实战

使用 Renovate 管理 Hermit 私有包:从 index.json 发布到 defaultRegistryUrls 配置实战 使用 Renovate 管理 Hermit 私有包从 index.json 发布到 defaultRegistryUrls 配置实战【免费下载链接】renovateHome of the Renovate CLI: Cross-platform Dependency Automation by Mend.io项目地址: https://gitcode.com/GitHub_Trending/re/renovate本文基于 Renovate 仓库中 Hermit 数据源文档 及其配套源码讲解如何让 Renovate 正确发现并升级 Hermit 私有包private packages。读完本文你将掌握 Hermit 私有包仓库的发布约定hermit search --json生成index.json、GitHub Release 命名index、通过packageRules的defaultRegistryUrls完成数据源指向以及配套的令牌与hostRules配置并理解 Renovate 底层拉取与解析index.json的完整调用链。一、背景Hermit 包默认从哪里来Hermit 是 Cash App 开源的跨平台软件包管理工具它通过在仓库中放置可提交的二进制分发文件bin/hermit及*.pkg引用文件让团队无需预装运行时即可获得确定性的开发环境。默认情况下Hermit 从开源项目https://github.com/cashapp/hermit-packages查找软件包Renovate 也在 HermitDatasource 中把该地址声明为默认 registryoverride readonly defaultRegistryUrls [ https://github.com/cashapp/hermit-packages, ];这意味着如果你的依赖全部来自公开的 hermit-packages 仓库Renovate 无需任何额外配置即可自动发现新版本。问题出现在私有包场景——团队内部封装的工具、内网分发的二进制Hermit 需要通过hermit-packages的扩展机制来查找它们。二、Hermit 私有包的搜索清单机制index.jsonHermit 支持私有包private packages其核心机制是搜索清单search manifestHermit 通过hermit search --json导出一份 JSON 格式的包索引Renovate 数据源正是靠读取这份索引来完成包名 → 版本列表的映射。这份清单的每一条记录对应一个包结构定义在 lib/modules/datasource/hermit/types.tsexport interface HermitSearchResult { Name: string; // 包名例如 go Versions: string[]; // 稳定版本列表例如 [1.17.9, 1.18] Channels: string[]; // 频道channel列表例如 [1.17, 1.18] CurrentVersion: string; // 当前版本 Description: string; // 包描述 Repository: string; // 源码仓库地址会被用作 sourceUrl }测试用例 lib/modules/datasource/hermit/index.spec.ts 给出了一个真实示例go包的Versions为[1.17.9, 1.17.10, 1.18, 1.18.1]Channels为[1.17, 1.18]。注意 Channel 以开头用于与普通版本号区分——这一点在 版本处理 中会再次出现。三、四步接入把私有包发布给 Renovate原文档给出了让 Renovate 发现私有包的完整流程下面按步骤展开并补充每一步的实操细节与底层依据。第 1 步生成 index.json在**你私有的 Hermit 发行版distribution**上执行hermit search --json将输出保存为index.json。这份文件就是后续 Renovate 读取的包索引必须由安装了私有包的 Hermit 环境生成这样团队内部包才会出现在清单中。第 2 步以名为 index 的 Release 发布 index.json在你的私有包仓库中创建一个 GitHub ReleaseRelease 名称必须为index并将第 1 步生成的index.json作为该 Release 的 asset 上传。这个命名约定是 Renovate 数据源硬编码的查找规则见 lib/modules/datasource/hermit/index.ts#L132-L134const indexRelease await this.http.getJsonUncheckedGithubRestRelease( ${apiBaseUrl}repos/${owner}/${repo}/releases/tags/index, );数据源通过 GitHub REST API 请求releases/tags/index找到名为index的 Release然后从assets中筛选出名为index.json的 asset第 137-139 行const asset indexRelease.body.assets.find( (asset) asset.name index.json, );如果找不到该 asset数据源会返回空结果并给出告警日志cant find asset index.json in the given registryUrl。第 3 步用 CI 持续刷新索引配置一条 CI 流水线在私有包仓库每次有新提交时重复第 1、2 步重新生成index.json、重新发布/更新名为index的 Release。这样 Renovate 每次查版本时拿到的都是最新索引新发布的私有包版本才能被及时发现。从源码看Renovate 对清单的拉取带有一层包缓存见 getHermitSearchManifest 与 getReleases因此 CI 更新后索引的生效存在合理的缓存延迟属于预期行为。第 4 步为 Hermit manager 配置包规则在 Renovate 配置renovate.json中为 Hermit manager 添加packageRules用defaultRegistryUrls指向你的私有包仓库{ packageRules: [ { matchManagers: [hermit], defaultRegistryUrls: [ https://github.com/your/private-hermit-packages ] } ] }配置生效后Renovate 对 Hermit 依赖的版本查询会优先使用该 registry。数据源中registryStrategy firstindex.ts#L25意味着按 registry 列表顺序取第一个可用结果这也解释了为什么把私有包仓库放在defaultRegistryUrls第一位即可覆盖默认的 cashapp/hermit-packages。四、源码级原理HermitDatasource 如何工作理解数据源实现有助于排查版本查不到类问题。完整实现位于 lib/modules/datasource/hermit/index.ts关键调用链如下入参校验registryUrl必须存在且是合法 URL第 51-60 行并且只支持 GitHub 地址——非https://github.com/开头的 registry 会被直接拒绝并告警第 62-65 行。解析 owner/repo通过正则^/(?owner[^/])/(?repo[^/])$第 42 行从路径中提取仓库所有者与名称因此 registry URL 应形如https://github.com/owner/repo多余路径会导致解析失败。拉取清单请求 GitHub APIrepos/{owner}/{repo}/releases/tags/index拿到 Release 元数据找出名为index.json的 asset。下载 asset以accept: application/octet-stream请求头流式下载 asset 内容第 155-161 行——源码注释明确指出访问私有 GitHub 仓库的 asset 必须使用该头这是下载私有仓库 Release asset 的必要条件。解析与匹配将 JSON 解析为HermitSearchResult[]按packageName精确匹配Name字段第 73 行未命中则返回 null。构造版本列表把Versions与Channels合并为 releases并统一带上sourceUrl取自记录的Repository字段第 82-95 行。整个流程有两层缓存保护getReleases以registryUrl packageName为 key 做包缓存getHermitSearchManifest以 registry URL 为 key 缓存清单避免重复请求。五、数据源边界与失败场景测试文件 lib/modules/datasource/hermit/index.spec.ts 覆盖了大量失败路径可作为排障清单非 GitHub registry如https://gitlab.com/...→ 返回 nullregistry URL 缺少 owner 或 repo、或带多余路径 → 返回 nullregistryUrl 为空或非法→ 返回 nullRelease 中没有index.jsonasset→ 返回 nullindex.json内容无法解析为合法 JSON→ 返回 null清单中找不到目标包名→ 返回 null调试日志Could not find hermit package ...网络错误如 asset 下载 404→ 直接抛出异常。也就是说一旦发现 Renovate 未对私有包发起更新优先按上述顺序检查registry URL 是否形如https://github.com/owner/repo、Release 是否命名为index、asset 是否命名为index.json、内容是否为合法 JSON、包名是否与Name完全一致。六、配套的 Manager 行为依赖如何被发现与升级仅配好数据源还不够Hermit managerlib/modules/manager/hermit决定了依赖从哪里读取、升级时如何落地依赖提取extract.ts 扫描bin目录下形如.{packageName}-{version}.pkg的文件把文件名解析为依赖频道文件{name}channel.pkg的版本会以channel形式记录。文件匹配与提交排除default-config.ts 声明managerFilePatterns: [/(^|/)bin/hermit$/]并以excludeCommitPaths: [**/bin/hermit]排除该文件的提交——它只作为触发更新的标记。版本升级update.ts 会在bin/hermit文件末尾追加一行#hermit updated注释。Hermit 没有传统意义上的清单文件可改这行注释的唯一作用是触发 artifact 更新流程。制品更新artifacts.ts 随后执行./hermit install pkg-newVersion必要时先uninstall旧包再通过git状态扫描把bin下新增/修改/删除/重命名的链接文件作为更新结果返回若命令执行失败会把 stderr 包装进UpdateHermitError反馈到 PR 中。七、私有包安装令牌与 hostRules 传播升级私有包时hermit install需要权限下载私有仓库内容。Hermit manager 文档lib/modules/manager/hermit/readme.md说明会依次使用以下两个环境变量作为令牌HERMIT_GITHUB_TOKEN GITHUB_TOKEN你可以通过 Renovate 的customEnvironmentVariables配置注入例如{ customEnvironmentVariables: { HERMIT_GITHUB_TOKEN: ${TOKEN} } }此外在hostRules中配置的 Git 凭据会被自动通过GIT_CONFIG_*环境变量传播给hermit install源码见 artifacts.ts#L16 的withGitEnvironment([hermit])因此只要hostRules已覆盖私有 Git 仓库Hermit 就能直接拉取私有包无需额外配置。这两种方式都建议优先使用HERMIT_GITHUB_TOKEN因为它语义更明确、仅作用于 Hermit 场景。八、嵌套 Hermit 与多环境目录对于在单个仓库中同时存在根级与嵌套目录如bin/hermit与nested/bin/hermit的嵌套 Hermit 布局Renovate 同样支持。manager 的managerFilePatterns会匹配任意层级的bin/hermitartifacts 更新也以对应bin目录为粒度执行因此根级与嵌套环境的依赖可以各自独立升级不会互相干扰。九、版本语义Version 与 Channel 的区分Hermit 依赖的版本号既可能是稳定版本也可能是频道Channel。数据源在返回版本列表时会把两者合并index.ts#L86-L95而版本比较逻辑位于 lib/modules/versioning/hermit/index.ts版本号支持major.minor.patch.supplement_build-prereleasecompatibility结构兼容 OpenJDK JEP 322 的 supplement 段以开头的字符串被视为 Channel_isChannel解析时去掉前缀再比较数字段Channel 被视为不稳定版本isStable返回 false版本比较时按数字段逐位比较缺段按较短者处理matches对 Channel 采用等值比较对普通版本走 semversatisfies。这意味着 Renovate 既能升级固定版本1.18.1也能处理频道跟随1.18并在默认策略下不会把不稳定的 Channel 误判为稳定版本。十、完整配置示例与排障速查一个同时覆盖公开源默认行为与私有包接入的完整示例{ packageRules: [ { matchManagers: [hermit], defaultRegistryUrls: [ https://github.com/your/private-hermit-packages ] } ], customEnvironmentVariables: { HERMIT_GITHUB_TOKEN: ${HERMIT_GITHUB_TOKEN} } }常见问题速查现象检查点依据私有包版本无更新registry URL 是否形如https://github.com/owner/repoindex.ts#L62-L65找不到包Release 是否命名为index、asset 是否叫index.jsonindex.ts#L132-L147解析失败index.json是否为HermitSearchResult[]合法 JSONindex.ts#L163-L169安装私有包 401/403是否设置HERMIT_GITHUB_TOKEN/GITHUB_TOKEN或 hostRules 凭据manager/hermit/readme.md通过上述配置与源码级理解你可以在不改变团队 Hermit 工作流的前提下让 Renovate 对私有包与公开包一视同仁地完成版本发现、PR 生成与 artifact 更新。【免费下载链接】renovateHome of the Renovate CLI: Cross-platform Dependency Automation by Mend.io项目地址: https://gitcode.com/GitHub_Trending/re/renovate创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表