6d54c1e96c
Add sibling publish.yaml jobs (scoop-bucket, homebrew-tap) that render a manifest from the release .sha256 sidecars and idempotently push it to the org-level lazyeval/scoop-bucket and lazyeval/homebrew-tap repos, using the scoped lazyeval-ci bot token (LAZYEVAL_PKG_TOKEN). Render logic lives in dependency-free bash (the CI image has no jq/ruby): scripts/render-scoop-manifest.sh and scripts/render-homebrew-formula.sh. scripts/test-package-renders.sh exercises both: it validates the Scoop JSON with node and asserts fields on both manifests, and additionally runs `ruby -c` on the formula where ruby is present (dev box), skipping it gracefully otherwise. A new ci.yaml `manifests` job runs that test on every push so a render regression surfaces immediately, not at the next manual publish dispatch. The CI image has no ruby, so in CI the gate covers the Scoop JSON (node) and field assertions for both manifests; the formula's Ruby syntax is checked dev-side only (the static heredoc's variable parts cannot introduce syntax errors). - Scoop: x64 (gnu) + arm64 (gnullvm); #/-rename fragment so the bin shim is version-stable; checkver, no autoupdate (the pipeline is the updater). - Homebrew: on_macos/on_linux x arch bare-binary formula; no Windows. Docs: ADR-0056 Amendment 2 (+ README index, requirements D3). Unverified pending real use: scoop/brew install, the HEAD:main branch assumption, macOS Gatekeeper-via-brew on the ad-hoc-signed binary.
93 lines
4.0 KiB
Bash
Executable File
93 lines
4.0 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
#
|
|
# Tests for the package-manifest render scripts (Scoop + Homebrew).
|
|
#
|
|
# Validates that each render script emits a well-formed manifest for given
|
|
# inputs, and that the inputs land in the right places. Dependency-light:
|
|
# requires node (always in the CI image) for JSON parsing; uses jq and ruby for
|
|
# extra checks when present (both available on the dev box). No network.
|
|
#
|
|
# Run: scripts/test-package-renders.sh
|
|
set -euo pipefail
|
|
|
|
here=$(cd "$(dirname "$0")" && pwd)
|
|
tmp=$(mktemp -d)
|
|
trap 'rm -rf "$tmp"' EXIT
|
|
|
|
fail() { echo "FAIL: $*" >&2; exit 1; }
|
|
pass() { echo "ok: $*"; }
|
|
|
|
# Distinct dummy hashes so we can assert each lands in the right slot.
|
|
VER=9.9.9
|
|
H_WIN_X64=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa01
|
|
H_WIN_ARM=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa02
|
|
H_MAC_ARM=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa03
|
|
H_MAC_X64=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa04
|
|
H_LIN_ARM=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa05
|
|
H_LIN_X64=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa06
|
|
|
|
# ---- Scoop ----------------------------------------------------------------
|
|
scoop=$tmp/rdbms-playground.json
|
|
# Pass a leading 'v' to confirm it gets stripped.
|
|
"$here/render-scoop-manifest.sh" "v$VER" "$H_WIN_X64" "$H_WIN_ARM" > "$scoop"
|
|
|
|
node -e 'JSON.parse(require("fs").readFileSync(process.argv[1],"utf8"))' "$scoop" \
|
|
|| fail "scoop manifest is not valid JSON"
|
|
pass "scoop manifest parses as JSON"
|
|
|
|
# Field-level assertions via node (no jq dependency).
|
|
check_json() { # <jsexpr> <expected>
|
|
local got
|
|
got=$(node -e '
|
|
const m = JSON.parse(require("fs").readFileSync(process.argv[1],"utf8"));
|
|
process.stdout.write(String(eval(process.argv[2])));
|
|
' "$scoop" "$1")
|
|
[ "$got" = "$2" ] || fail "scoop: $1 = '$got', expected '$2'"
|
|
}
|
|
check_json 'm.version' "$VER"
|
|
check_json 'm.bin' "rdbms-playground.exe"
|
|
check_json 'm.architecture["64bit"].hash' "$H_WIN_X64"
|
|
check_json 'm.architecture["arm64"].hash' "$H_WIN_ARM"
|
|
check_json 'm.checkver.jsonpath' '$.tag_name'
|
|
grep -q "rdbms-playground-v$VER-x86_64-pc-windows-gnu.exe#/rdbms-playground.exe" "$scoop" \
|
|
|| fail "scoop: x64 url/fragment missing"
|
|
grep -q "rdbms-playground-v$VER-aarch64-pc-windows-gnullvm.exe#/rdbms-playground.exe" "$scoop" \
|
|
|| fail "scoop: arm64 url/fragment missing"
|
|
pass "scoop manifest fields correct"
|
|
|
|
if command -v jq >/dev/null 2>&1; then
|
|
jq -e . "$scoop" >/dev/null || fail "scoop: jq rejected the manifest"
|
|
pass "scoop manifest valid per jq"
|
|
fi
|
|
|
|
# ---- Homebrew -------------------------------------------------------------
|
|
formula=$tmp/rdbms-playground.rb
|
|
"$here/render-homebrew-formula.sh" "$VER" "$H_MAC_ARM" "$H_MAC_X64" "$H_LIN_ARM" "$H_LIN_X64" > "$formula"
|
|
|
|
if command -v ruby >/dev/null 2>&1; then
|
|
ruby -c "$formula" >/dev/null || fail "homebrew formula is not valid Ruby"
|
|
pass "homebrew formula parses as Ruby"
|
|
else
|
|
echo "warn: ruby not present — skipping formula syntax check" >&2
|
|
fi
|
|
|
|
# Each hash must appear exactly once (right asset → right slot), the version
|
|
# must be present, and #{version} must survive verbatim for brew's test block.
|
|
for pair in \
|
|
"aarch64-apple-darwin:$H_MAC_ARM" \
|
|
"x86_64-apple-darwin:$H_MAC_X64" \
|
|
"aarch64-unknown-linux-musl:$H_LIN_ARM" \
|
|
"x86_64-unknown-linux-musl:$H_LIN_X64"; do
|
|
target=${pair%%:*}; hash=${pair#*:}
|
|
grep -q "rdbms-playground-v$VER-$target\"" "$formula" || fail "homebrew: url for $target missing"
|
|
grep -q "sha256 \"$hash\"" "$formula" || fail "homebrew: sha256 for $target missing"
|
|
done
|
|
grep -q 'version "'"$VER"'"' "$formula" || fail "homebrew: version line missing"
|
|
grep -q 'assert_match "rdbms-playground #{version}"' "$formula" \
|
|
|| fail "homebrew: test block #{version} interpolation was mangled"
|
|
grep -q 'rdbms-playground-v9.9.9-x86_64-pc-windows' "$formula" \
|
|
&& fail "homebrew: formula unexpectedly references a Windows asset"
|
|
pass "homebrew formula fields correct"
|
|
|
|
echo "all render tests passed"
|