test_deploy.py 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. #!/usr/bin/env python3
  2. """
  3. 测试自动部署功能
  4. 运行方式:
  5. python scripts/test_deploy.py
  6. """
  7. import json
  8. import sys
  9. from pathlib import Path
  10. # 添加项目根目录到路径
  11. WORKSPACE_ROOT = Path(__file__).parent.parent
  12. sys.path.insert(0, str(WORKSPACE_ROOT))
  13. def test_ssh_connection():
  14. """测试 SSH 连接"""
  15. print("=" * 60)
  16. print("测试 1: SSH 连接测试")
  17. print("=" * 60)
  18. try:
  19. from scripts.auto_execute_tasks import test_ssh_connection
  20. result = test_ssh_connection()
  21. if result:
  22. print("✅ SSH 连接测试通过")
  23. return True
  24. else:
  25. print("❌ SSH 连接测试失败")
  26. return False
  27. except Exception as e:
  28. print(f"❌ 测试失败: {e}")
  29. return False
  30. def test_deploy_functions():
  31. """测试部署函数是否可导入"""
  32. print("\n" + "=" * 60)
  33. print("测试 2: 部署函数导入测试")
  34. print("=" * 60)
  35. try:
  36. from scripts.auto_execute_tasks import (
  37. get_ssh_connection,
  38. deploy_script_to_production,
  39. deploy_n8n_workflow_to_production,
  40. auto_deploy_completed_task,
  41. )
  42. print("✅ 所有部署函数导入成功")
  43. return True
  44. except ImportError as e:
  45. print(f"❌ 函数导入失败: {e}")
  46. return False
  47. def test_paramiko_installed():
  48. """测试 paramiko 是否已安装"""
  49. print("\n" + "=" * 60)
  50. print("测试 3: paramiko 库检查")
  51. print("=" * 60)
  52. try:
  53. import paramiko
  54. print(f"✅ paramiko 已安装,版本: {paramiko.__version__}")
  55. return True
  56. except ImportError:
  57. print("❌ paramiko 未安装")
  58. print("请运行: pip install paramiko")
  59. return False
  60. def test_config():
  61. """测试配置是否正确"""
  62. print("\n" + "=" * 60)
  63. print("测试 4: 配置检查")
  64. print("=" * 60)
  65. try:
  66. from scripts.auto_execute_tasks import PRODUCTION_SERVER
  67. required_keys = ["host", "port", "username", "password", "script_path", "workflow_path"]
  68. missing_keys = [key for key in required_keys if key not in PRODUCTION_SERVER]
  69. if missing_keys:
  70. print(f"❌ 配置缺少必需字段: {missing_keys}")
  71. return False
  72. print("✅ 配置检查通过")
  73. print(f" 服务器: {PRODUCTION_SERVER['username']}@{PRODUCTION_SERVER['host']}:{PRODUCTION_SERVER['port']}")
  74. print(f" 脚本路径: {PRODUCTION_SERVER['script_path']}")
  75. print(f" 工作流路径: {PRODUCTION_SERVER['workflow_path']}")
  76. return True
  77. except Exception as e:
  78. print(f"❌ 配置检查失败: {e}")
  79. return False
  80. def test_pending_tasks_file():
  81. """测试 pending_tasks.json 文件"""
  82. print("\n" + "=" * 60)
  83. print("测试 5: pending_tasks.json 文件检查")
  84. print("=" * 60)
  85. tasks_file = WORKSPACE_ROOT / "tasks" / "pending_tasks.json"
  86. if not tasks_file.exists():
  87. print("⚠️ pending_tasks.json 文件不存在(这是正常的,如果没有任务)")
  88. return True
  89. try:
  90. with tasks_file.open("r", encoding="utf-8") as f:
  91. tasks = json.load(f)
  92. if not isinstance(tasks, list):
  93. print("❌ pending_tasks.json 格式错误(应为数组)")
  94. return False
  95. print(f"✅ pending_tasks.json 文件正常,包含 {len(tasks)} 个任务")
  96. completed_tasks = [t for t in tasks if t.get("status") == "completed"]
  97. if completed_tasks:
  98. print(f" 其中 {len(completed_tasks)} 个任务已完成")
  99. return True
  100. except json.JSONDecodeError as e:
  101. print(f"❌ pending_tasks.json 解析失败: {e}")
  102. return False
  103. except Exception as e:
  104. print(f"❌ 文件读取失败: {e}")
  105. return False
  106. def main():
  107. """主函数"""
  108. print("\n" + "=" * 70)
  109. print("🧪 自动部署功能测试套件")
  110. print("=" * 70)
  111. results = []
  112. # 运行所有测试
  113. results.append(("paramiko 库", test_paramiko_installed()))
  114. results.append(("配置检查", test_config()))
  115. results.append(("函数导入", test_deploy_functions()))
  116. results.append(("pending_tasks.json", test_pending_tasks_file()))
  117. # 只有在前面测试都通过的情况下才测试 SSH 连接
  118. if all(r[1] for r in results):
  119. results.append(("SSH 连接", test_ssh_connection()))
  120. else:
  121. print("\n⚠️ 跳过 SSH 连接测试(前置测试未通过)")
  122. # 输出测试结果
  123. print("\n" + "=" * 70)
  124. print("📊 测试结果汇总")
  125. print("=" * 70)
  126. for test_name, passed in results:
  127. status = "✅ 通过" if passed else "❌ 失败"
  128. print(f"{test_name:.<40} {status}")
  129. print("=" * 70)
  130. passed_count = sum(1 for _, passed in results if passed)
  131. total_count = len(results)
  132. if passed_count == total_count:
  133. print(f"✅ 所有测试通过 ({passed_count}/{total_count})")
  134. print("\n🎉 自动部署功能已就绪!")
  135. print("\n建议下一步操作:")
  136. print(" python scripts/auto_execute_tasks.py --chat-loop --use-agent")
  137. return 0
  138. else:
  139. print(f"⚠️ 部分测试失败 ({passed_count}/{total_count})")
  140. print("\n请根据上述错误信息进行修复")
  141. return 1
  142. if __name__ == "__main__":
  143. sys.exit(main())