Skip to main content

max / pter

2.3 KB · 48 lines History Blame Raw
1 // Publish this crate to crates.io.
2 //
3 // A library has no per-platform artifact, so this is the whole release: one
4 // recipe, run on whichever host the manifest names.
5 //
6 // The preflight step is the point of routing this through Bento. crates.io
7 // versions can be yanked but never edited, so a wrong repository URL, a
8 // missing license, or a duplicate version is permanent the moment it uploads.
9 // pter 0.1.0 went out with a dead repository link and could only be corrected
10 // by releasing again.
11
12 let h = build_host();
13 let r = repo();
14 let v = version();
15
16 // No pull here. The runner's release preflight has already fetched and run
17 // `git checkout v<version>` on every host, then compared `rev-parse HEAD`
18 // across them so a release cannot be built from two different commits. That
19 // leaves the checkout on the tag, detached. Pulling would move it off the tag
20 // onto the branch tip, publishing something other than what was tagged — and on
21 // a detached HEAD it just fails, which is how this was found, while publishing
22 // makeover 2.1.0 as the first library to go through Bento.
23 //
24 // So this step asserts the pin instead of re-doing it: HEAD must be exactly a
25 // tag, or the release is not coming from where it claims.
26 step("checkout");
27 sh_ok(h, "cd " + r + " && git describe --exact-match --tags HEAD");
28
29 // Gate: nothing reaches crates.io from code that fails clippy or its tests. A
30 // published version can be yanked but never edited, so this is the last point
31 // at which a break is still cheap.
32 step("prebuild");
33 sh_ok(h, "cd " + r + " && cargo clippy --workspace --all-targets " + feature_flags() + " -- -D warnings");
34 sh_ok(h, "cd " + r + " && cargo test --workspace " + feature_flags());
35
36 step("verify");
37 // Credentials are checked here too, and deliberately not passed through Bento:
38 // the token stays in cargo's own 0600 store on the publishing host, where cargo
39 // finds it. Handing it to a shell command would put it in the process list for
40 // the length of the upload, and ops-exec renders env pairs into the shell line.
41 // Aborts the run with the specific problems if anything is wrong.
42 log(crate_preflight());
43 sh_ok(h, "cd " + r + " && cargo publish --dry-run " + feature_flags());
44
45 step("publish");
46 sh_ok(h, "cd " + r + " && cargo publish " + feature_flags());
47 log("published " + v + " to crates.io");
48