Skip to content

docs(packages): document the cross-organization receiver shape - #68

Merged
jmgilman merged 1 commit into
mainfrom
docs-cross-org-receiver
Aug 22, 2026
Merged

docs(packages): document the cross-organization receiver shape#68
jmgilman merged 1 commit into
mainfrom
docs-cross-org-receiver

Conversation

@jmgilman

Copy link
Copy Markdown
Contributor

Closes the documentation half of #67.

GitHub does not deliver a caller's environment secrets to a reusable workflow owned by a different organization, so publish-package-repository.yml — which reads its aggregate signing and R2 credentials from packages-production — fails with GPG_PASSPHRASE is empty for every cross-organization central repository, at the last step of onboarding, after the producer release is already public. secrets: inherit does not help: it reaches repository and organization scopes only.

This PR:

  • splits Add the receiver workflow in operate-a-native-package-repository.md into two variants: the existing reusable call (same-organization) and a local workflow (cross-organization) that mirrors the reusable receiver step for step, selects packages-production in its own repository so environment secrets resolve natively, and pins setup-release-cli / setup-package-repository to the release-unit SHA;
  • states the same-organization constraint in release-system.md's receiver section.

Evidence the local shape works: componere/pkgs published componere/incusos-builder v0.2.0 through it (state: published, 36/36 artifacts), and all three repositories verified from real clients — apt-get on Debian, dnf with gpgcheck=1 + repo_gpgcheck=1 on Fedora, apk add on Alpine. Both v0.1.16 and v0.1.17 reusable receivers were shown to fail identically cross-org (issue #67 has the isolation runs), so this is a platform boundary, not a regression.

The feature-sized follow-up — release-cli init package-repository emitting this scaffold like the tap and bucket initializers — stays tracked in #67.

Note for review: local-build: always is unavailable in the local shape (action_repository must equal workflow_repository), so the local receiver downloads the stamped release-cli from this repository's release with checksum and attestation verification, which is called out in the doc.

The reusable receiver reads its aggregate signing and R2 credentials from the
packages-production environment, and GitHub does not deliver a caller
environment secret to a reusable workflow owned by another organization. Every
cross-organization adopter therefore failed publication with
"GPG_PASSPHRASE is empty" at the last step of onboarding, after the producer
release was already public.

Document two receiver shapes: the existing reusable call for same-organization
central repositories, and a step-for-step local workflow for
cross-organization adopters, which keeps the aggregate keys environment-only
and acquires the stamped release-cli with checksum and attestation
verification.

Refs #67; proven by componere/pkgs publishing componere/incusos-builder
v0.2.0 (36 artifacts) and client installs on Debian, Fedora, and Alpine.
@jmgilman
jmgilman merged commit a05761a into main Aug 22, 2026
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant