Use the bundled scripts instead of reconstructing their repository-specific logic.
Repository checkouts are explicit inputs the user names. This skill never discovers another skill's paths.
Route
| Intent | Load or run |
|---|---|
| Read-only current/latest image scan | workflows/update-base-images.md, then scripts/base-images-and-rpms.sh --analyze ... |
| Explain repository rules | references/repos.md |
| Preview an update | workflows/update-base-images.md, then scripts/base-images-and-rpms.sh --dry-run ... |
| Update images, lockfiles, Node headers, catalog builder, overlays node, or Go toolchain | workflows/update-base-images.md |
A scan reports, per repository: every FROM image with its current and latest
tag, UBI minor skew within a file, Node or Go toolchain drift, the registries and
branches it read, and anything it could not read.
Writing rules
Any checkout, branch, file edit, dependency install, commit, push, or PR is a
write. Run read-only discovery or --dry-run first, then follow
/mutation-gate: state each operation with its target repository and branch
(rhdh:release-1.10), the exact command, the change it will land, and what
happens to the remaining operations if it fails; get approval for that stated
set; execute; then report every operation as completed, failed, or skipped, with
the resources it changed and the risks that remain.
Installing rpm-lockfile-prototype, logging into registries, using --push, and
opening PRs are each their own operation. Default to local, no-push behavior; do
not push directly to protected branches. Verify the branch exists and the working
tree is clean before writing.
When the user asks to push and open a PR/MR after approval, invoke /rhdh-pr-mr
by name (or its create-pr-mr.sh) instead of hand-rolling gh pr create /
glab mr create. Pass --issue when a Jira key is already known; omit it to
skip linking. Midstream updateBaseImages.sh still uses distgit createPR.sh
until that path is migrated.
Repository invariants
- Accepted branch selectors are
mainorrelease-*; map them to the documented GitLab scripts branch inreferences/repos.md. - Keep base-image UBI minors aligned with RPM repository URLs.
- Before regenerating
rpms.lock.yaml, bump OpenShift clientsN-el9-betabaseurlvalues and matchingrhocp-N-for-rhel-9-$basearch-rpmsrepoids inrpms.in.yamlto the latest released 4.y stream that still exists on mirror.openshift.com (for example4.21-el9-beta→4.22-el9-beta). Released 4.y names come from the product life cycle API linked from https://access.redhat.com/support/policy/updates/openshift#dates. Do not move to an unreleased directory such as4.23-el9-betaor5.1-el9-beta. If the life cycle fetch fails, or no released 4.y directory is on the mirror, leaverpms.in.yamlunchanged. Skip when the file has no such repo. - When a plugin-catalog checkout is in the run, rewrite
build/containerfiles/builder.Containerfile/rhocp/4.N/path segments to that same latest released 4.y (for example/rhocp/4.21/→/rhocp/4.22/). Leaveocp-toolsURLs unchanged. Do not rewrite when the life cycle fetch fails. - When that Containerfile changes in the same run, increment its
release="N"label and the matchingX.Y-Ntoken inkonflux.additional-tagsonce (release="3"and2.2-3becomerelease="4"and2.2-4). Leaveversion=,rhdh.version=, andnode-v*to the node-header rewrite. SetBASE_IMAGESon every.tekton/plugin-catalog-builder*.yamlbuild-source-imagetask to the ContainerfileFROMimage, inserting the param when it is missing. Do not bumpreleasewhen the Containerfile is unchanged. - When the RPM Containerfile uses
dnf/microdnf install --installroot(operator empty rootfs), regenerate the lockfile withrpm-lockfile-prototype --bareso the full closure (glibc, coreutils, bash) is locked. Do not pass-f; that loads the UBI rpmdb and omits those packages. Layered installs onto the base image still use-f. If the solve fails (nothing provides,conflicting requests), restorerpms.lock.yaml/rpms.in.yamland do not push. - On RHDH, update Node headers when the builder image changes Node. Then, when
those checkouts are in scope, pin plugin-catalog
build/containerfiles/builder.ContainerfileFROM to the same UBI Nodetag@sha256. Catalog headers follow the Node version that Containerfile will run: imagenode --version, or the newernodejsRPM fromdnf repoquerywhen the filednf-installsnodejsbefore the headersRUN. Do not copy an older rhdh.nvm/over that version. Rewritekonflux.additional-tagsnode-v*to match the catalog.nvmrc, and set overlaysversions.jsonnodeto the rhdh.nvmrcvalue. Catalog mapsrelease-1.Y→ GitLabrhdh-1.Y-rhel-9andrelease-2.Y→ GitLabrelease-2.Y(using UBI10 / RHEL10). Catalog has norpms.lock.yaml. Do not[skip-build]the catalog builder commit. - On rhdh-operator
main, raisego.modto the Go toolset image when the image is newer. Never lowergoortoolchainto match an older image; a newer pin (for example from Renovate) is valid. - Exclude RHDH
e2e-tests/and.ci/from image scans. - Ignore
rpm-lockfile-prototypelines matchingNo sources found foror "no matching sources". Those source RPMs are often unpublished; the binary lockfile is still valid. Do not report them as unread, failed, or remaining risks.
Another skill invokes /rhdh-base-images by name and uses what it reports; it
never reaches for these script paths. /rhdh-konflux-tasks does this during a
stream Konflux bump so Node headers match the builder image; it passes named
checkouts and a main or release-* selector.
Completion
An analysis is complete when every repository in scope is named with its current
and latest tag, UBI skew and toolchain drift are stated or stated as none, and
every registry, lockfile, or branch the scan could not read is named as unread
instead of reported as current. Filtered No sources found for /
"no matching sources" lines are not unread and are omitted from the report.
An update is complete when the target branch was verified to exist against a
clean working tree before any edit, every approved operation has been reported by
target and outcome, and the push and PR state is stated explicitly — including
"not pushed" when the default local behavior was kept. When Node headers /
.nvmrc changed, name the plugin-catalog FROM old→new, confirm
grep konflux.additional-tags build/containerfiles/builder.Containerfile
contains node-v matching .nvmrc, and name the overlays versions.json
node value (or that those checkouts were not in scope). When the catalog
builder Containerfile changed, name the release old→new and confirm builder
PipelineRun BASE_IMAGES matches that file's FROM (or that the Containerfile
did not change).