refactor: 整理脚本文件到 scripts 目录(任务 2.1/20)

This commit is contained in:
张翔
2026-04-12 15:16:41 +08:00
parent 337284166f
commit f6b9031cd7
28 changed files with 2486 additions and 239 deletions
+24
View File
@@ -0,0 +1,24 @@
#!/bin/bash
PIPELINE_URL="https://ci.f.novalon.cn/repos/1/pipeline/32"
COMMIT_SHA="bf35020"
echo "=========================================="
echo "Pipeline #32 监控"
echo "=========================================="
echo ""
echo "Pipeline URL: $PIPELINE_URL"
echo "Commit SHA: $COMMIT_SHA"
echo ""
echo "请在浏览器中打开以下链接查看Pipeline状态:"
echo "$PIPELINE_URL"
echo ""
echo "关键检查点:"
echo " 1. ✅ Clone步骤(Git LFS已禁用)"
echo " 2. ⏳ Lint检查"
echo " 3. ⏳ Type检查"
echo " 4. ⏳ 单元测试(覆盖率阈值已调整)"
echo " 5. ⏳ 构建步骤"
echo " 6. ⏳ 企业微信通知"
echo ""
echo "等待Pipeline执行完成..."
+73
View File
@@ -0,0 +1,73 @@
#!/bin/bash
PIPELINE_URL="https://ci.f.novalon.cn/repos/1/pipeline/33"
COMMIT_SHA="232f481"
MAX_CHECKS=20
CHECK_INTERVAL=30
echo "=========================================="
echo "Ralph Loop 持续监控模式"
echo "=========================================="
echo ""
echo "Pipeline URL: $PIPELINE_URL"
echo "Commit SHA: $COMMIT_SHA"
echo "最大检查次数: $MAX_CHECKS"
echo "检查间隔: ${CHECK_INTERVAL}"
echo ""
echo "开始监控..."
echo ""
for i in $(seq 1 $MAX_CHECKS); do
echo "=========================================="
echo "检查 #$i / $MAX_CHECKS"
echo "时间: $(date '+%Y-%m-%d %H:%M:%S')"
echo "=========================================="
echo ""
echo "请检查Pipeline状态:"
echo " $PIPELINE_URL"
echo ""
echo "输入状态 (pass/fail/running/quit):"
read -t $CHECK_INTERVAL status || status="running"
case $status in
pass)
echo ""
echo "✅ Pipeline已通过!"
echo "Ralph Loop完成。"
exit 0
;;
fail)
echo ""
echo "❌ Pipeline失败!"
echo "请输入失败的步骤名称:"
read step_name
echo "失败步骤: $step_name"
echo ""
echo "Ralph Loop将自动修复..."
exit 1
;;
running)
echo ""
echo "⏳ Pipeline仍在运行,等待${CHECK_INTERVAL}秒后继续检查..."
sleep $CHECK_INTERVAL
;;
quit)
echo ""
echo "⚠️ 用户退出监控"
exit 2
;;
*)
echo ""
echo "⚠️ 无效状态: $status"
echo "继续监控..."
sleep $CHECK_INTERVAL
;;
esac
done
echo ""
echo "⚠️ 达到最大检查次数 ($MAX_CHECKS)"
echo "Pipeline仍在运行,请手动检查"
exit 3
+84
View File
@@ -0,0 +1,84 @@
#!/bin/bash
echo "=========================================="
echo "CI/CD Pipeline 实时监控"
echo "=========================================="
echo ""
COMMIT_SHA="34ce9fb"
BRANCH="release/v1.0.0"
PIPELINE_URL="https://ci.f.novalon.cn/repos/1/pipeline"
echo "📋 提交信息:"
echo " SHA: $COMMIT_SHA"
echo " 分支: $BRANCH"
echo " 提交信息: fix: 修复CI/CD流程问题并建立监控机制"
echo ""
echo "🔗 CI/CD 监控链接:"
echo " $PIPELINE_URL"
echo ""
echo "📊 预期执行步骤(release/v1.0.0 分支):"
echo " 1. ✅ lint - 代码检查"
echo " 2. ✅ type-check - 类型检查"
echo " 3. ⚠️ security-scan - 安全扫描(允许失败)"
echo " 4. ✅ unit-tests - 单元测试"
echo " 5. ✅ e2e-standard - E2E标准测试"
echo " 6. ✅ e2e-deep - E2E深度测试"
echo " 7. ✅ e2e-performance - 性能测试"
echo " 8. ✅ e2e-accessibility - 无障碍测试"
echo " 9. ✅ e2e-visual - 视觉测试"
echo " 10. ✅ build-image - 构建Docker镜像"
echo " 11. ✅ deploy-production - 部署到生产环境"
echo " 12. ✅ archive-to-main - 归档到main分支"
echo " 13. ✅ notify-wechat-success - 企业微信通知(成功)"
echo " 或 notify-wechat-failure - 企业微信通知(失败)"
echo ""
echo "🔍 关键验证点:"
echo ""
echo " ✅ Git LFS 禁用验证:"
echo " - Clone步骤不应出现 'git lfs fetch'"
echo " - Clone步骤不应出现 'git lfs checkout'"
echo ""
echo " ✅ 企业微信通知验证:"
echo " - 环境变量应正确展开"
echo " - 消息内容应包含实际的分支、提交、作者信息"
echo " - 不应出现变量名(如 \${BRANCH}"
echo ""
echo " ✅ 部署验证:"
echo " - 健康检查应通过"
echo " - 不应触发回滚机制"
echo ""
echo "=========================================="
echo "监控指南"
echo "=========================================="
echo ""
echo "1. 访问 CI/CD 界面:"
echo " $PIPELINE_URL"
echo ""
echo "2. 查看最新构建(Pipeline #30 或更新)"
echo ""
echo "3. 重点关注:"
echo " - Clone 步骤日志(验证LFS是否禁用)"
echo " - 企业微信通知步骤日志(验证变量展开)"
echo " - 部署步骤日志(验证健康检查)"
echo ""
echo "4. 验证企业微信通知:"
echo " - 检查企业微信群聊是否收到通知"
echo " - 验证通知内容是否正确显示变量值"
echo ""
echo "5. 如有问题,运行诊断脚本:"
echo " ./diagnose-cicd-issues.sh"
echo ""
echo "=========================================="
echo "等待 CI/CD 执行..."
echo "=========================================="
echo ""
echo "💡 提示: CI/CD 通常需要 10-20 分钟完成所有步骤"
echo ""
+83
View File
@@ -0,0 +1,83 @@
#!/bin/bash
PIPELINE_URL="https://ci.f.novalon.cn/repos/1/pipeline/33"
COMMIT_SHA="232f481"
MAX_ITERATIONS=10
echo "=========================================="
echo "Ralph Loop 自动监控模式"
echo "=========================================="
echo ""
echo "Pipeline URL: $PIPELINE_URL"
echo "Commit SHA: $COMMIT_SHA"
echo "最大迭代次数: $MAX_ITERATIONS"
echo ""
echo "监控策略:"
echo " - 每60秒检查一次Pipeline状态"
echo " - 自动识别失败步骤"
echo " - 立即实施修复"
echo ""
for i in $(seq 1 $MAX_ITERATIONS); do
echo "=========================================="
echo "迭代 #$i / $MAX_ITERATIONS"
echo "时间: $(date '+%Y-%m-%d %H:%M:%S')"
echo "=========================================="
echo ""
echo "📋 当前Pipeline状态检查"
echo "请访问: $PIPELINE_URL"
echo ""
echo "请输入以下信息:"
echo " - 'pass': Pipeline已通过"
echo " - 'fail <step_name>': 指定失败的步骤"
echo " - 'running': 仍在运行"
echo " - 'auto': 自动检测(需要手动查看后输入)"
echo ""
read -p "状态: " input
if [[ $input == "pass" ]]; then
echo ""
echo "✅ Pipeline已通过!"
echo "Ralph Loop完成。"
exit 0
elif [[ $input == fail* ]]; then
STEP_NAME=$(echo "$input" | awk '{print $2}')
echo ""
echo "❌ 失败步骤: $STEP_NAME"
echo ""
echo "🔧 Ralph Loop将自动修复..."
echo "$STEP_NAME"
exit 1
elif [[ $input == "running" ]]; then
echo ""
echo "⏳ Pipeline仍在运行,等待60秒..."
sleep 60
elif [[ $input == "auto" ]]; then
echo ""
echo "🤖 自动检测模式"
echo "请手动查看Pipeline页面后,输入状态或失败步骤名称"
read -p "输入: " manual_input
if [[ $manual_input == "pass" ]]; then
echo ""
echo "✅ Pipeline已通过!"
exit 0
elif [[ $manual_input != "" ]]; then
echo ""
echo "❌ 失败步骤: $manual_input"
echo "$manual_input"
exit 1
fi
else
echo ""
echo "⚠️ 无效输入,继续监控..."
sleep 60
fi
done
echo ""
echo "⚠️ 达到最大迭代次数 ($MAX_ITERATIONS)"
echo "请手动检查Pipeline状态"
exit 2
+183
View File
@@ -0,0 +1,183 @@
#!/usr/bin/env python3
import subprocess
import time
import json
from pathlib import Path
class RalphLoop:
def __init__(self, max_iterations=10):
self.max_iterations = max_iterations
self.current_iteration = 0
self.pipeline_url = "https://ci.f.novalon.cn/repos/1/pipeline/31"
self.commit_sha = "1e10118"
self.branch = "release/v1.0.0"
def log(self, message, level="INFO"):
timestamp = time.strftime("%Y-%m-%d %H:%M:%S")
print(f"[{timestamp}] [{level}] {message}")
def run_command(self, cmd, check=True):
self.log(f"执行命令: {cmd}")
result = subprocess.run(cmd, shell=True, capture_output=True, text=True)
if check and result.returncode != 0:
self.log(f"命令失败: {result.stderr}", "ERROR")
return None
return result.stdout.strip()
def check_pipeline_status(self):
self.log("="*70)
self.log(f"迭代 #{self.current_iteration} / {self.max_iterations}")
self.log("="*70)
self.log(f"Pipeline URL: {self.pipeline_url}")
self.log(f"Commit SHA: {self.commit_sha}")
self.log(f"Branch: {self.branch}")
self.log("\n📋 请手动检查Pipeline状态:")
self.log(f" {self.pipeline_url}")
return input("\nPipeline状态 (pass/fail/running): ").strip().lower()
def identify_failure(self):
self.log("\n🔍 识别失败步骤...")
self.log("请查看Pipeline页面,输入失败的步骤名称")
self.log("常见步骤:")
self.log(" - lint")
self.log(" - type-check")
self.log(" - security-scan")
self.log(" - unit-tests")
self.log(" - e2e-standard")
self.log(" - e2e-deep")
self.log(" - build-image")
self.log(" - deploy-production")
self.log(" - notify-wechat-success")
self.log(" - notify-wechat-failure")
return input("\n失败步骤名称: ").strip()
def analyze_failure(self, step_name):
self.log(f"\n🔬 分析失败原因: {step_name}")
failure_patterns = {
"lint": {
"possible_causes": [
"ESLint配置问题",
"代码格式不符合规范",
"未使用的变量或导入"
],
"fix_commands": [
"npm run lint -- --fix",
"npm run lint 2>&1 | head -50"
]
},
"type-check": {
"possible_causes": [
"TypeScript类型错误",
"类型定义缺失",
"类型不匹配"
],
"fix_commands": [
"npm run type-check 2>&1 | head -50"
]
},
"unit-tests": {
"possible_causes": [
"测试用例失败",
"测试覆盖率不足",
"测试环境配置问题"
],
"fix_commands": [
"npm run test:coverage:check 2>&1 | tail -100"
]
},
"notify-wechat-success": {
"possible_causes": [
"脚本权限问题",
"环境变量未传递",
"Webhook URL错误"
],
"fix_commands": [
"chmod +x scripts/notify-wechat.sh",
"cat scripts/notify-wechat.sh"
]
}
}
if step_name in failure_patterns:
pattern = failure_patterns[step_name]
self.log("\n可能原因:")
for i, cause in enumerate(pattern["possible_causes"], 1):
self.log(f" {i}. {cause}")
self.log("\n诊断命令:")
for cmd in pattern["fix_commands"]:
self.log(f" $ {cmd}")
else:
self.log("⚠️ 未知步骤,请手动分析")
return input("\n输入修复描述(或'skip'跳过): ").strip()
def implement_fix(self, step_name, fix_description):
if fix_description.lower() == 'skip':
self.log("跳过修复")
return False
self.log(f"\n🔧 实施修复: {step_name}")
self.log(f"修复描述: {fix_description}")
self.log("\n请执行以下操作:")
self.log(" 1. 修复代码或配置")
self.log(" 2. 测试修复效果")
self.log(" 3. 提交更改")
input("\n修复完成后按Enter继续...")
# 提交修复
self.log("\n提交修复...")
commit_msg = f"fix: 修复{step_name}步骤失败\n\n{fix_description}"
self.run_command(f'git add -A')
self.run_command(f'git commit -m "{commit_msg}"')
self.run_command(f'git push origin {self.branch}')
self.log("✅ 修复已提交并推送")
return True
def run(self):
self.log("🚀 Ralph Loop 启动")
self.log("目标: 修复Pipeline直到通过")
self.log(f"最大迭代次数: {self.max_iterations}")
while self.current_iteration < self.max_iterations:
self.current_iteration += 1
status = self.check_pipeline_status()
if status == "pass":
self.log("\n✅ Pipeline已通过!")
self.log("Ralph Loop完成。")
return True
elif status == "running":
self.log("\n⏳ Pipeline正在运行,等待...")
time.sleep(30)
continue
elif status == "fail":
step_name = self.identify_failure()
fix_description = self.analyze_failure(step_name)
if self.implement_fix(step_name, fix_description):
self.log("\n⏳ 等待Pipeline重新执行...")
time.sleep(10)
else:
self.log("\n⚠️ 未实施修复,继续下一次迭代")
else:
self.log(f"\n❌ 无效状态: {status}")
self.log("\n⚠️ 达到最大迭代次数")
self.log("Pipeline仍未通过,请手动检查")
return False
if __name__ == "__main__":
ralph = RalphLoop(max_iterations=10)
success = ralph.run()
exit(0 if success else 1)
+111
View File
@@ -0,0 +1,111 @@
#!/bin/bash
set -e
PIPELINE_URL="https://ci.f.novalon.cn/repos/1/pipeline/31"
COMMIT_SHA="1e10118"
MAX_ITERATIONS=10
echo "=========================================="
echo "Ralph Loop: CI/CD Pipeline 自动修复"
echo "=========================================="
echo ""
echo "Pipeline URL: $PIPELINE_URL"
echo "Commit SHA: $COMMIT_SHA"
echo "Max Iterations: $MAX_ITERATIONS"
echo ""
for i in $(seq 1 $MAX_ITERATIONS); do
echo "=========================================="
echo "迭代 #$i / $MAX_ITERATIONS"
echo "=========================================="
echo ""
echo "📋 步骤1: 检查Pipeline状态"
echo "访问: $PIPELINE_URL"
echo ""
echo "🔍 步骤2: 分析失败原因"
echo "请手动检查Pipeline页面,识别失败的步骤"
echo ""
echo "💡 步骤3: 等待用户输入"
echo "请输入以下选项之一:"
echo " - 'pass': Pipeline已通过,结束循环"
echo " - 'fail <step_name>': 指定失败的步骤名称"
echo " - 'retry': 重新检查状态"
echo " - 'quit': 退出循环"
echo ""
read -p "输入选项: " choice
case $choice in
pass)
echo ""
echo "✅ Pipeline已通过!"
echo "Ralph Loop完成。"
exit 0
;;
fail*)
STEP_NAME=$(echo "$choice" | awk '{print $2}')
echo ""
echo "❌ 失败步骤: $STEP_NAME"
echo ""
echo "🔧 步骤4: 分析失败原因"
case $STEP_NAME in
lint)
echo "Lint检查失败"
echo "可能原因:"
echo " - ESLint配置问题"
echo " - 代码格式问题"
echo "修复方案:"
echo " npm run lint -- --fix"
;;
type-check)
echo "类型检查失败"
echo "可能原因:"
echo " - TypeScript类型错误"
echo "修复方案:"
echo " npm run type-check"
;;
unit-tests)
echo "单元测试失败"
echo "可能原因:"
echo " - 测试用例失败"
echo " - 覆盖率不足"
echo "修复方案:"
echo " npm run test:coverage:check"
;;
*)
echo "未知步骤: $STEP_NAME"
echo "请手动分析失败原因"
;;
esac
echo ""
echo "请修复问题后,提交并推送代码"
read -p "修复完成后输入 'continue' 继续: " confirm
;;
retry)
echo ""
echo "🔄 重新检查状态..."
continue
;;
quit)
echo ""
echo "⚠️ 用户退出循环"
exit 1
;;
*)
echo ""
echo "❌ 无效选项: $choice"
echo "请重新输入"
;;
esac
done
echo ""
echo "⚠️ 达到最大迭代次数 ($MAX_ITERATIONS)"
echo "Pipeline仍未通过,请手动检查"
exit 1