Cutting a Release
Releases are tag-driven: pushing a version tag publishes every artifact automatically, with no manual build steps.
Versioning Policy
- plexd uses semantic versioning with major version
0: a minor bump signals a breaking change, a patch bump signals fixes. - The
0.1.xseries carries the current MVP control-plane contract — the contract exercised by the bundled mock API server (test/e2e/mockapi). Adoption of the real Plexsphere control-plane v1 API lands as0.2.0. - While the major version is
0, the0andlatestimage tags track the newest release and are published deliberately — do not add the docker/metadata-action major-zeroenableguard to suppress thetag. Consumers wanting stability should pin0.1or an exact version. - Release image tags are mutable while the major version is
0. Re-running the Container workflow for an existing tag rebuilds the image and movesvX.Y.ZandX.Y.Zto the new manifest, so an exact-version pin identifies a release, not a fixed set of bytes — a consumer holding a cached image cannot tell it has gone stale. Anyone needing a reference that can never move should pin by digest (ghcr.io/plexsphere/plexd@sha256:…), whichdocker buildx imagetools inspectreports for any tag.
Prerequisites
- Tag-push permission on
plexsphere/plexd. - CI is green on the
maincommit being released.
Steps
Releases use lightweight tags, the same convention documented in the Release Workflow reference. The example below uses v0.1.0; substitute any vX.Y.Z.
Switch to
mainand pull the commit being released:bashgit switch main && git pullCreate the lightweight version tag:
bashgit tag v0.1.0Push the tag to trigger the automation:
bashgit push origin v0.1.0Watch the Release and Container workflow runs in GitHub Actions until both complete.
What the Automation Publishes
- A GitHub release with seven binaries (
plexd-{linux,darwin}-{amd64,arm64},plexd-linux-mipsleandplexd-windows-{amd64,arm64}.exe), a.sigstore.jsonbundle for each, a combinedchecksums.sha256, and auto-generated release notes. - Multi-arch (linux/amd64, linux/arm64) container images
ghcr.io/plexsphere/plexd:{vX.Y.Z, X.Y.Z, X.Y, X, latest}— forv0.1.0that isv0.1.0,0.1.0,0.1,0, andlatest. Thev-prefixed and bare forms of the full version are aliases for the same manifest, published so the release version resolves as an image reference without a consumer having to strip the prefix.
Verify the Release
The release page carries the seven binaries, their
.sigstore.jsonbundles andchecksums.sha256. Spot-check a binary against the checksums file to catch a truncated or corrupted upload:bashsha256sum --ignore-missing --check checksums.sha256This is an integrity check, not an authenticity check
The release job generates
checksums.sha256from the same binaries it uploads, so the checksums share a trust root with the artifacts they describe. Anyone able to publish to the release can replace a binary and regenerate the checksums to match. plexd does not yet sign release artifacts or publish build provenance, so a consumer currently has no way to prove a downloaded binary came from this repository's CI — this check only tells you the bytes survived the round trip.Confirm the image pulls anonymously — the ghcr package is public:
bashdocker pull ghcr.io/plexsphere/plexd:0.1.0If the pull requires authentication, fix the package visibility in the GitHub package settings — a one-time action.
Confirm both spellings of the version resolve to the same manifest:
bashdocker buildx imagetools inspect ghcr.io/plexsphere/plexd:v0.1.0 --format '{{.Manifest.Digest}}' docker buildx imagetools inspect ghcr.io/plexsphere/plexd:0.1.0 --format '{{.Manifest.Digest}}'The two digests must match, and each must name a manifest list covering
linux/amd64andlinux/arm64— drop the--formatflag to see the platform entries.Confirm the stamped version:
bashdocker run --rm ghcr.io/plexsphere/plexd:0.1.0 --versionThis prints
plexd version v0.1.0— the tag name including thevprefix, which is also thev0.1.0image tag and the form the agent sends in its APIUser-Agentheader asplexd/v0.1.0. The bare0.1.0tag is the same image under its parsed-semver spelling.
See Also
- Release Workflow — Binary build matrix, checksums, and release job internals.
- Container Workflow — Multi-arch image build and semver tag generation.