Skip to content

Latest commit

 

History

History
129 lines (94 loc) · 5.35 KB

File metadata and controls

129 lines (94 loc) · 5.35 KB

Release runbook — v0.1.0 (manual, operator-executed)

Distribution model is set by ADR 0015: no crates.io for v0.1.0 — ship via cargo install --git + prebuilt GitHub Release binaries. Every step here is reversible (re-privatise the repo, edit or delete a Release, move a tag) — the opposite of a crates.io publish.

Going public and creating a Release are hard-confirm gates (CLAUDE.md "Decision points"). Run these yourself in your own terminal.

This runbook is append-friendly: future versions add a new section.


Precondition — already satisfied (do NOT redo)

Verified this cycle on a3ff6d4 (= v0.1.0^{commit} = the annotated, pushed tag):

  • v0.1.0 annotated tag exists on origin → a3ff6d4 (object c0b583d8).
  • CI green: fmt · clippy -D warnings · build --locked · test 368 passed / 2 skipped · doc -D warnings.
  • cargo deny check ok · cargo audit 0 vuln (3 allowed warns, ADR 0011).
  • cargo package -p mcp-loadtest packages + verifies (115 files).
  • Cargo.toml registry metadata complete (used by the deferred crates.io path; harmless now).
  • crates.io names mcp-loadtest / mcp-loadtest-cli free as of 2026-05-18 (only relevant if the Appendix is ever taken).

Optional quick re-confirm (safe, read-only):

git fetch origin --tags
test "$(git rev-parse 'v0.1.0^{commit}')" = "$(git rev-parse HEAD || true)" && echo "HEAD == tag" || echo "HEAD != tag (build the release from the tag)"
cargo package -p mcp-loadtest --locked   # must succeed

Gate A — make the repo public (hard-confirm; reversible)

Both distribution channels need a public repo. Cargo.toml repository/homepage already point at the canonical URL.

  • Repo is public at https://github.com/Teerapat-Vatpitak/mcp-loadtest.
  • v0.1.0 tag is on origin: git ls-remote --tags origin v0.1.0 → prints …refs/tags/v0.1.0.
  • Push the post-tag docs commits so the public main matches reality: git push origin main (carries the v0.2 backlog + the ADR 0015 doc set; the v0.1.0 tag does not include them — intentional).
  • Smoke the first channel immediately: cargo install --git https://github.com/Teerapat-Vatpitak/mcp-loadtest mcp-loadtest-cli then mcp-loadtest --version && mcp-loadtest doctor.

Reversibility: the repo can be set private again; nothing is permanent here.

Gate B — prebuilt binaries + Release (release.yml) (reversible)

.github/workflows/release.yml (hand-rolled matrix — not cargo-dist) builds the mcp-loadtest binary for x86_64-unknown-linux-gnu, aarch64-apple-darwin, x86_64-apple-darwin, x86_64-pc-windows-msvc, then creates the GitHub Release (if absent) and attaches each archive + its .sha256. Future v* tag pushes run it automatically; v0.1.0 was tagged before the workflow existed, so trigger it once manually:

gh workflow run release.yml -f tag=v0.1.0

(Or: GitHub → Actions → release → Run workflow → tag = v0.1.0.)

Watch the run:

gh run watch "$(gh run list --workflow=release.yml --limit 1 --json databaseId -q '.[0].databaseId')"

Do not delete-and-repush the v0.1.0 tag to trigger CI — moving a pushed tag is destructive and needs explicit sign-off; workflow_dispatch exists so you don't have to.

  • Workflow green; binaries built for all 4 targets.

Gate C — verify the Release (reversible)

The workflow already created the Release with notes + assets — no manual gh release create. Verify:

gh release view v0.1.0 --json assets -q ".assets[].name"
cargo install --git https://github.com/Teerapat-Vatpitak/mcp-loadtest mcp-loadtest-cli
mcp-loadtest --version
  • 4 archives + 4 .sha256 attached; cargo install --git works.
  • A Release can be edited or deleted later — nothing append-only here.

Gate D — announce (manual)

  • HN / lobste.rs / r/rust per DESIGN.md §10. Lead with the deadlock demo; install line is the cargo install --git one (not cargo install).

Caveats & rollback

  • Everything here is reversible — the whole reason for ADR 0015. Repo → private again; Release → edit/delete; binaries → re-upload; tag → (with sign-off) move. Contrast crates.io: a version there is permanent.
  • Post-tag commits (v0.2 backlog 4729fb1, the ADR 0015 doc set) are not in v0.1.0. Intentional — planning/distribution docs must not mutate a shipped tag. The tag is the code; main is where the docs move forward.
  • If a Bash/permission rule blocks a step inside Claude, run it in your own terminal; nothing about this release requires it to run inside Claude.

Appendix — crates.io (deferred, ADR 0015)

Recorded for the future revisit (trigger: 0.x API stabilises, or a real external library consumer asks). Append-only — only do this when the name/API commitment is acceptable.

# scoped token (publish-new + publish-update) at https://crates.io/settings/tokens
cargo login
git switch --detach v0.1.0          # publish from the exact tagged commit
cargo publish -p mcp-loadtest --locked
#   wait ~1–2 min for the index
cargo publish -p mcp-loadtest-cli --locked
git switch main

When this is taken, update README/DESIGN install lines back to plain cargo install mcp-loadtest-cli and write the follow-up ADR that closes ADR 0015's revisit question.