Skip to content

Add Scoop bucket manual-update Justfile recipe#16

Closed
johnpmitsch wants to merge 0 commit into
mainfrom
add/scoop-bucket-recipe
Closed

Add Scoop bucket manual-update Justfile recipe#16
johnpmitsch wants to merge 0 commit into
mainfrom
add/scoop-bucket-recipe

Conversation

@johnpmitsch

@johnpmitsch johnpmitsch commented Jun 11, 2026

Copy link
Copy Markdown
Collaborator

Summary

Adds release-update-scoop-bucket — the Scoop equivalent of release-update-homebrew-tap we shipped with Phase 3. A maintainer-run command that downloads the Windows zip's sha256 from a release and writes a Scoop manifest (bucket/qn.json) into a local clone of quicknode/scoop-bucket, then prints the git push command.

The manifest includes checkver = \"github\" and an autoupdate block, so once a user has tapped the bucket, scoop update finds new versions on its own — we only need to run this recipe to keep the canonical version field honest for scoop search.

Usage

just release-update-scoop-bucket 0.1.4 ~/qn/scoop-bucket

Test plan

  • Recipe parses (just --list shows it).
  • End-to-end-tested against a throwaway git repo with v0.1.4's actual release: generated a valid JSON manifest with the real sha256, correct binary name, and an autoupdate block whose $version placeholder is preserved unexpanded.
  • After merge, manually create quicknode/scoop-bucket (empty public repo), clone it, run the recipe against v0.1.4, push.
  • README install matrix add scoop install quicknode/qn (or quicknode-cli) entry once the bucket is populated.

johnpmitsch added a commit that referenced this pull request Jun 11, 2026
`release-prepare` ships the automated half of a release end-to-end:
bump, PR, merge, tag, CI runs all the in-CI publish jobs. The other
half (Homebrew, Scoop, AUR — currently maintainer-driven because we
don't yet have the credentials to automate the pushes) was three
separate `just release-update-*` invocations with three local clone
paths to remember and three push commands to type. Easy to forget,
easy to skip a channel.

This commit collapses that to one wrapper:

  just release-sync-manual-channels

Auto-detects the just-released version from the latest git tag,
expects three sibling clones under ~/qn/ (the established convention
across this repo's recipes), runs the three release-update-* recipes
in sequence, then prints the three `git -C ... push` commands the
maintainer reviews and runs to publish.

Both arguments are optional and overridable:

  just release-sync-manual-channels ~/work/quicknode      # alt root
  just release-sync-manual-channels ~/qn 0.1.4            # backfill

Also folds in the `release-update-scoop-bucket` recipe (previously in
PR #16, which is now redundant — close it after this lands). Scrubbed
the invented secret-name reference from its comment per CLAUDE.md.

Adds a "Quick release" section at the top of RELEASING.md showing the
happy-path two-command flow:

  just release-prepare X.Y.Z
  # … wait for CI …
  just release-sync-manual-channels

The detailed per-channel sections stay below it as reference for when
something fails or the maintainer needs to drive a single channel
manually.
johnpmitsch added a commit that referenced this pull request Jun 11, 2026
…install docs (#18)

* Document Scoop and AUR install paths in README

Scoop bucket has been seeded for v0.1.4 and the AUR qn-bin package is
registered + installable via yay. Two new install snippets so users on
Windows + Arch don't have to know about the GitHub Releases page.
Homebrew was already in the install matrix.

* Wire COPR publish into the release pipeline (Phase 7)

Adds COPR (Fedora + EPEL) to the cargo-dist user_publish_jobs pipeline.
Same shape as the existing crates.io / Docker / .deb publish jobs.

Why the spec-file approach:

  copr-cli's only build entrypoint accepts SRPMs or spec files — it
  doesn't import prebuilt binary RPMs. So the binary-everywhere
  property we have for crates.io, GHCR, .deb, and AUR needed a thin
  spec whose %prep downloads the SLSA-attested upstream tarball
  cargo-dist already published, verifies it against the .sha256
  sidecar, and then %install just lays the binary into the buildroot.
  COPR's mock chroot does this on each Fedora + EPEL chroot in
  ~30 seconds — no Rust toolchain involved, single trust chain.

Why four secrets instead of one combined config blob:

  copr-cli only reads credentials from ~/.config/copr (no env-var
  fallback per copr/v3/helpers.py's config_from_file). The workflow
  has to assemble that file at runtime regardless. Splitting the four
  fields (login, username, token, copr_url) into separate repo secrets
  makes each one safe to paste as a single line (no multiline blob to
  get malformed) and lets the token be rotated without touching the
  other three.

Changes:

  * packaging/qn-bin.spec — the thin spec. ExclusiveArch: x86_64
    aarch64. Per-arch Source URL via ifarch, sha256 verification in
    %prep before %setup.

  * .github/workflows/publish-copr.yml — reusable workflow invoked
    by cargo-dist. Builds the SRPM from the spec (with QN_VERSION
    passed in from the dist manifest), assembles ~/.config/copr from
    the four COPR_* secrets, then dispatches via
    `copr-cli build --enable-net=on quicknode/qn <srpm>`.

    --enable-net=on is required because %prep curls the tarball;
    COPR's default mock has network disabled.

  * dist-workspace.toml — adds ./publish-copr to publish-jobs and
    grants `contents: read` via github-custom-job-permissions.

  * RELEASING.md — documents the COPR channel under CI publish
    channels and the four-secret provisioning flow.

  * release.yml — regenerated to include custom-publish-copr.

The job is gated by cargo-dist on `!is_prerelease`, same as the
others. Until all four COPR_* secrets are set on the repo, the job
will fail loudly at the "Configure copr-cli" step with a clear error
listing which fields are missing — the rest of the release continues
to succeed.

Earlier in this branch I went down a wrong path: a `release-build-copr-rpms`
Justfile recipe + [package.metadata.generate-rpm] block that produced
binary RPMs locally with cargo-generate-rpm. `copr-cli build` doesn't
accept binary RPMs, so that path was a dead-end. Reset and rewrote
before opening the PR for review.

* Add release-sync-manual-channels + bring Scoop recipe into this PR

`release-prepare` ships the automated half of a release end-to-end:
bump, PR, merge, tag, CI runs all the in-CI publish jobs. The other
half (Homebrew, Scoop, AUR — currently maintainer-driven because we
don't yet have the credentials to automate the pushes) was three
separate `just release-update-*` invocations with three local clone
paths to remember and three push commands to type. Easy to forget,
easy to skip a channel.

This commit collapses that to one wrapper:

  just release-sync-manual-channels

Auto-detects the just-released version from the latest git tag,
expects three sibling clones under ~/qn/ (the established convention
across this repo's recipes), runs the three release-update-* recipes
in sequence, then prints the three `git -C ... push` commands the
maintainer reviews and runs to publish.

Both arguments are optional and overridable:

  just release-sync-manual-channels ~/work/quicknode      # alt root
  just release-sync-manual-channels ~/qn 0.1.4            # backfill

Also folds in the `release-update-scoop-bucket` recipe (previously in
PR #16, which is now redundant — close it after this lands). Scrubbed
the invented secret-name reference from its comment per CLAUDE.md.

Adds a "Quick release" section at the top of RELEASING.md showing the
happy-path two-command flow:

  just release-prepare X.Y.Z
  # … wait for CI …
  just release-sync-manual-channels

The detailed per-channel sections stay below it as reference for when
something fails or the maintainer needs to drive a single channel
manually.
@johnpmitsch johnpmitsch force-pushed the add/scoop-bucket-recipe branch from 4f168ec to 15f22a1 Compare June 11, 2026 18:01
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