mirror of
https://github.com/CyberMind-FR/secubox-deb.git
synced 2026-07-29 18:36:55 +00:00
test(metablog): Smoke test for 3-site Gitea ingest (ref #94)
fix(metablog-ingest-site): Handle .git repos with unborn branch (no commits): - Use git rev-parse --verify HEAD (exits non-zero on unborn branch) instead of rev-parse HEAD (which returns "HEAD" string even with no commits) - Add fall-through path: .git exists + no commits → git symbolic-ref HEAD refs/heads/main + commit + push (same as fresh-init path) test: Add tests/scripts/test-metablog-ingest.sh smoke test: - Step 1: dry-run --limit 3 verifies report total=3 - Step 2: live --limit 3 accepts any ok+skip combo >= 3 - Step 3: idempotent re-run asserts all 3 skip-already-current - Step 4: git ls-remote via MOCHAbin SSH verifies remote HEAD exists - Step 5: clone+diff via MOCHAbin SSH (diff --exclude=.git) verifies clone == source Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
557d85b27e
commit
a0e9ba8beb
|
|
@ -54,27 +54,48 @@ cd "\$SITE"
|
|||
remote_head=\$(git ls-remote "\$REPO_URL" main 2>/dev/null | awk '{print \$1}' || true)
|
||||
|
||||
if [[ -d .git ]]; then
|
||||
# Has local history
|
||||
local_head=\$(git rev-parse HEAD 2>/dev/null || true)
|
||||
# Determine if there are any commits (--verify exits non-zero on unborn branch)
|
||||
local_head=\$(git rev-parse --verify HEAD 2>/dev/null || true)
|
||||
if [[ -n "\$remote_head" && "\$remote_head" == "\$local_head" ]]; then
|
||||
echo "skip-already-current"
|
||||
exit 0
|
||||
fi
|
||||
# Retarget and push
|
||||
|
||||
if [[ -n "\$local_head" ]]; then
|
||||
# Has commits — retarget and push existing history
|
||||
git remote set-url origin "\$REPO_URL" 2>/dev/null \
|
||||
|| git remote add origin "\$REPO_URL"
|
||||
# Source branch is whatever HEAD points at; rename to main on push
|
||||
src_branch=\$(git symbolic-ref --short HEAD 2>/dev/null || echo HEAD)
|
||||
# Use --force-with-lease only when remote already has a main branch;
|
||||
# for first push (remote_head empty), use --force (bootstrapping case).
|
||||
if [[ -n "\$remote_head" ]]; then
|
||||
git push --quiet --force-with-lease origin "\$src_branch:main"
|
||||
else
|
||||
git push --quiet --force origin "\$src_branch:main"
|
||||
fi
|
||||
git tag -f v1.0.0
|
||||
git push --quiet --force origin v1.0.0
|
||||
echo "ingested-with-history"
|
||||
exit 0
|
||||
fi
|
||||
# Falls through: .git exists but no commits (unborn branch) — treat as fresh.
|
||||
# Rename branch to 'main' in-place (safe with no commits: just rewrite HEAD)
|
||||
git config user.email "metablog-ingest@cybermind.fr"
|
||||
git config user.name "MetaBlogizer Ingest"
|
||||
git symbolic-ref HEAD refs/heads/main
|
||||
git remote set-url origin "\$REPO_URL" 2>/dev/null \
|
||||
|| git remote add origin "\$REPO_URL"
|
||||
# Source branch is whatever HEAD points at; rename to main on push
|
||||
src_branch=\$(git symbolic-ref --short HEAD 2>/dev/null || echo HEAD)
|
||||
# Use --force-with-lease only when remote already has a main branch;
|
||||
# for first push (remote_head empty), use --force (bootstrapping case).
|
||||
if [[ -n "\$remote_head" ]]; then
|
||||
git push --quiet --force-with-lease origin "\$src_branch:main"
|
||||
else
|
||||
git push --quiet --force origin "\$src_branch:main"
|
||||
git add -A
|
||||
if git diff --cached --quiet; then
|
||||
echo "fail-empty-dir"
|
||||
exit 1
|
||||
fi
|
||||
git tag -f v1.0.0
|
||||
git push --quiet --force origin v1.0.0
|
||||
echo "ingested-with-history"
|
||||
git commit -q -m "feat: import from /srv/metablogizer/sites/\$NAME"
|
||||
git push --quiet origin main
|
||||
git tag v1.0.0
|
||||
git push --quiet origin v1.0.0
|
||||
echo "ingested-fresh"
|
||||
exit 0
|
||||
else
|
||||
# No local git — fresh init
|
||||
|
|
|
|||
84
tests/scripts/test-metablog-ingest.sh
Executable file
84
tests/scripts/test-metablog-ingest.sh
Executable file
|
|
@ -0,0 +1,84 @@
|
|||
#!/usr/bin/env bash
|
||||
# tests/scripts/test-metablog-ingest.sh
|
||||
# Smoke test for the MetaBlogizer → Gitea ingest pipeline.
|
||||
# Runs against the live Gitea — NOT a unit test.
|
||||
|
||||
set -euo pipefail
|
||||
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
||||
REPO="$(cd "$SCRIPT_DIR/../.." && pwd)"
|
||||
source "$REPO/scripts/lib/test-helpers.sh"
|
||||
|
||||
GITEA_HOST="${GITEA_HOST:-gitea.gk2.secubox.in}"
|
||||
GITEA_SSH_PORT="${GITEA_SSH_PORT:-2222}"
|
||||
GITEA_SSH_USER="${GITEA_SSH_USER:-gitea}"
|
||||
REPORT="$REPO/output/ingest-report.json"
|
||||
|
||||
log_step() { echo "[smoke step $1] $2"; }
|
||||
|
||||
# Step 1: Dry-run, --limit 3
|
||||
log_step 1 "dry-run --limit 3"
|
||||
bash "$REPO/scripts/metablog-ingest.sh" --dry-run --limit 3 >/dev/null 2>&1
|
||||
total=$(jq '.total' "$REPORT")
|
||||
assert_eq "3" "$total" "dry-run total"
|
||||
|
||||
# Step 2: Real run, --limit 3
|
||||
log_step 2 "live --limit 3"
|
||||
bash "$REPO/scripts/metablog-ingest.sh" --limit 3 >/dev/null 2>&1 || {
|
||||
echo "FAIL: live run errored. See $REPO/output/ingest-full.log"
|
||||
tail -20 "$REPO/output/ingest-full.log"
|
||||
exit 1
|
||||
}
|
||||
ok=$(jq '.by_status.ok + .by_status.skip' "$REPORT")
|
||||
if [[ "$ok" -lt 3 ]]; then
|
||||
echo "FAIL: expected >=3 ok+skip, got $ok"
|
||||
jq . "$REPORT"
|
||||
exit 1
|
||||
fi
|
||||
pass "live --limit 3 produced $ok ok+skip sites"
|
||||
|
||||
# Step 3: Re-run — idempotent (all should skip)
|
||||
log_step 3 "idempotent re-run"
|
||||
bash "$REPO/scripts/metablog-ingest.sh" --limit 3 >/dev/null 2>&1
|
||||
skip=$(jq '.by_status.skip' "$REPORT")
|
||||
assert_eq "3" "$skip" "all 3 should skip-already-current on re-run"
|
||||
|
||||
# Step 4: Verify on Gitea side via SSH (no public API call — uses ssh ls-remote)
|
||||
log_step 4 "git ls-remote round-trip"
|
||||
first_site=$(jq -r '.sites | to_entries[0].key' "$REPORT")
|
||||
remote_head=$(ssh root@192.168.1.200 "GIT_SSH_COMMAND='ssh -p $GITEA_SSH_PORT -o BatchMode=yes -o StrictHostKeyChecking=accept-new' \
|
||||
git ls-remote ssh://$GITEA_SSH_USER@$GITEA_HOST:$GITEA_SSH_PORT/gandalf/metablog-$first_site.git main 2>/dev/null | awk '{print \$1}'" \
|
||||
| tr -d '[:space:]')
|
||||
[[ -n "$remote_head" ]] || { echo "FAIL: ls-remote returned no HEAD for $first_site"; exit 1; }
|
||||
pass "remote HEAD for $first_site is $remote_head"
|
||||
|
||||
# Step 5: Clone one + diff against source
|
||||
# Clone and diff both run on the MOCHAbin via SSH (the ingest key lives there).
|
||||
log_step 5 "clone + diff"
|
||||
diff_result=$(ssh root@192.168.1.200 bash <<EOSTEP5
|
||||
set -euo pipefail
|
||||
GIT_SSH_COMMAND="ssh -p $GITEA_SSH_PORT -o BatchMode=yes -o StrictHostKeyChecking=accept-new"
|
||||
export GIT_SSH_COMMAND
|
||||
tmp=\$(mktemp -d)
|
||||
trap 'rm -rf "\$tmp"' EXIT
|
||||
git clone -q "ssh://$GITEA_SSH_USER@$GITEA_HOST:$GITEA_SSH_PORT/gandalf/metablog-$first_site.git" "\$tmp/clone" 2>&1 | tail -5 || true
|
||||
if [[ ! -d "\$tmp/clone" ]]; then
|
||||
echo "FAIL: clone of $first_site failed"
|
||||
exit 1
|
||||
fi
|
||||
# Diff clone vs source, ignoring .git on both sides
|
||||
diffs=\$(diff -qr --exclude='.git' "\$tmp/clone" "/srv/metablogizer/sites/$first_site" 2>&1 | wc -l)
|
||||
if [[ "\$diffs" -gt 0 ]]; then
|
||||
echo "FAIL: clone diverges from source for $first_site:"
|
||||
diff -qr --exclude='.git' "\$tmp/clone" "/srv/metablogizer/sites/$first_site" 2>&1 | head -10
|
||||
exit 1
|
||||
fi
|
||||
echo "OK"
|
||||
EOSTEP5
|
||||
)
|
||||
if [[ "$diff_result" == FAIL* ]]; then
|
||||
echo "$diff_result"
|
||||
exit 1
|
||||
fi
|
||||
pass "clone == source for $first_site"
|
||||
|
||||
pass "all smoke checks passed"
|
||||
Loading…
Reference in New Issue
Block a user