#!/bin/bash # 同步代码到远端设备并编译 # 用法: ./sync_build.sh # 同步所有设备 # ./sync_build.sh 231 # 只同步 rk3576 # ./sync_build.sh 232 # 只同步 rk3568 set -o pipefail ROOT_DIR="$(cd "$(dirname "$0")" && pwd)" USER="root" PASS="123456" REMOTE_DIR="/root/zone_alarm" # 设备列表: 别名 IP DEVICES=( "rk3576 192.168.1.231 yolov5s_rk3576_int8.rknn" "rk3568 192.168.1.232 yolov5s_rk3568_int8.rknn" ) # 过滤参数指定的设备 if [ -n "$1" ]; then FILTERED=() for dev in "${DEVICES[@]}"; do name=$(echo "$dev" | awk '{print $1}') ip=$(echo "$dev" | awk '{print $2}') if [[ "$1" == "$name" || "$ip" == *"$1"* ]]; then FILTERED+=("$dev") fi done DEVICES=("${FILTERED[@]}") fi sync_and_build() { local name="$1" local ip="$2" local model="$3" echo "==========================================" echo "[${name}] ${ip} 同步中..." echo "==========================================" # 排除本地编译产物和依赖,远端自行生成 sshpass -p "$PASS" rsync -az --delete \ --exclude 'build/' \ --exclude '.deps/' \ --exclude '.git/' \ "$ROOT_DIR/" "${USER}@${ip}:${REMOTE_DIR}/" if [ $? -ne 0 ]; then echo "[${name}] [ERROR] 同步失败" return 1 fi echo "[${name}] [OK] 同步完成" # 自动修改 model_path sshpass -p "$PASS" ssh -o StrictHostKeyChecking=no "${USER}@${ip}" \ "sed -i 's|\"model_path\": \"[^\"]*\"|\"model_path\": \"models/${model}\"|' ${REMOTE_DIR}/config/config.json" echo "[${name}] [OK] 模型已设置为 ${model}" echo "[${name}] 编译中..." sshpass -p "$PASS" ssh -o StrictHostKeyChecking=no "${USER}@${ip}" \ "cd ${REMOTE_DIR} && bash build.sh 2>&1" if [ $? -ne 0 ]; then echo "[${name}] [ERROR] 编译失败" return 1 fi echo "[${name}] [OK] 编译成功" } RESULT=0 for dev in "${DEVICES[@]}"; do name=$(echo "$dev" | awk '{print $1}') ip=$(echo "$dev" | awk '{print $2}') model=$(echo "$dev" | awk '{print $3}') sync_and_build "$name" "$ip" "$model" || RESULT=1 done echo "==========================================" if [ $RESULT -eq 0 ]; then echo "[全部完成]" else echo "[存在失败项,请检查上方日志]" fi exit $RESULT