Files
2026-04-29 20:15:43 +08:00

209 lines
5.3 KiB
Bash
Executable File

#!/bin/bash
# ============================================
# sanguo_vnpy 端到端全自动化 CI/CD 回测
# 作者:姜维 伯约
# 日期:2026年3月28日
# ============================================
set -e
# 配置信息
NAS_IP="192.168.2.154"
NAS_USER="admin"
SANGUO_PROJECT_DIR="/Users/chufeng/.openclaw/sanguo_projects/sanguo_quant_live"
NAS_TARGET_DIR="/volume1/stock/sanguo_vnpy"
DOCKER_CONTAINER_NAME="sanguo_vnpy"
# 说明:
# 这个方案会同步整个 sanguo_quant_live 项目,包括:
# - strategies/ 所有策略
# - sanguo_vnpy/ 框架代码(包括修改后的vnpy)
# - jiangwei-platform/ 三国量化实战项目
# - pangtong-value/ 价值投资研究
# - 所有其他模块
# 颜色
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'
log_info() {
echo -e "${GREEN}[INFO]${NC} $1"
}
log_warn() {
echo -e "${YELLOW}[WARN]${NC} $1"
}
log_error() {
echo -e "${RED}[ERROR]${NC} $1"
}
# 步骤 1: 拉取最新代码
pull_latest_code() {
log_info "步骤 1/6: 拉取最新代码"
cd "$SANGUO_PROJECT_DIR"
if git pull origin main; then
log_info "✅ 代码已更新到最新版本"
return 0
else
log_error "❌ 拉取代码失败"
return 1
fi
}
# 步骤 2: 同步所有文件到 NAS
sync_to_nas() {
log_info "步骤 2/6: 同步所有文件到 NAS"
# 确保目标目录存在
ssh "$NAS_USER@$NAS_IP" "mkdir -p $NAS_TARGET_DIR"
# 使用 rsync 同步所有文件(包括策略和框架代码)
# 会同步整个 sanguo_quant_live 项目,包括:
# - strategies/ 所有策略
# - sanguo_vnpy/ 框架代码(包括您修改后的 vnpy)
# - jiangwei-platform/ 三国量化实战
# - pangtong-value/ 价值投资研究
# - 所有其他模块
rsync -av --delete \
"$SANGUO_PROJECT_DIR"/ \
"$NAS_USER@$NAS_IP:$NAS_TARGET_DIR"/ \
--exclude='.git' \
--exclude='__pycache__' \
--exclude='*.log' \
--exclude='*.pyc' \
--exclude='.ipynb_checkpoints' \
--exclude='backtest_results/*.png' \
--exclude='.DS_Store'
log_info "✅ 文件同步完成"
}
# 步骤 3: 重建 Docker 容器
rebuild_docker() {
log_info "步骤 3/6: 重建 Docker 容器"
ssh "$NAS_USER@$NAS_IP" << 'EOF'
cd /volume1/stock/sanguo_vnpy
# 停止并删除旧容器
if docker ps -a | grep -q sanguo_vnpy; then
docker stop sanguo_vnpy
docker rm sanguo_vnpy
fi
# 构建新镜像
docker-compose build --no-cache
# 启动新容器
docker-compose up -d
# 等待容器启动
sleep 10
# 检查容器状态
if docker ps | grep -q sanguo_vnpy; then
echo "✅ 容器启动成功"
else
echo "❌ 容器启动失败"
exit 1
fi
EOF
if [ $? -eq 0 ]; then
log_info "✅ Docker 容器重建完成"
return 0
else
log_error "❌ Docker 容器重建失败"
return 1
fi
}
# 步骤 4: 运行自动化回测
run_backtest() {
log_info "步骤 4/6: 运行自动化回测"
ssh "$NAS_USER@$NAS_IP" << 'EOF'
cd /volume1/stock/sanguo_vnpy/scripts
# 运行全自动化回测
./run_backtest_auto.sh
EOF
if [ $? -eq -ne 0 ]; then
log_warn "回测运行中,请等待完成..."
fi
log_info "✅ 回测已启动"
}
# 步骤 5: 获取结果
get_results() {
log_info "步骤 5/6: 获取回测结果"
# 创建本地结果目录
mkdir -p "./backtest_results"
# 下载最新结果
rsync -av --delete \
"$NAS_USER@$NAS_IP:$NAS_TARGET_DIR/backtest_results/"* \
"./backtest_results"/
log_info "✅ 结果已下载到本地: ./backtest_results/"
# 显示最新结果
LATEST_RESULT=$(ls -t ./backtest_results/*.txt | head -1)
if [ -f "$LATEST_RESULT" ]; then
echo ""
echo "============================================"
echo " 📊 最新回测结果"
echo "============================================"
echo ""
cat "$LATEST_RESULT"
echo ""
echo "============================================"
fi
}
# 步骤 6: 完成通知
finish() {
log_info "步骤 6/6: 完成!"
echo ""
echo "╔═════════════════════════════════════════════════════════════════╗"
echo "║ 🎉 端到端自动化回测完成! ║"
echo "╚═════════════════════════════════════════════════════════════════╝"
echo ""
echo "📍 结果位置:"
echo " NAS: $NAS_TARGET_DIR/backtest_results/"
echo " 本地: ./backtest_results/"
echo ""
echo "🚀 下次更新代码后,直接运行 ./sanguo_nas_ci_cd.sh 就能全自动完成!"
echo ""
}
# 主函数
main() {
echo "============================================"
echo " sanguo_vnpy 端到端全自动化回测"
echo "============================================"
echo ""
pull_latest_code && \
sync_to_nas && \
rebuild_docker && \
run_backtest && \
get_results && \
finish
echo ""
}
# 运行
main