Skip to content

ci(release): migrate to unified release pipeline via reusables#566

Merged
CybotTM merged 2 commits into
mainfrom
feat/unified-release
Apr 17, 2026
Merged

ci(release): migrate to unified release pipeline via reusables#566
CybotTM merged 2 commits into
mainfrom
feat/unified-release

Conversation

@CybotTM

@CybotTM CybotTM commented Apr 17, 2026

Copy link
Copy Markdown
Member

Summary

Replaces the 492-line `release-slsa.yml` with a 225-line orchestrator calling the org-wide reusable workflows merged to `netresearch/.github`. All capabilities preserved; no regressions in signing, attestation, or provenance.

Before → After

Capability Before After
Trigger `release.published` tag push (auto-publish) + `workflow_dispatch` backfill
Release creation implicit / external `create-release.yml@main`
`make_latest` default (buggy with drafts) computed from semver vs existing releases
Binary matrix inline (already used build-go-attest) same matrix, now with `sbom: true`
Per-binary SBOM separate `sbom` job w/ syft `build-go-attest sbom: true`
Checksums inline job `finalize-release.yml@main`
Verify-notes inline in `release-notes` job `finalize-release.yml`
Container build inline (bespoke) `build-container.yml@main` with `sign`, `attest`
Per-arch image tags inline crane kept as a thin crane job (preserved)
`notify-released` inline kept inline (ofelia-specific)

Semantic note on container provenance

Drops docker/build-push-action's native `provenance: true, sbom: true` in favor of `actions/attest-build-provenance` + `cosign sign`. These produce GitHub-attestation-store + Sigstore transparency log entries instead of in-registry OCI metadata — standard across the org, verifiable with `gh attestation verify oci://...` and `cosign verify`.

Trust / provenance chain preserved

The image still ships the exact attested binary:

  1. `binaries` job produces `ofelia-linux-` with SLSA L3 provenance.
  2. `container` job's pre-build-command downloads those exact binaries from the release.
  3. Dockerfile's binary-selector stage copies them into the image.
  4. Image's provenance + cosign signature attest this build.

Users can independently verify:
```bash
gh attestation verify ofelia-linux-amd64 --repo netresearch/ofelia
gh attestation verify oci://ghcr.io/netresearch/ofelia:0.23.2 --repo netresearch/ofelia
cosign verify ghcr.io/netresearch/ofelia:0.23.2 \
--certificate-identity-regexp "https://github.com/netresearch/ofelia/" \
--certificate-oidc-issuer "https://token.actions.githubusercontent.com"
cosign verify-blob --certificate checksums.txt.pem --signature checksums.txt.sig \
--certificate-identity-regexp "https://github.com/netresearch/ofelia/" \
--certificate-oidc-issuer "https://token.actions.githubusercontent.com" \
checksums.txt
```

Backfill

`gh workflow run release.yml --ref main -f tag=v0.23.2`

Test plan

  • actionlint passes
  • After merge + signed tag push: all 8 binaries + SBOMs + container + per-arch tags + signed checksums + verify-notes appear on the release
  • `gh attestation verify` succeeds on a built binary and on `oci://ghcr.io/netresearch/ofelia:`
  • `cosign verify` succeeds on the image and on `checksums.txt`

Replaces the 492-line bespoke release-slsa.yml with a 225-line
orchestrator that calls the org-wide reusable workflows (now available
at netresearch/.github).

Key changes:
- Trigger is tag push (was: release.published). The new create-release
  reusable creates the release — no more "someone clicks Publish on
  the draft".
- make_latest computed from semver — bugfix releases on older majors
  correctly don't steal the "Latest" badge.
- SBOMs generated per binary via build-go-attest's new `sbom: true`
  input (was: separate sbom job).
- Checksums + cosign sign-blob + verify-notes now handled by the
  finalize-release reusable (was: inline checksums + release-notes
  jobs).
- Container build uses build-container reusable with sign=true,
  attest=true. The pre-build-command hook downloads the released
  binaries into bin/ so the existing binary-selector Dockerfile stage
  keeps working and the image ships the exact attested binary that
  users can independently verify.
- Per-arch image tags (v*-linux-<arch>, latest-<arch>) preserved via
  a crane-based job after the container build.
- notify-released kept inline (labels and comments on merged PRs +
  linked issues; ofelia-specific, not yet worth extracting).
- Backfill: `gh workflow run release.yml --ref main -f tag=v0.23.2`.

No regressions in signed artifacts: binaries get GitHub attestations
(verifiable via `gh attestation verify`), checksums get keyless cosign
sign-blob, images get both `cosign sign` AND
actions/attest-build-provenance. Drops the docker build-push-action
native provenance/sbom flags in favor of GitHub's attestation-store
approach — semantically equivalent, standard across the org.

Signed-off-by: Sebastian Mendel <[email protected]>
Copilot AI review requested due to automatic review settings April 17, 2026 11:51
@gemini-code-assist

Copy link
Copy Markdown

Note

Gemini is unable to generate a review for this pull request due to the file types involved not being currently supported.

@github-actions

github-actions Bot commented Apr 17, 2026

Copy link
Copy Markdown

Dependency Review

✅ No vulnerabilities or license issues or OpenSSF Scorecard issues found.

Scanned Files

  • .github/workflows/release-slsa.yml

github-actions[bot]
github-actions Bot previously approved these changes Apr 17, 2026

@github-actions github-actions Bot 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.

Automated approval for solo maintainer project

All CI checks passed. See SECURITY.md for compensating controls.

Copilot AI 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.

Pull request overview

Migrates Ofelia’s release automation from the monolithic release-slsa.yml workflow to a new release.yml orchestrator that delegates most work (release creation, binary builds with attestations/SBOM, container build/sign/attest, and finalization) to org-wide reusable workflows.

Changes:

  • Added a new tag-push + workflow_dispatch driven release orchestrator workflow using netresearch/.github reusables.
  • Removed the previous release-slsa.yml workflow (release.published-triggered) and folded SBOM/checksum/note steps into the reusable finalize/build workflows.
  • Kept repo-specific steps inline (per-arch image tagging via crane and released PR/issue notifications).

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated 7 comments.

File Description
.github/workflows/release.yml New unified release workflow orchestrating release creation, binary+SBOM builds, container build, per-arch tagging, finalization, and notifications.
.github/workflows/release-slsa.yml Removed the old monolithic SLSA release workflow in favor of the new orchestrator.

Comment thread .github/workflows/release.yml
Comment thread .github/workflows/release.yml
Comment thread .github/workflows/release.yml
Comment thread .github/workflows/release.yml Outdated
Comment thread .github/workflows/release.yml
Comment thread .github/workflows/release.yml Outdated
Comment thread .github/workflows/release.yml
- notify-released needs `contents: write` to run `gh release edit`
  (was `contents: read`, which would fail when appending the issues
  link to release notes).
- Use `grep -Fx` instead of `grep "^${RELEASE_TAG}$"` so tag names
  with dots (e.g. v0.23.2) aren't regex-interpreted. Dots would
  accidentally match adjacent tags like v0-23-2 etc.

Signed-off-by: Sebastian Mendel <[email protected]>

@github-actions github-actions Bot 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.

Automated approval for solo maintainer project

All CI checks passed. See SECURITY.md for compensating controls.

@CybotTM CybotTM added this pull request to the merge queue Apr 17, 2026
Merged via the queue into main with commit 361e6a7 Apr 17, 2026
28 checks passed
@CybotTM CybotTM deleted the feat/unified-release branch April 17, 2026 12:05
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.

2 participants