Skip to content

feat: release pipeline with goreleaser, release-please, cosign and SBOMs - #4

Open
RogerCecilpot wants to merge 1 commit into
feat/257-completion-windows-cifrom
feat/253-release-pipeline
Open

RogerCecilpot wants to merge 1 commit into
feat/257-completion-windows-cifrom
feat/253-release-pipeline

Conversation

@RogerCecilpot

Copy link
Copy Markdown

Closes devlyft/devlyft#253.

Stacked on #2 (scaffold); retarget to main once that merges.

What

  • release-please (release-please-config.json, .release-please-manifest.json, release-please.yml): Go release type, starting from 0.0.0, bump-minor-pre-major. On push to main it maintains a release PR; merging it creates the release and vX.Y.Z tag.
  • goreleaser (.goreleaser.yaml, release.yml on v* tags): linux/darwin/windows × amd64/arm64, CGO_ENABLED=0, -trimpath, version/commit/date stamped via ldflags, commit-time mod_timestamp for reproducibility, tar.gz (zip on Windows), an SBOM per archive (syft), a sha256 checksum file signed with cosign keyless (.sig, .pem, .sigstore.json), and then attest-build-provenance for the archives and checksums. The changelog is left to release-please (mode: keep-existing).
  • CI: a new checks / release-snapshot job builds every target on each PR (signing and SBOMs skipped, read-only token).
  • make snapshot for the same build locally.
  • docs/releasing.md: release flow, cosign verify-blob and gh attestation verify instructions, the 0.x → 1.0 rules (1.0 gated on #263 browser login, #264 device login and the published stability policy; not on server-side pagination or rollout status), and known gaps (no notarization or code signing).

Homebrew, Scoop, deb and rpm are left to devlyft/devlyft#258 and #260.

Security

GitHub-hosted runners only, all actions pinned to commit SHAs, top-level contents: read. Only the tag-triggered release job gets contents: write, id-token: write and attestations: write. No stored signing keys.

Verified locally

  • goreleaser check passes.
  • goreleaser release --snapshot --clean --skip=sign,sbom builds all 6 archives plus checksums, and the binary reports the stamped version.
  • actionlint, make lint and make test pass.

Not yet verified

The "tagged release works" acceptance (cosign signing, SBOMs, attestations and the release-please PR) can only be exercised after this merges to main and the first release PR is merged.

Note: goreleaser v2.19 itself needs Go ≥ 1.27.3 to go run, so make snapshot relies on GOTOOLCHAIN=auto to fetch it. CI uses the prebuilt goreleaser binary and builds with Go 1.26 from go.mod.

🤖 Generated with Claude Code

@RogerCecilpot
RogerCecilpot force-pushed the feat/253-release-pipeline branch from 9bb3978 to 14c1dc3 Compare October 25, 2026 12:56
@RogerCecilpot
RogerCecilpot changed the base branch from feat/235-scaffold to feat/257-completion-windows-ci October 25, 2026 12:57
release-please keeps a release PR with the next version and changelog;
merging it tags vX.Y.Z. The tag triggers goreleaser on a GitHub-hosted
runner: linux/darwin/windows x amd64/arm64 builds with -trimpath and the
version stamped in, an SPDX SBOM per archive, a checksum file signed with
cosign keyless (GitHub OIDC), and build-provenance attestations.

PRs run a snapshot build of every target so config changes are caught
before a tag. docs/releasing.md covers the flow, verifying downloads and
the 0.x to 1.0 rules.

Refs devlyft/devlyft#253

Co-Authored-By: Claude Opus 5.5 <[email protected]>
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