moving
Some checks failed
Installer Smoke / installer-smoke (push) Has been cancelled

This commit is contained in:
Oleg Maslov
2026-09-02 10:10:29 +02:00
commit 0c3e2ead3b
3841 changed files with 970576 additions and 0 deletions

115
.github/workflows/installer-smoke.yml vendored Normal file
View File

@@ -0,0 +1,115 @@
name: Installer Smoke
# Authoritative Linux proof for the one-line self-host installer (steal #5).
# The installer is developed on Windows, where the esbuild-hoist trap and CRLF
# quirks are Windows-only — so a green `bash -n` locally is NOT proof it works
# for the VPS/homelab audience. This job runs install.sh end-to-end from a
# clean ubuntu runner: it actually installs, builds packages, boots the sidecar,
# and asserts /health returns 200, then tears it down and asserts the port frees.
on:
pull_request:
paths:
- install.sh
- scripts/waggle-server.sh
- .github/workflows/installer-smoke.yml
push:
paths:
- install.sh
- scripts/waggle-server.sh
- .github/workflows/installer-smoke.yml
workflow_dispatch:
jobs:
installer-smoke:
runs-on: ubuntu-latest
timeout-minutes: 30
env:
WAGGLE_PORT: "3947"
steps:
- uses: actions/checkout@v4
# The `runner` context is not available in job-level env, so the scratch
# paths (isolated from the checkout to exercise the real "copy + fresh
# install" path) are computed here from $RUNNER_TEMP instead.
- name: Compute scratch paths
run: |
echo "WAGGLE_INSTALL_DIR=$RUNNER_TEMP/waggle" >> "$GITHUB_ENV"
echo "WAGGLE_DATA_DIR=$RUNNER_TEMP/wdata" >> "$GITHUB_ENV"
- uses: actions/setup-node@v4
with:
node-version: 20
cache: npm
# shellcheck ships pre-installed on ubuntu-latest runners. Findings are
# failures — the installer is user-facing shell that runs unsupervised via
# `curl | bash`, so lint cleanliness is a correctness gate, not a nicety.
- name: shellcheck installer scripts
run: shellcheck install.sh scripts/waggle-server.sh
# The real E2E. --local-source copies THIS checkout (tracked + untracked,
# excluding node_modules/dist) into a scratch dir, then does a from-scratch
# npm install + build:packages there. --no-web keeps it to API/echo mode
# (no vite build); --no-start hands the boot to waggle-server.sh below so we
# test the process manager too.
- name: Install (install.sh --yes, from-scratch)
run: |
./install.sh \
--yes \
--no-web \
--no-start \
--local-source "$GITHUB_WORKSPACE" \
--dir "$WAGGLE_INSTALL_DIR" \
--data-dir "$WAGGLE_DATA_DIR" \
--port "$WAGGLE_PORT"
- name: Start the sidecar (waggle-server.sh start)
run: |
bash "$WAGGLE_INSTALL_DIR/scripts/waggle-server.sh" start \
--port "$WAGGLE_PORT" \
--data-dir "$WAGGLE_DATA_DIR"
# Defensive re-poll. waggle-server.sh already blocks until /health is 200
# (up to 60s; the sidecar spends ~9s on marketplace sync before listening),
# so this normally passes on the first attempt. The wider 90s budget guards
# against a slow cold runner without making the assertion flaky.
- name: Wait for /health (HTTP 200)
run: |
url="http://127.0.0.1:${WAGGLE_PORT}/health"
for i in $(seq 1 90); do
code="$(curl -s -o /dev/null -w '%{http_code}' --max-time 3 "$url" || echo 000)"
if [ "$code" = "200" ]; then
echo "healthy after ${i}s (HTTP 200)"
exit 0
fi
sleep 1
done
echo "::error::/health did not return 200 within 90s"
echo "--- last sidecar log lines ---"
tail -n 40 "$WAGGLE_DATA_DIR/server.log" 2>/dev/null || true
exit 1
- name: Status
run: |
bash "$WAGGLE_INSTALL_DIR/scripts/waggle-server.sh" status \
--port "$WAGGLE_PORT" \
--data-dir "$WAGGLE_DATA_DIR"
- name: Stop
run: |
bash "$WAGGLE_INSTALL_DIR/scripts/waggle-server.sh" stop \
--port "$WAGGLE_PORT" \
--data-dir "$WAGGLE_DATA_DIR"
- name: Assert port is free after stop
run: |
url="http://127.0.0.1:${WAGGLE_PORT}/health"
if curl -fsS -o /dev/null --max-time 3 "$url"; then
echo "::error::/health still responding on port ${WAGGLE_PORT} after stop"
exit 1
fi
echo "port ${WAGGLE_PORT} is free"
- name: Dump sidecar log on failure
if: failure()
run: tail -n 100 "$WAGGLE_DATA_DIR/server.log" 2>/dev/null || echo "(no log file)"