Skip to content

Release action: sign, upload and register each extension build (DUPLOAI-3770) - #27

Merged
aboutte merged 22 commits into
duplocloud:devfrom
amaechiabuah:DUPLOAI-3770-release-action
Oct 7, 2026
Merged

aboutte merged 22 commits into
duplocloud:devfrom
amaechiabuah:DUPLOAI-3770-release-action

Conversation

@amaechiabuah

@amaechiabuah amaechiabuah commented Oct 6, 2026 •

Copy link
Copy Markdown
Contributor

Ticket: DUPLOAI-3770, part of DUPLOAI-3746. Design: ai-release docs/plans/2026-10-05-extension-release-action-design.md.

Each extension build is signed in Duplo's organizations and released to GitHub with its .sig. Builds from allowlisted repositories are then uploaded create-only to the channels bucket and registered unpublished with the license server, all from the Release's own assets. A re-run of a finished build is a no-op. Customer copies skip signing, upload and registration.

What is in it:

  • scripts/extension-sign.py and the extension-sign action. They sign and verify against the console's format and are checked against the console's test vectors.
  • .github/extension-publishers.json, the publisher allowlist. It ships empty and gets its entries at rollout.
  • scripts/release-extensions.sh and scripts/_publish.sh. They cover the org and allowlist guards, the bundle checks, the digest check, the S3 create-only upload and the console registration.
  • release.yml runs only on main, with every action pinned by SHA and an OIDC role for the upload.
  • check-extension-pr.sh warns at PR time about anything the release would refuse.
  • The release checks from Extension release checks: per-SDK tags at the built commit, sdkDigest, pinned builder, PR warnings #16, ported onto dev's runtime refactor.
  • docs/releasing-extensions.md.

Test plan: every tests/test-*.sh passes and actionlint is clean. An end-to-end run on the fixtures repository against the dev console follows at rollout.

For the ruleset administrator: the design asks for 2 approvals on .github/extension-publishers.json, .github/workflows/release.yml, scripts/release-extensions.sh, scripts/_publish.sh, scripts/_publishers.sh, scripts/extension-sign.py and scripts/extension-sign.requirements.txt. _publish.sh does the upload and registration, _publishers.sh reads the allowlist, and the requirements file pins the libraries the signer loads the key into. devkit's pull_request rule takes path-scoped required_reviewers, and devkit-maintainers is the only team. Whether that team's bypass should reach this rule is yours to settle.

…the built commit, sdkDigest stamp, pinned builder, PR warnings

(cherry picked from commit edcfe77)
…kup errors, and assert the unlisted-repo test actually signs
… flag non-semver versions and capture their own exit status
…act lookup, and fail an allowlisted extension with no CONSOLE_API_KEY before any write

@duplodavid duplodavid left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Left three comments, all small. The one that matters is an existing .env with BUILDER_TAG=latest never taking the digest pin.

Comment thread scripts/_builder.sh
Comment thread scripts/check-extension-pr.sh Outdated
Comment thread scripts/extension-sign.py

@duplodavid duplodavid left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good. The three items are fixed. Left one comment on the file header, not blocking.

# that cannot ship.
#
# For each extension the PR changes (anything under its directory since the merge base):
# - manifest.version is unchanged, so the release job will refuse to publish the new content at the old version.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

An unchanged manifest.version does not by itself make the release job refuse the publish. It refuses when a release tag for that version already exists and the directory changed since that tag. Can you say that here?

Suggested change
# - manifest.version is unchanged, so the release job will refuse to publish the new content at the old version.
# - manifest.version is unchanged and already has a release tag, so the release job
# refuses when the directory changed since that tag.

@aboutte
aboutte merged commit 60cd958 into duplocloud:dev Oct 7, 2026
2 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.

3 participants