fangorn/ex_git_objectstore
public
ref:9b1a04f20a91d711b8a2f779735d94803bc2e5d9
fix: drop broken file(1) sanity check from release step (#9)
## Problem
PR #8 added two decorations on top of the URL fix:
1. \`curl -sSLf\` (fail on HTTP errors)
2. \`file /usr/local/bin/anvil | grep -q 'ELF' || exit 1\` (post-download sanity check)
Neither does what I claimed:
1. **\`-f\` is useless against the actual failure mode.** The broken \`/cli/download\` URL responds \`302 Location: /\` with a \`phoenix_flash=Not found.\` cookie. \`-L\` follows the redirect to a 200 (login page). \`-f\` only trips on direct 4xx/5xx. The HTML still lands on disk.
2. **\`file\` is not in the CI base image.** \`hexpm/elixir:1.18.4-erlang-28.0.2-debian-bookworm-20250811\` doesn't include it, and the release step's apt install line only adds \`git jq curl\`. With \`file\` missing, the pipe produces empty stdout, \`grep -q ELF\` exits 1, and the \`||\` branch fires with an incorrect message — the download was probably fine, I just can't tell.
Observed on pipeline \`27af6331f1\` against main commit \`42afe6a\` (PR #8's squash merge):
/bin/sh: 25: file: not found
anvil download is not an ELF binary
My earlier local dry-run added \`file\` to the apt install list in the test harness, which is why it passed locally. That was a test-harness cheat that let a broken fix through.
## Fix
Drop both decorations. The only thing that fixes anything is the URL change (which landed in PR #8 and is preserved here). The minimal working script is:
\`\`\`yaml
curl -sL \"https://anvil.fangorn.io/runner/download?os=\$(uname -s)&arch=\$(uname -m)\" -o /usr/local/bin/anvil
chmod +x /usr/local/bin/anvil
\`\`\`
## Proof on the actual runner (carl)
Verified directly on carl — the same aarch64 Raspberry Pi that executes ex_git_objectstore CI jobs:
curl -sL \"https://anvil.fangorn.io/runner/download?os=Linux&arch=aarch64\" -o anvil
chmod +x anvil
Result:
- 8,705,904 bytes downloaded
- First 4 bytes: \`177 E L F\` (the ELF magic)
- \`./anvil --version\` → \`anvil 2026.04.3\`
- \`./anvil release create --help\` → shows \`--tag\`, \`--title\`, \`--body\`, \`--repo\` — matches exactly what the release script passes
No \`file(1)\` required. No \`-f\` flag. Just the URL.
## Diff
- # Install anvil CLI. The /runner/download endpoint serves the real
- # binary (anvil and anvil-runner are a single binary per the April
- # 2026 unification). /cli/download returns an HTML error page on
- # this server, which previously got written to /usr/local/bin/anvil
- # and crashed with \`Syntax error: newline unexpected\` at runtime.
- # Fail loud if curl ever stops returning an ELF binary.
- curl -sSLf \"https://anvil.fangorn.io/runner/download?...\" -o /usr/local/bin/anvil
+ # Install anvil CLI. /runner/download serves the unified
+ # anvil/anvil-runner binary (fangorn/anvil#49 merged the two).
+ curl -sL \"https://anvil.fangorn.io/runner/download?...\" -o /usr/local/bin/anvil
chmod +x /usr/local/bin/anvil
- file /usr/local/bin/anvil | grep -q 'ELF' || { echo \"anvil download is not an ELF binary\"; head -5 /usr/local/bin/anvil; exit 1; }
Net: 3 insertions, 8 deletions. The only functional change from current main is removing the \`file\` check.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
SHA:
9b1a04f20a91d711b8a2f779735d94803bc2e5d9
Author:
Anvil <noreply@anvil.fangorn.io>
Date:
2026-04-13 19:38
Parents:
42afe6a
1 files changed
+3
-8
| Type | ||
|---|---|---|
|
|
.anvil.yml | +3 −8 |
|
||