RHDH 基础镜像技能
该技能使用捆绑脚本,而不是重新构建各仓库特定的逻辑。仓库检出是用户明确指定的输入,该技能不会自行发现其他技能的路径。
一、用途与路由
- 只读的当前/最新镜像扫描:加载 workflows/update-base-images.md,然后运行 scripts/base-images-and-rpms.sh --analyze ...
- 解释仓库规则:references/repos.md
- 预览更新:workflows/update-base-images.md,然后 scripts/base-images-and-rpms.sh --dry-run ...
- 更新镜像、锁文件、Node 头文件、catalog builder、overlays node 或 Go 工具链:workflows/update-base-images.md
一次扫描会按仓库报告:每个 FROM 镜像及其当前和最新标签、文件内 UBI 次要版本偏差、Node 或 Go 工具链漂移、它读取的注册表和分支,以及任何无法读取的内容。
二、写入规则
任何检出、分支、文件编辑、依赖安装、提交、推送或 PR 都属于写入操作。应先运行只读发现或 --dry-run,再遵循 /mutation-gate:说明每个操作及其目标仓库和分支(例如 rhdh:release-1.10)、确切命令、将产生的变更,以及若失败其余操作会如何;获得对该说明集合的批准;执行;然后将每个操作报告为已完成、失败或跳过,并列出其更改的资源和剩余风险。
安装 rpm-lockfile-prototype、登录注册表、使用 --push 以及打开 PR 各自都是独立操作。默认采用本地、不推送行为;不要直接推送到受保护分支。写入前验证分支存在且工作树干净。
当用户在批准后要求推送并打开 PR/MR 时,应按名称调用 /rhdh-pr-mr(或其 create-pr-mr.sh),而不是手工使用 gh pr create / glab mr create。若已知 Jira key,传入 --issue;省略则跳过关联。Midstream 的 updateBaseImages.sh 仍使用 distgit createPR.sh,直到该路径迁移。
三、仓库不变量
- 可接受的分支选择器为 main 或 release-*;将它们映射到 references/repos.md 中记录的 GitLab scripts 分支。
- 保持基础镜像 UBI 次要版本与 RPM 仓库 URL 对齐。
- 在重新生成 rpms.lock.yaml 之前,将 OpenShift 客户端 N-el9-beta baseurl 值以及 rpms.in.yaml 中匹配的 rhocp-N-for-rhel-9-$basearch-rpms repoid 提升到 mirror.openshift.com 上仍然存在的最新已发布 4.y 流(例如 4.21-el9-beta → 4.22-el9-beta)。已发布的 4.y 名称来自 https://access.redhat.com/support/policy/updates/openshift#dates 所链接的产品生命周期 API。不要移动到未发布的目录,例如 4.23-el9-beta 或 5.1-el9-beta。如果生命周期获取失败,或镜像上没有已发布的 4.y 目录,则保持 rpms.in.yaml 不变。当文件没有此类 repo 时跳过。
- 当运行中包含 plugin-catalog 检出时,将 build/containerfiles/builder.Containerfile 的 /rhocp/4.N/ 路径段重写为同一个最新已发布的 4.y(例如 /rhocp/4.21/ → /rhocp/4.22/)。保持 ocp-tools URL 不变。生命周期获取失败时不要重写。
- 当该 Containerfile 在同一次运行中发生变化时,递增其 release="N" 标签,并一次性在 konflux.additional-tags 中递增匹配的 X.Y-N 令牌(release="3" 和 2.2-3 变为 release="4" 和 2.2-4)。将 version=、rhdh.version= 和 node-v* 留给 node 头文件重写。将每个 .tekton/plugin-catalog-builder*.yaml build-source-image 任务上的 BASE_IMAGES 设置为 Containerfile 的 FROM 镜像,缺少时插入该参数。Containerfile 未变化时不要提升 release。
- 当 RPM Containerfile 使用 dnf/microdnf install --installroot(operator 空 rootfs)时,使用 rpm-lockfile-prototype --bare 重新生成锁文件,以便锁定完整闭包(glibc、coreutils、bash)。不要传 -f;那会加载 UBI rpmdb 并省略这些包。分层安装到基础镜像仍使用 -f。如果求解失败(nothing provides、conflicting requests),恢复 rpms.lock.yaml / rpms.in.yaml 且不要推送。
- 在 RHDH 上,当 builder 镜像更改 Node 时更新 Node 头文件。然后,当这些检出在范围内时,将 plugin-catalog build/containerfiles/builder.Containerfile 的 FROM 固定到相同的 UBI Node 标签@sha256。Catalog 头文件遵循该 Containerfile 将运行的 Node 版本:image node --version,或当文件在头文件 RUN 之前 dnf 安装 nodejs 时,使用 dnf repoquery 得到的较新 nodejs RPM。不要将较旧的 rhdh .nvm/ 复制到该版本上。重写 konflux.additional-tags 的 node-v* 以匹配 catalog .nvmrc,并将 overlays versions.json 的 node 设置为 rhdh .nvmrc 值。Catalog 映射 release-1.Y → GitLab rhdh-1.Y-rhel-9,release-2.Y → GitLab release-2.Y(使用 UBI10 / RHEL10)。Catalog 没有 rpms.lock.yaml。不要对 catalog builder 提交使用 [skip-build]。
- 在 rhdh-operator main 上,当镜像较新时,将 go.mod 提升到 Go 工具集镜像。绝不要为了匹配较旧镜像而降低 go 或 toolchain;较新的 pin(例如来自 Renovate)是有效的。
- 从镜像扫描中排除 RHDH e2e-tests/ 和 .ci/。
- 忽略匹配 No sources found for 或 "no matching sources" 的 rpm-lockfile-prototype 行。这些源 RPM 通常未发布;二进制锁文件仍然有效。不要将它们报告为未读取、失败或剩余风险。
另一个技能按名称调用 /rhdh-base-images 并使用其报告内容;它从不访问这些脚本路径。/rhdh-konflux-tasks 在流 Konflux 提升期间执行此操作,以便 Node 头文件与 builder 镜像匹配;它传入具名检出和 main 或 release-* 选择器。
四、完成标准
当范围内每个仓库都被命名为其当前和最新标签、UBI 偏差和工具链漂移被说明或说明为无、扫描无法读取的每个注册表、锁文件或分支都被列为未读取而非报告为当前时,分析即完成。被过滤的 No sources found for / "no matching sources" 行不属于未读取,并从报告中省略。
当在任何编辑前已针对干净工作树验证目标分支存在、每个已批准操作都已按目标和结果报告、推送和 PR 状态被明确说明(包括保留默认本地行为时的“未推送”)时,更新即完成。当 Node 头文件 / .nvmrc 发生变化时,说明 plugin-catalog FROM 旧→新,确认 grep konflux.additional-tags build/containerfiles/builder.Containerfile 包含与 .nvmrc 匹配的 node-v,并说明 overlays versions.json 的 node 值(或这些检出不在范围内)。当 catalog builder Containerfile 发生变化时,说明 release 旧→新,并确认 builder PipelineRun BASE_IMAGES 与该文件的 FROM 匹配(或 Containerfile 未变化)。