入库 4 个验收脚本(play-verify/play-smoke/play-daily-check/img-process), play-verify 新增 markdown 报告生成和论坛发布功能。 同时完成但不在 git 跟踪范围的变更: - ~/bin/session-end(会话收尾脚本) - ~/bin/play-add-plugin(交互式添加插件) - staging-watcher systemd user service - cron 自动清理 test-results Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
128 lines
4.2 KiB
Bash
Executable file
128 lines
4.2 KiB
Bash
Executable file
#!/usr/bin/env bash
|
|
# play-smoke — play.wenpai.net 快速冒烟测试
|
|
# 不启动浏览器,纯 HTTP 检查,几秒内完成
|
|
# 用法: play-smoke [plugin-id] 或 play-smoke --all
|
|
|
|
set -uo pipefail
|
|
|
|
SITE="https://play.wenpai.net"
|
|
PLUGINS_JSON="$HOME/play/plugins.json"
|
|
RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m'; NC='\033[0m'
|
|
PASS=0; FAIL=0; WARN=0
|
|
|
|
check() {
|
|
local label="$1" ok="$2" detail="${3:-}"
|
|
if [ "$ok" = "true" ]; then
|
|
echo -e " ${GREEN}[✓]${NC} $label${detail:+: $detail}"
|
|
((PASS++))
|
|
else
|
|
echo -e " ${RED}[✗]${NC} $label${detail:+: $detail}"
|
|
((FAIL++))
|
|
fi
|
|
}
|
|
|
|
warn() {
|
|
local label="$1" detail="${2:-}"
|
|
echo -e " ${YELLOW}[!]${NC} $label${detail:+: $detail}"
|
|
((WARN++))
|
|
}
|
|
|
|
verify_plugin() {
|
|
local id="$1" name="${2:-$1}" version="${3:-}"
|
|
echo ""
|
|
echo "=== $name ($id) ==="
|
|
|
|
# 1. 快捷方式重定向
|
|
local headers
|
|
headers=$(curl -sI "$SITE/?plugin=$id" 2>&1)
|
|
local http_code
|
|
http_code=$(echo "$headers" | grep -i "^HTTP" | tail -1 | awk '{print $2}')
|
|
local location
|
|
location=$(echo "$headers" | grep -i "^location:" | tr -d '\r' | awk '{print $2}')
|
|
|
|
if [ "$http_code" = "302" ]; then
|
|
if echo "$location" | grep -q "blueprint-url=https"; then
|
|
check "302 重定向" "true" "完整 URL"
|
|
else
|
|
check "302 重定向" "false" "相对路径: $location"
|
|
fi
|
|
else
|
|
check "302 重定向" "false" "HTTP $http_code"
|
|
fi
|
|
|
|
# 2. Blueprint JSON 可访问且合法
|
|
local bp_url="$SITE/play/blueprints/$id.json"
|
|
local bp_code
|
|
bp_code=$(curl -sI -o /dev/null -w '%{http_code}' "$bp_url")
|
|
if [ "$bp_code" = "200" ]; then
|
|
local bp_content
|
|
bp_content=$(curl -s "$bp_url")
|
|
if echo "$bp_content" | jq . >/dev/null 2>&1; then
|
|
check "Blueprint JSON" "true" "有效 JSON"
|
|
|
|
# 检查 installPlugin step 里的 zip URL
|
|
local zip_url
|
|
zip_url=$(echo "$bp_content" | jq -r '.steps[]? | select(.step=="installPlugin") | .pluginData.url // empty' 2>/dev/null)
|
|
if [ -n "$zip_url" ]; then
|
|
local zip_code
|
|
zip_code=$(curl -sI -o /dev/null -w '%{http_code}' "$zip_url")
|
|
check "插件 ZIP" "$([ "$zip_code" = "200" ] && echo true || echo false)" "$zip_url → HTTP $zip_code"
|
|
else
|
|
warn "无 installPlugin step"
|
|
fi
|
|
|
|
# 检查 activatePlugin
|
|
local activate
|
|
activate=$(echo "$bp_content" | jq -r '.steps[]? | select(.step=="activatePlugin") | .pluginPath // empty' 2>/dev/null)
|
|
if [ -n "$activate" ]; then
|
|
check "activatePlugin" "true" "$activate"
|
|
else
|
|
warn "无 activatePlugin step"
|
|
fi
|
|
else
|
|
check "Blueprint JSON" "false" "无效 JSON"
|
|
fi
|
|
else
|
|
check "Blueprint JSON" "false" "HTTP $bp_code"
|
|
fi
|
|
|
|
# 3. plugins.json 中版本一致性
|
|
if [ -n "$version" ] && [ -f "$PLUGINS_JSON" ]; then
|
|
local pj_version
|
|
pj_version=$(jq -r ".[] | select(.id==\"$id\") | .version" "$PLUGINS_JSON" 2>/dev/null)
|
|
if [ "$pj_version" = "$version" ]; then
|
|
check "plugins.json 版本" "true" "$pj_version"
|
|
else
|
|
check "plugins.json 版本" "false" "期望 $version, 实际 $pj_version"
|
|
fi
|
|
fi
|
|
}
|
|
|
|
# 主入口
|
|
if [ "${1:-}" = "--all" ]; then
|
|
echo "=== play.wenpai.net 全量冒烟测试 ==="
|
|
|
|
# 站点可用性
|
|
SITE_CODE=$(curl -sI -o /dev/null -w '%{http_code}' "$SITE/")
|
|
check "站点可用" "$([ "$SITE_CODE" = "200" ] && echo true || echo false)" "HTTP $SITE_CODE"
|
|
|
|
PJ_CODE=$(curl -sI -o /dev/null -w '%{http_code}' "$SITE/plugins.json")
|
|
check "plugins.json" "$([ "$PJ_CODE" = "200" ] && echo true || echo false)" "HTTP $PJ_CODE"
|
|
|
|
# 遍历所有插件(用 process substitution 避免子 shell 丢失计数器)
|
|
while IFS='|' read -r id name version; do
|
|
verify_plugin "$id" "$name" "$version"
|
|
done < <(jq -r '.[] | select(.group=="plugin") | "\(.id)|\(.name)|\(.version)"' "$PLUGINS_JSON")
|
|
elif [ -n "${1:-}" ]; then
|
|
# 从 plugins.json 读取信息
|
|
name=$(jq -r ".[] | select(.id==\"$1\") | .name" "$PLUGINS_JSON" 2>/dev/null)
|
|
version=$(jq -r ".[] | select(.id==\"$1\") | .version" "$PLUGINS_JSON" 2>/dev/null)
|
|
verify_plugin "$1" "${name:-$1}" "${version:-}"
|
|
else
|
|
echo "用法: play-smoke <plugin-id> 或 play-smoke --all"
|
|
exit 0
|
|
fi
|
|
|
|
echo ""
|
|
echo "=== 结果: $PASS 通过, $FAIL 失败, $WARN 警告 ==="
|
|
[ "$FAIL" -gt 0 ] && exit 1 || exit 0
|