Skip to content

feat(ci): ship binaries for every binary crate, not just resq-cli - #217

Merged
WomB0ComB0 merged 2 commits into
masterfrom
feat/release-binaries-for-all-crates
Sep 22, 2026
Merged

WomB0ComB0 merged 2 commits into
masterfrom
feat/release-binaries-for-all-crates

Conversation

@WomB0ComB0

Copy link
Copy Markdown
Member

Why

resq-bin, resq-clean, resq-flame and resq-perf each declare a [[bin]], and each has received a git tag and a GitHub Release on every publish — every one carrying assets: 0. They are installable tools that have never shipped an installable artifact. Confirmed on the v0.1.22 releases cut today.

Two halves, and both are required

release.yml only ever released resq-cli. The guard rejected any tag not matching resq-cli-v*, and the build hardcoded -p resq-cli and bin="resq". It now derives the crate from the tag and looks the binary name up from cargo metadata.

That lookup is not incidental. resq-cli's [[bin]] is resq, not resq-cli — so deriving the binary from the crate name would read as obviously correct and then fail at the cp, for exactly one crate:

crate [[bin]]
resq-cli resq
resq-bin / resq-clean / resq-flame / resq-perf same as crate

release-plz.toml is the half that makes it possible. The four siblings were inheriting the [workspace] default git_release_enable = true, so release-plz created and published their releases itself. Releases are immutable in this org, so release.yml could never have attached assets to them no matter how the guard was written — the fix had to start here. They now carry git_release_enable = false like resq-cli, handing the draft → upload → publish lifecycle to release.yml.

release-plz.yml's dispatch hop selects the same five crates, so a library crate never dispatches a binary build.

Three places now encode the same list — the guard allowlist, release-plz.toml, and the jq filter. Each carries a comment pointing at the other two, and the failure modes are spelled out: a crate missing from the filter gets a bare release with no binaries; a crate in the filter but not in release-plz.toml gets published by release-plz first and then fails loudly in release.yml rather than silently shipping nothing.

On the asset name

resq-cli keeps its historical doubled name (resq-cli-resq-cli-v…). Renaming mid-stream would break any hardcoded download URL at an arbitrary version boundary, and immutable releases cannot be retrofitted to match. The newly onboarded crates have no such history and start with the clean <tag>-<target> form. The asymmetry is commented at the point it happens.

Deliberately unchanged

dry_run defaulting to true; the -f dry_run=false dispatch; persist-credentials: false; fetch-depth: 0.

Test plan

  • actionlint clean on both workflows
  • guard accepts the five binary crates and rejects resq-tui, resq-dsa, resq-ai, v1.0.0, and malformed tags
  • crate derivation checked: resq-cli-v0.4.3 → resq-cli, resq-perf-v0.1.22 → resq-perf
  • binary lookup checked against real cargo metadata for all five, including the resq-cli → resq case
  • jq filter checked against a synthetic releases payload — selects resq-cli/resq-bin, excludes resq-tui/resq-dsa
  • cargo build -p resq-bin --bin resq-bin succeeds
  • CI green
  • Real proof is the next release cutting a sibling tag and that release carrying assets

resq-bin, resq-clean, resq-flame and resq-perf each declare a [[bin]] and
each got a tag and a GitHub Release on every publish — carrying `assets: 0`.
They are installable tools that shipped no installable artifact. Verified on
the v0.1.22 releases cut today.

Two things had to change together.

release.yml only ever released resq-cli: the guard rejected any other tag and
the build hardcoded `-p resq-cli` and `bin="resq"`. It now derives the crate
from the tag and the binary name from `cargo metadata`. The metadata lookup
is not incidental — resq-cli's [[bin]] is `resq`, so deriving the binary from
the crate name would look correct and break for exactly one crate.

release-plz.toml is the half that makes it possible. The four siblings were
inheriting the [workspace] default `git_release_enable = true`, so release-plz
created AND published their releases itself. Published releases are immutable
here, so release.yml could never have attached anything to them however the
guard was written. They now set `git_release_enable = false` like resq-cli,
handing the draft -> upload -> publish lifecycle to release.yml.

The dispatch hop in release-plz.yml selects the same five crates, so a
library crate never dispatches a binary build.

resq-cli keeps its historical doubled asset name (resq-cli-resq-cli-v…).
Renaming mid-stream would break hardcoded download URLs at an arbitrary
version boundary and immutable releases cannot be retrofitted to match; the
newly onboarded crates have no such history and start clean.

Unchanged: the dry_run default of true, the -f dry_run=false dispatch,
persist-credentials: false, fetch-depth: 0.
@coderabbitai

coderabbitai Bot commented Sep 21, 2026

Copy link
Copy Markdown

Warning

Review limit reached

Next included review available in 44 minutes.

Check out review usage here.

View limit details

Limit details: You’ve used the included review currently available.

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

Learn how review limits work.

Review configuration:

⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Advanced

Run ID: c465e8fc-b947-449a-bbbe-7a67b9948642

📥 Commits

Reviewing files that changed from the base of the PR and between 361454d and 72aaadf.

📒 Files selected for processing (3)
  • .github/workflows/release-plz.yml
  • .github/workflows/release.yml
  • release-plz.toml

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actions github-actions Bot added size/L A-DevOps CI/CD and tooling C-Feature New feature or request labels Sep 21, 2026
@WomB0ComB0
WomB0ComB0 merged commit 8b7a9a8 into master Sep 22, 2026
26 checks passed
@WomB0ComB0
WomB0ComB0 deleted the feat/release-binaries-for-all-crates branch September 22, 2026 05:31
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

A-DevOps CI/CD and tooling C-Feature New feature or request size/L

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant