Repository navigation
Native .deb/.rpm packages for the Redis APT/YUM repositories (#366 follow-up) - #370
Conversation
|
🤖 Automated first-pass review — a human maintainer's review is still required before merge. Scope note: this is release and packaging infrastructure. It doesn't touch engine, filter, harness or dataset logic, so most of this repo's usual checklist doesn't apply (per-config isolation, the The PR body already covers the things I would otherwise have asked about. It reports two full-matrix staging rehearsals (40873011651 at fcf40fd, 40879384558 at 0fd1f3a). It says each new guard was mutation-checked against Worth fixing before merge: nothing found. Optional / follow-up:
Everything else I checked held up:
The residual one-directional YUM race is real but is already documented in the workflow header and in Net: careful, heavily self-reviewed and rehearsed release plumbing. The only gap I found is local-only: a |
#366 follow-up) Builds vector-db-benchmark packages natively inside a container of every distribution they are published for (focal, jammy, noble, resolute, bullseye, bookworm, trixie; el8, el9, el10, amzn2023; amd64 and arm64), with the release-static feature and the Rust toolchain release-binaries.yml pins, so a package depends on nothing but that distro's glibc. Each package is installed and run on a bare container of its distribution, from the file and from a local repository laid out like packages.redis.io, before anything is published. Publishing follows memtier-benchmark: deb-s3 per codename into deb/, and createrepo_c into rpm/<distro>/<arch>/, scoped to the directories this product has packages for and never deleting another product's objects. The target is the GitHub environment (staging bucket or packages.redis.io); the workflow refuses production without a signing key. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
- publish-apt.sh: `--sign=<fingerprint>` (a bare --sign is a string option and would swallow the first .deb), signing mandatory (an unsigned deb-s3 run strips Release.gpg off a codename every Redis product shares), --suite, every option in --opt=value form, dry run without deb-s3 or a key. - publish-yum.sh: idempotent re-runs (same build skipped, different build refused), --keep-all-metadata / --retain-old-md, signature verified against a private rpm db, dist tag mapping in lib.sh, dry run offline. - selftest-packages.sh (+ make release-selftest-packages): both publish scripts against fake aws / deb-s3 and tiny fixtures, on every PR. - workflow: staging/build bucket pinned to the environment (a repository secret inherited by `staging` cannot send a rehearsal to production), release_type=public refuses pre-release/draft tags, one publish at a time, credentials via configure-aws-credentials only, verification against the S3 origin for the exact version and the RPM in primary.xml, PR matrix reduced to one codename + one distro with rust-cache, PR paths cover Cargo.toml/Cargo.lock/build.rs/LICENSE, publish dry run on PRs. - build-rpm.sh: no `dnf install curl` (conflicts with curl-minimal on el9 and Amazon Linux 2023); CARGO_TARGET_DIR shared with plain builds. - build-deb.sh: glibc-only Depends asserted, host codename must match, LC_ALL=C changelog date, pre-release crate versions refused like rpm. - lib.sh: ensure_release_toolchain (RUSTUP_TOOLCHAIN pin), require_clean_head, rpm_release_to_distro shared by the scripts and the workflow. - debian/rules refuses a dirty tree instead of stamping HEAD; dh_dwz off. - test-package.sh: deb local repo in the dists/<codename> layout, install source asserted, cleanup trap, one package per run. - INV-A5 scans every non-comment workflow line for inline builds and requires the self-test, dry run and the wider PR path list. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The staging bucket's shared deb/ and rpm/ are signed with the production key, so a rehearsal there would need that key and would re-sign indexes the other products rely on. release_type=internal now publishes under a prefix (default vdb-staging/, the production layout below it), refuses the bucket root, publishes the throwaway key's public half as <prefix>/gpg, and the verify step checks each codename's InRelease is signed by the key the run imported and carries the digest of the Packages index it serves. Production refuses any prefix. A signing key is required in both environments. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The staging environment now points at vdb-package-staging (us-east-2, AWS account 726902207197, ours), with the production layout at the bucket root and the throwaway key's public half as /gpg, so a rehearsal depends on no other team. The Redis-wide staging bucket is still accepted, but only under a prefix. release_type=internal may be dispatched without a tag and builds the dispatched ref; public still requires a final release tag. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
9488fc5 to
ef9cf42
Compare
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Debian/Ubuntu container steps ran under dash, where the build step's pipefail, [[ ]] and arrays are syntax errors, so every deb build failed. INV-A5 now asserts the workflow-level bash default. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Debian 11 left LTS on 2026-08-31; deb.debian.org now 404s on its security pool, so the bullseye containers could not install anything. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…llow-ups Automated review on #370: - Verify step: build the S3 origin URL path-style (lib.sh s3_origin_url, https://s3.<region>.amazonaws.com/<bucket>[/<prefix>]). The virtual-hosted form fails TLS for a dotted bucket (production is packages.redis.io: curl exit 60, confirmed), which would turn a release red after it had published. INV-A5 refuses the virtual-hosted form in the workflow and release scripts; the selftest covers dotted buckets and us-east-1. - publish-yum.sh: no lock covers rpm/, so re-list each directory just before uploading repodata/ and re-index RPMs that appeared since the sync; after the upload, fail if any *.rpm in the directory is missing from the served primary.xml.gz, naming it and saying to re-run the publish. Selftest simulates both race windows with the fake aws. - publish-yum.sh: a build's identity now includes SIGMD5 (header+payload, unchanged by signing). NEVRA + whole-second BUILDTIME let a different build made in the same second pass as "already published"; the selftest hit this intermittently and now pins SOURCE_DATE_EPOCH so the case is deterministic. - test-package.sh: the installed-from-repo check now proves it. apt: not installed and the local repository is the only source before installing. dnf: `list installed` records @vdb-local-test (dnf 4.7 to 4.20). - Workflow header: `build` must have required reviewers and deployment branches limited to master and release tags; measured size of a production YUM publish's downloads. - README: the APT/YUM section is marked as coming soon until production is wired. - actionlint: array for the dnf package list, mkdir+chmod for ~/.gnupg. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Replying to the automated review, point by point. Everything is in fcf40fd. 1. Verify-step URL breaks TLS for dotted buckets. Fixed. I confirmed it against the real bucket:
2. YUM read-modify-write race. Fixed in both ways you suggested.
3. Full-matrix rehearsal as a merge gate. It's now listed as one in the PR body. Run 40873011651 at fcf40fd is green:
YUM download size. I measured it from production's public PR body vs. release assets. The body had already been corrected before this review ran. It now says the packages are not attached to the GitHub release, which matches the workflow header. README. The section is marked "Coming soon". It says production publishing isn't switched on yet, so Installed-from-repo check. I tightened it rather than softening the comment.
The comment now describes exactly these two checks. |
…gate, review round 2 Seven-reviewer pass on fcf40fd: - publish-apt.sh refuses to publish unless each target codename's existing InRelease verifies as signed by our key (deb-s3 re-signs the whole codename), and test-signs first (deb-s3 uploads Release before signing). The workflow pins the key to the environment's APT_SIGNING_FPR variable, required for `build` (production: 54318FA4052D1E61A6B6F7BB5F4349D6BF53AA0C). - publish-yum.sh: no `--delete` on the repodata/ sync (it could only delete another product's freshly uploaded metadata); repomd.xml uploaded last; header corrected (old generations accumulate) and the one-directional residual race documented; rpm --addsign gets the key on the command line. - Plan job: production only when vars.PACKAGES_PRODUCTION is 'true' (else a release builds, tests and publishes nothing, with a notice; public dispatch is refused), and only for final X.Y.Z / vX.Y.Z tags (lib.sh check_production_tag), whatever the pre-release flag says. - Verify step matches OUR Packages stanza (package, version, arch) by the .deb's SHA256 and checks its pool file is served (lib.sh deb_index_entry). - Publish job: tooling installed before credentials and key; deb-s3 gem checksum and ruby/setup-ruby commit pinned; publish scripts from the workflow's own commit (github.sha), packages from the planned commit. - PR trigger and INV-A5 cover src/bin/**, README.md and the shipped data; INV-A5 requires the packaged binaries to equal cargo's bin targets and REQUIRED_BINS (bench_hdf5 added; verify.sh now always checks it). - Docs: AGENTS.md "Packages" runbook; workflow header (gate, setup order, tag rule caveat, concurrency cancellation, residual YUM risk). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Second review round (seven reviewers on fcf40fd). Everything below is in 0fd1f3a. Each new guard was mutation-checked: breaking it turns the package selftest, INV-A5, or a local run of the changed workflow step red. Gate: Blockingp2: the APT signing key was never checked against the key the shared repo is signed with. Fixed.
p3 #1:
p7 #1: an rc tag could publish final-version packages to production. Fixed. Whenever
p6 #1, p1 #7, p3 #6, p2 #4: AGENTS.md "Cutting a release". There is a new "Packages (
One deviation: you asked for "final releases go red until production is configured". With the variable gate below, they no longer go red. The run stays green and shows a notice. p6 #2: the PR trigger didn't cover every packaging input. I took the preferred route, with one deliberate narrowing.
Optional items done
Deferred (follow-ups, not in this PR)
The staging rehearsal at 0fd1f3a is in the PR body. |
…ntials Automated review on 0fd1f3a: - publish-yum.sh refuses a directory whose repodata/ carries a detached repomd.xml.* signature, before writing anything: regenerating repomd.xml would leave it stale and break repo_gpgcheck=1 for every product there. None exists in production today (checked 2026-10-29). Selftest case added. - configure-aws-credentials (the step that receives the credentials) pinned to the v4.3.1 commit. - Header: --retain-old-md prunes only the local copy; old generations accumulate in S3. AGENTS.md: the reused artifacts are unsigned. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Replying to the automated review's pass on 0fd1f3a. The fixes are in 03fa177.
The full-matrix staging rehearsal at 03fa177 is in the PR body. |
|
Thanks — the automated pass on 03fa177 finds nothing pre-merge. I'm leaving both optional items as follow-ups:
|
…es, signer subkeys) - ci.yml reruns INV-A5 on release-packages.yml, debian/** and rpm/** (push and pull_request); the self-enforcing list in harness_invariants.rs requires both. - The plan gate and the signing-key pin are lib.sh functions (production_gate, check_signing_fpr), covered by the selftest; INV-A5 requires each workflow call site verbatim on a code line. - Signer check accepts a signing subkey of the pinned key (VALIDSIG primary field), in publish-apt.sh and the verify step (gpg_status_signed_by). - publish-apt.sh refuses a codename with Release.gpg but no InRelease, and an `aws s3 ls` error never counts as a new codename. - publish-yum.sh preflights every target directory for signed metadata before uploading anything; header comment on old generations corrected. - check_production_tag refuses leading zeros. - INV-A5 binary-set check includes test-package.sh's loops. - publish-dry-run runs the scripts at github.sha, as publish does. - Docs: a master dispatch rebuilds and cannot finish a release whose APT side is already published (comment + AGENTS.md); the unmarked-rc failure; deb-s3's exact lock error text. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Delta review at Blockingd6 #1:
d1 (workflow)
d2 (APT)
d3 (YUM)
d4 (packaging)
d5 (tests)
d6 (docs)
d7 (maintainer)
Deferred (follow-ups)
Gate at 20808ec
Merged master (#325)
|
Follow-up to #369 (now merged; rebased onto master). Adds native .deb and .rpm packages for a release, built, install-tested and published the way memtier-benchmark's are, so
vector-db-benchmarkcan be installed from the Redis APT and YUM repositories.Staging rehearsed; production off until
vars.PACKAGES_PRODUCTION=true. Publishing goes to the GitHub environment named by the run.stagingis our own rehearsal bucket,vdb-package-staging(us-east-2, AWS account 726902207197), with the production layout at its root (deb/,rpm/, and the throwaway signing key's public half as/gpg), so a rehearsal needs nothing from any other team.buildis packages.redis.io. The publish job pins the bucket to the environment (staging must be a staging bucket, build must not be), so a repository-level secret inherited bystagingcannot send a rehearsal to production. The Redis-wide staging bucket (redis-test-package-repository) is accepted only under arepo_prefix: itsdeb/andrpm/are signed with the production key, and publishing there would re-sign indexes other products rely on.What's here
debian/(control, rules, copyright, docs, source/format) andrpm/vector-db-benchmark.spec. Both build with--features release-staticfrom Publish prebuilt Linux (x86_64, aarch64) and macOS arm64 binaries as release assets #369, so a package depends on nothing but that distribution's glibc (dpkg-shlibdeps/ rpm auto-requires confirm it). Installed layout:/usr/bin/{vector-db-benchmark,prepare-msmarco,generate-dataset}/usr/lib/vector-db-benchmark/{bench_npy,bench_jsonl,bench_hdf5}(/usr/libexec/...on RPM)/usr/share/vector-db-benchmark/{datasets/datasets.json,datasets/random-100,experiments/configurations}scripts/release/build-deb.sh --dist <codename>,build-rpm.sh: run on the target distribution (a container of it in CI;make release-deb DIST=… INSTALL_DEPS=1/make release-rpm INSTALL_DEPS=1locally).--install-depsapt-gets/dnfs the build dependencies and a current stable Rust via rustup; the distros' own cargo/rustc are too old. Versions follow the memtier convention: deb<crate version>~<codename>, rpm<crate version>-1.<dist>. The git commit is passed through (VDB_BUILD_GIT_SHA/--define vdb_git_sha) so--versionreports it even from an RPM source tarball.scripts/release/test-package.sh <pkg> --expect-sha: the install test, run on a bare container of every codename/distro on both architectures. Installs from the file with dependencies resolved by the package manager, checks every CLI's--versionis exactly<name> <version> (git <sha>), runs--describe datasetsandbench_jsonl/bench_hdf5against the packaged data, then removes the package and installs it again from a local repository laid out like packages.redis.io (Packages index for APT;createrepo_c+ the README'srpm/el$releasever/$basearch/rpm/amzn2023/$basearchbaseurl for YUM).scripts/release/publish-apt.sh:deb-s3 uploadper codename intodeb/(--origin packages.redis.io, public objects,--preserve-versions,--fail-if-exists, always signed; before uploading it checks that each codename's existing InRelease is signed by the same key, or a subkey of it).scripts/release/publish-yum.sh:rpm/<el8|el9|el10|amzn2023>/<x86_64|aarch64>/withcreaterepo_c --update. Therpm/prefix is shared with other Redis products (prod: redis, redis-stack; staging: redis-rpm'srockylinux*/), so it only touches the directories it has an RPM for, downloads each in full before regenerating metadata, never deletes an RPM, and uploads RPMs beforerepodata/..github/workflows/release-packages.yml:release: published,workflow_dispatch(tag,release_typeinternal/public/none,overwritefor staging re-runs, codename/distro overrides) andpull_requeston the packaging paths (build + test, never publish). Matrix: focal, jammy, noble, resolute, bullseye, bookworm, trixie × amd64/arm64; el8, el9, el10, amzn2023 × x86_64/aarch64 (repo varsDEB_DISTS/RPM_DISTROSoverride, as memtier'sBUILD_DISTS). Publishing always signs, refuses production unless the key matches the environment'sAPT_SIGNING_FPRpin, and verifies the published indexes serve the packages. The packages are not attached to the GitHub release; Publish prebuilt Linux (x86_64, aarch64) and macOS arm64 binaries as release assets #369's archives own the release assets.Staging setup (done, self-serve)
vdb-package-staging(ACLs enabled, public reads, like the real buckets), GitHub OIDC provider, rolevdb-package-staging-publishertrusting only thestagingenvironment of this repository with read/write + ACL on that bucket. The repository uses GitHub's immutable OIDC subject, so the trust condition namesrepo:redis@1529926/vector-db-benchmark@662205136:environment:staging(the plain-name form is listed too). The production role behindbuildneeds the same immutable form, orconfigure-aws-credentialsfails with "Not authorized to perform sts:AssumeRoleWithWebIdentity".staging:APT_S3_BUCKET=vdb-package-staging,APT_S3_REGION=us-east-2,APT_S3_IAM_ARN=arn:aws:iam::726902207197:role/vdb-package-staging-publisher,APT_SIGNING_KEY= throwaway RSA-4096 key, fingerprintFD183D88E9814786987424DAE26208135FFAAD25, uid "vector-db-benchmark staging rehearsal (throwaway, NOT the Redis package key)".gh workflow run release-packages.yml -f release_type=internal(optionally-f tag=<release tag>;-f overwrite=trueto replace the version already there); install fromhttps://s3.us-east-2.amazonaws.com/vdb-package-staging/{deb,rpm,gpg}with the README steps and that base URL.buildenvironment) needs the same five secrets as memtier-benchmark's, from the packaging team: bucketpackages.redis.io(us-east-2), the real signing key, credentials. It must be protected before those secrets go in (see "Still to do").Verified locally
ubuntu:focal.deb (oldest cmake/debhelper; Dependslibc6 (>= 2.30), libgcc-s1, asserted by the build script) androckylinux:8+rockylinux:9.rpm (oldest glibc/gcc; the curl-minimal path; Requires glibc/libgcc only), each then installed and run withtest-package.shon a bare container of that distribution, from the file and from a local repository in the served layout. Builds usedRELEASE_RUST_TOOLCHAIN=1.99.1(the pin from Publish prebuilt Linux (x86_64, aarch64) and macOS arm64 binaries as release assets #369) with a deliberately setHDF5_DIR: rustc 1.99.1 used, no libhdf5 dependency.make release-selftest-packages: 85 checks ofpublish-apt.sh/publish-yum.shagainst fakeaws/deb-s3(codename grouping,--sign=<fpr>, refuse-unsigned, dist tag → directory, same-build skip / different-build refuse /--overwrite, RPMs before repodata, another product's RPM kept and indexed, another product's RPM landing mid-publish in either race window, path-style S3 URLs for dotted buckets).actionlint,shellcheck -x,make release-selftest,cargo test --test harness_invariants(INV-A5: both release workflows pin the same toolchain, no inline builds anywhere in the workflow, self-test + dry run wired in, PR paths cover the package-specific inputs: packaging sources,src/bin/**and the shipped data; packaged binaries = cargo's bin targets = REQUIRED_BINS).--signin deb-s3 is a string option and would have swallowed the first .deb as the key id, and an unsigned deb-s3 run stripsRelease.gpgoff a codename every Redis product shares, so signing is now mandatory for any publish.Staging rehearsal (done)
Run 40863645017, tag-less
release_type=internalat d030b2e: all 14 deb and 8 rpm cells built and passedtest-package.shon bare containers, then the publish job signed and published every codename andrpm/<distro>/<arch>directory tovdb-package-stagingand its verify step passed (InRelease signature, Packages hash, primary.xml listing).Then the README install steps, with the staging base URL and signature checking on, on bare containers: Ubuntu focal/noble/resolute and Debian bullseye/trixie (amd64), Ubuntu jammy and Debian bookworm (arm64), Rocky 8/9/10 and Amazon Linux 2023 (x86_64), Rocky 9 and Amazon Linux 2023 (aarch64). Each installed
0.1.0~<codename>or0.1.0-1.<dist>, printedvector-db-benchmark 0.1.0 (git d030b2e…)and listed the packaged datasets.The rehearsal found three workflow bugs, fixed here: container steps ran under dash on Debian/Ubuntu (every deb build failed; the workflow now defaults to bash and INV-A5 asserts it),
dnf install curlin the el9/AL2023 install-test setup conflicted with curl-minimal, and Debian 11's pool is gone from deb.debian.org since LTS ended on 2026-08-31 (bullseye containers now use archive.debian.org; memtier and packages.redis.io still ship bullseye).Review follow-ups (fcf40fd)
From the automated review:
https://$BUCKET.s3.$REGION.amazonaws.com. S3's certificate is a one-label wildcard, so forpackages.redis.iothat fails TLS (curl exit 60, confirmed against the real bucket) after the publish has already written. The URL now comes froms3_origin_urlinlib.sh, which is path-style:https://s3.<region>.amazonaws.com/<bucket>[/<prefix>]. The regional host exists for us-east-1 too. The path-style URL returns 200 for packages.redis.io. INV-A5 refuses the virtual-hosted form in the workflow and in every release script, and the selftest covers a dotted bucket, a prefix and us-east-1. No other script builds an S3 URL: deb-s3 and the aws CLI handle dotted buckets themselves.rpm/.publish-yum.shnow lists each directory again just before uploadingrepodata/, and re-indexes any RPM that appeared since the sync, so the window shrinks to the repodata upload itself. After the upload, every*.rpmin the directory must appear in theprimary.xml.gzthe directory now serves. If one is missing, the run fails and names it, telling the operator to re-run the publish, which re-syncs the directory and rebuilds the index. The selftest's fakeawsdrops another product's RPM into both windows: the first is caught by the re-list, the second fails with the hint, and the re-run then indexes everything.SIGMD5, the header and payload digest, which signing leaves unchanged. The fixtures pinSOURCE_DATE_EPOCH, so that case is now deterministic.dnf list installedmust record@vdb-local-test. The same format holds on dnf 4.7 (el8), 4.14 (el9, AL2023) and 4.20 (el10). Before, an emptyfromor@Systemwas accepted.buildenvironment protection is documented in the workflow header. It needs required reviewers, and deployment branches limited tomasterplus the release tag forms. This matters becauseworkflow_dispatchruns the dispatched ref's copy of the workflow, guards included. Applying it is listed below.rpm/<distro>/<arch>/directories a release touches indexes 27 RPMs, about 20 MB, so roughly 160 MB of downloads per release. This is noted in the workflow header. Objects that no index lists can't be seen without listing rights.~/.gnupgis created with mkdir+chmod.Gate:
make agent-check,make release-selftest-packages(61/61),shellcheck -x,actionlint. Each new guard was mutation-checked: removing it, or reverting to the virtual-hosted URL, turns the selftest or INV-A5 red.Full-matrix staging rehearsal at fcf40fd: run 40873011651, green. It covered all 7 codenames × amd64/arm64 and el8/el9/el10/amzn2023 × x86_64/aarch64. All 22 cells built and passed
test-package.sh, including the tightened installed-from-repo checks. The publish signed and published every codename and directory tovdb-package-staging. The new index check passed in all 8 RPM directories, and the path-style verify step passed: InRelease signature, Packages digest, primary.xml listing.Review round 2 (0fd1f3a)
From the seven-reviewer pass on fcf40fd. Each new guard was mutation-checked.
publish-apt.shnow requires each target codename's existingInReleaseto verify as signed by our key, and refuses otherwise; a new codename with no InRelease is accepted. It also test-signs before deb-s3 starts. The publish job pins the key to the environment variableAPT_SIGNING_FPR, which is required forbuild:54318FA4052D1E61A6B6F7BB5F4349D6BF53AA0C, from packages.redis.io/gpg.--deleteon therepodata/sync: it could only ever delete another product's freshly uploaded metadata.repomd.xmlis uploaded last. Old generations accumulate. The one-directional residual race is documented.publish_to=buildhappens only whenvars.PACKAGES_PRODUCTION == 'true'. Otherwise a final release builds, tests and publishes nothing (with a notice), andrelease_type=publicis refused. Production also takes only finalX.Y.Z/vX.Y.Ztags (check_production_tag), whatever the pre-release flag says..deb's SHA256, and checks that its pool file is served.ruby/setup-rubyare pinned to a commit. The publish scripts come from the workflow's own commit (github.sha, the same as the guards and the selftest); the packages come from the planned commit.src/bin/**,README.md,datasets/datasets.json,datasets/random-100/**andexperiments/configurations/**. The rest ofsrc/is compiledrelease-staticby release-binaries' PR run. INV-A5 requires debian/rules, the spec,REQUIRED_BINSand cargo's bin targets to name the same binaries, andbench_hdf5was added toREQUIRED_BINS.Gate:
make agent-check, package selftest 85/85, archive selftest 95/95,shellcheck -x,actionlint(with ShellCheck 0.11.0).Full-matrix staging rehearsal at 0fd1f3a: run 40879384558, green. 47 jobs passed and the dry run was skipped. In the publish job:
Automated-review follow-up (03fa177):
publish-yum.shrefuses a directory whose metadata is signed (repodata/repomd.xml.*) before writing anything; none is signed in production today.configure-aws-credentialsis pinned to a commit.Still to do
Merge gate: a green full-matrix staging rehearsal of the final head (
gh workflow run release-packages.yml --ref release-packages-deb-rpm -f release_type=internal -f overwrite=true). PR runs cover only jammy and el9. Latest: run 40881976162 at 03fa177, green.buildenvironment and switching production on.builddoes not exist yet; this repository has onlypypiandstaging. Production stays off untilvars.PACKAGES_PRODUCTIONistrue, so merging can't reach it. In order:build→ Required reviewers:fcostaoliveira.master, tags[0-9]*.[0-9]*.[0-9]*andv[0-9]*.[0-9]*.[0-9]*.APT_SIGNING_FPR=54318FA4052D1E61A6B6F7BB5F4349D6BF53AA0C.PACKAGES_PRODUCTION=true.The same steps are in AGENTS.md.
Before the first production publish: have the packaging team confirm that every
.rpmobject in the 8 productionrpm/<distro>/<arch>/directories is meant to be indexed, becausecreaterepo_c --updateindexes them all. The--pkglistscoping and an automatic post-check retry are follow-ups.🤖 Generated with Claude Code