ORAS CLI releases are managed by scripts/release.sh, which automates preparation, tagging, validation, and publishing.
Before starting a release:
- Install the GitHub CLI (
gh) v2.68.0 or later and authenticate it.validateusesgh attestation verifywith--source-ref, which older versions do not have. - Ensure the
GPG_PRIVATE_KEYandGPG_PASSPHRASEGitHub Actions secrets are configured for release signing. - Configure Git commit and tag signing (GPG or SSH).
- Install
gpg;publishuses it to verify artifact signatures even if you sign with SSH. - Ensure the ORAS project release public key is available in
KEYSfor artifact signature verification. - Before releasing, update the Go version in
go.modand the relevant GitHub Actions workflows when the project moves to a new Go version. - Make sure the branch you are releasing from (
main, or the maintenance branch for a backport release) is in a releasable state and that fixes for applicable critical and high CVEs have landed on it.
Run commands from the repository root. Replace VERSION and COMMIT_SHA with the intended release version and commit SHA.
scripts/release.sh prep VERSIONThe script validates the version and release branch, updates internal/version/version.go, creates a signed-off (DCO) release-preparation commit, pushes a branch, and opens a pull request.
It also prints a release-vote template for Slack #oras-maintainers. The pull request must pass CI and receive the required maintainer super-majority approval before merging.
Releases for the current series and new minor versions are prepared from main. Patch releases for older series must use their corresponding release-X.Y branch. Set ORAS_MAIN_RELEASE_VERSION to override the release series detected for main when necessary.
After the release pull request is approved and merged, tag the merged commit:
scripts/release.sh tag VERSION COMMIT_SHAThe script verifies that the commit records the requested version, creates and pushes a signed vVERSION tag, and creates a release-X.Y branch for a new minor release.
The tag triggers the release-github and release-ghcr workflows.
Run validate right after tagging; it waits up to 30 minutes for the tag-triggered workflows to finish:
scripts/release.sh validate VERSIONThe script downloads release artifacts, checks their SHA-256 checksums, verifies the build provenance attestations of every archive and the checksums file, and verifies the binary version and available commit information. It fails if any of these has no valid attestation. A tag on a maintenance branch must include the attestation step in release-github.yml, or validate fails.
Review the release notes and verify that the GitHub Release is associated with the intended vVERSION tag and commit, not a GoReleaser placeholder tag such as untagged-<hash>.
After validation succeeds, run:
scripts/release.sh publish VERSIONThe script verifies artifact signatures against the ORAS project release key, adds verification information to the release notes (the GPG instructions and the gh attestation verify steps), publishes the GitHub Release, and triggers the Snap publishing workflow (with isStable=false for pre-releases).
Use --dry-run to preview the prep and tag phases without changing the repository:
scripts/release.sh --dry-run prep VERSION
scripts/release.sh --dry-run tag VERSION COMMIT_SHAvalidate and publish need a real tag and the _dist/ directory downloaded by validate, so they cannot be dry-run before a release.
- Open a pull request in oras-www and complete the following checklist, replacing
X.Ywith the release series andVERSIONwith the full release version:- For a new minor or preview release, add the version to
versions.json,versions-map,versioned_docs/, andversioned_sidebars/, following the preview-to-GA steps intools/refresh-commands.sh. - In
versions-map, set theX.Yline toX.Y VERSION, runnpm run refresh-commands, and commit the regeneratedversioned_docs/version-X.Y/commands/files. - In
versioned_docs/version-X.Y/installation.mdx, update every pinned version, including download snippets, direct links,go install, theghcr.io/oras-project/orasimage, and thedorasalias, then refresh the sampleoras versionoutput from the released binary. - In
versioned_docs/version-X.Y/how_to_guides/verifying_binaries.mdx, update the example version and asset file names. - In
src/components/ORAS_CLI/index.jsx, update the homepage installation snippet. - Publish a blog post for a minor release; a blog post is optional for a patch release.
- Link the pull request from the release-vote or announcement thread.
- The release is not finished until this pull request is open.
- For a new minor or preview release, add the version to
- Announce the release in Slack
#oras. - Publish applicable security advisories after the release has shipped.
Users can verify a downloaded release in two ways.
With GPG, import the public key from KEYS and check the detached signature that is attached to the release:
gpg --import KEYS
gpg --verify oras_VERSION_linux_amd64.tar.gz.asc oras_VERSION_linux_amd64.tar.gzWith the GitHub CLI, check the build provenance attestation:
gh attestation verify oras_VERSION_linux_amd64.tar.gz --repo oras-project/orasThe attestations are Sigstore bundles, so they can also be downloaded with gh attestation download and checked with cosign verify-blob-attestation.