build: add reproducible markdown link gate

This commit is contained in:
2026-09-20 17:37:33 +08:00
parent 2066eb0357
commit 87d51d8331
3 changed files with 39 additions and 1 deletions

View File

@@ -1,6 +1,6 @@
GO ?= go GO ?= go
.PHONY: fmt test vet build integration mysql-replication mysql-compatibility sdk-check protocol-check schedule-backlog .PHONY: fmt test vet build integration mysql-replication mysql-compatibility sdk-check protocol-check docs-check schedule-backlog
fmt: fmt:
$(GO) fmt ./... $(GO) fmt ./...
cd sdk/go && $(GO) fmt ./... cd sdk/go && $(GO) fmt ./...
@@ -41,6 +41,9 @@ sdk-check:
protocol-check: protocol-check:
./scripts/test-protocol-compatibility.sh ./scripts/test-protocol-compatibility.sh
docs-check:
./scripts/check-doc-links.sh
# Runs the bounded, intentionally incomplete persistent backlog rehearsal in an isolated MySQL. # Runs the bounded, intentionally incomplete persistent backlog rehearsal in an isolated MySQL.
schedule-backlog: schedule-backlog:
./scripts/test-schedule-backlog.sh ./scripts/test-schedule-backlog.sh

View File

@@ -74,6 +74,7 @@ make vet
make build make build
make integration make integration
make protocol-check make protocol-check
make docs-check
``` ```
首版发布前按[交付核对清单](docs/release-checklist.md)逐项留存命令输出和目标环境证据;当前阶段回归不替代生产拓扑、容量、复制切换或 RPO/RTO 验收。 首版发布前按[交付核对清单](docs/release-checklist.md)逐项留存命令输出和目标环境证据;当前阶段回归不替代生产拓扑、容量、复制切换或 RPO/RTO 验收。

34
scripts/check-doc-links.sh Executable file
View File

@@ -0,0 +1,34 @@
#!/bin/sh
# Verify that local Markdown links resolve inside the repository.
set -eu
TASK_ROOT=${ORBIT_ROOT_DIR:-.}
python3 - "$TASK_ROOT" <<'PY'
import re
import sys
from pathlib import Path
root = Path(sys.argv[1]).resolve()
missing = []
files = 0
for path in root.rglob("*.md"):
if ".git" in path.parts or "bin" in path.parts:
continue
files += 1
text = path.read_text(encoding="utf-8")
for raw in re.findall(r"\]\(([^)]+)\)", text):
target = raw.strip()
if target.startswith("<") and target.endswith(">"):
target = target[1:-1]
target = target.split("#", 1)[0].split("?", 1)[0]
if not target or "://" in target or target.startswith(("mailto:", "/")):
continue
if not (path.parent / target).exists():
missing.append(f"{path.relative_to(root)}: {raw}")
if missing:
print("unresolved local Markdown links:", file=sys.stderr)
print("\n".join(missing), file=sys.stderr)
raise SystemExit(1)
print(f'{{"markdown_files":{files},"local_links":"resolved"}}')
PY