refactor: 整理脚本文件到 scripts 目录(任务 2.1/20)
This commit is contained in:
Executable
+24
@@ -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
@@ -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
|
||||
Executable
+84
@@ -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 ""
|
||||
Executable
+83
@@ -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
|
||||
Executable
+183
@@ -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)
|
||||
Executable
+111
@@ -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
|
||||
Reference in New Issue
Block a user