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
@@ -85,15 +85,10 @@
exit 0
fi
# 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
# 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?os=$(uname -s)&arch=$(uname -m)" -o /usr/local/bin/anvil
# 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?os=$(uname -s)&arch=$(uname -m)" -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; }
# Compute CalVer version
VERSION=$(bash ci/release.sh)