diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 6236f67..d7911f0 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -42,13 +42,16 @@ jobs: run: | test "$(find dist -maxdepth 1 -name '*.tar.gz' | wc -l)" -eq 5 archive="$(find dist -maxdepth 1 -name '*_linux_amd64.tar.gz')" - tar -tzf "$archive" | grep -q '/spoold$' - tar -tzf "$archive" | grep -q '/spoolctl$' + listing="$(mktemp)" + tar -tzf "$archive" > "$listing" + grep -q '/spoold$' "$listing" + grep -q '/spoolctl$' "$listing" (cd dist && sha256sum --check checksums.txt) + version="$(jq -r .version dist/metadata.json)" unpacked="$(mktemp -d)" tar -xzf "$archive" -C "$unpacked" - "$(find "$unpacked" -type f -name spoold)" -version | grep -q 'spoold 0.0.0-SNAPSHOT' - "$(find "$unpacked" -type f -name spoolctl)" version | grep -q 'spoolctl 0.0.0-SNAPSHOT' + "$(find "$unpacked" -type f -name spoold)" -version | grep -Fq "spoold ${version}" + "$(find "$unpacked" -type f -name spoolctl)" version | grep -Fq "spoolctl ${version}" - name: Verify installer run: | installed="$(mktemp -d)" @@ -61,9 +64,10 @@ jobs: "$installed/spoolctl" version | grep -q "spoolctl ${version}" - name: Verify release container run: | + version="$(jq -r .version dist/metadata.json)" image="$(docker image ls ghcr.io/rionlyu/spoold --format '{{.Repository}}:{{.Tag}}' | grep -- '-amd64$' | head -n 1)" test -n "$image" - docker run --rm "$image" -version | grep -q 'spoold 0.0.0-SNAPSHOT' + docker run --rm "$image" -version | grep -Fq "spoold ${version}" docker volume create spoold-ci-data trap 'docker rm -f spoold-release-ci >/dev/null 2>&1 || true; docker volume rm spoold-ci-data >/dev/null 2>&1 || true' EXIT docker run -d \ diff --git a/README.md b/README.md index 6939dfb..bd2da98 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,8 @@ disk before acknowledging the request, delivers it in the background, and resumes bounded retries after process termination, reboot, destination failure, or network loss. +![A delivery is queued while its destination is offline, survives a forced spoold termination, and succeeds after restart.](demo/spoold-v0.1.0-crash-recovery.gif) + It is intentionally a local delivery spool, not a hosted webhook platform or general message broker. One self-contained daemon and one owner-only journal provide the reliability boundary without PostgreSQL, Redis, Kafka, a cloud diff --git a/demo/render.html b/demo/render.html new file mode 100644 index 0000000..374c33e --- /dev/null +++ b/demo/render.html @@ -0,0 +1,210 @@ + + + + + spoold v0.1.0 crash-recovery demo + + + + + + + diff --git a/demo/spoold-v0.1.0-crash-recovery-poster.png b/demo/spoold-v0.1.0-crash-recovery-poster.png new file mode 100644 index 0000000..5a9b01a Binary files /dev/null and b/demo/spoold-v0.1.0-crash-recovery-poster.png differ diff --git a/demo/spoold-v0.1.0-crash-recovery.gif b/demo/spoold-v0.1.0-crash-recovery.gif new file mode 100644 index 0000000..a573af4 Binary files /dev/null and b/demo/spoold-v0.1.0-crash-recovery.gif differ diff --git a/demo/spoold-v0.1.0-crash-recovery.mp4 b/demo/spoold-v0.1.0-crash-recovery.mp4 new file mode 100644 index 0000000..1ecee43 Binary files /dev/null and b/demo/spoold-v0.1.0-crash-recovery.mp4 differ