diff --git a/.gitignore b/.gitignore index 1117f00..4f208a0 100644 --- a/.gitignore +++ b/.gitignore @@ -241,18 +241,17 @@ CTestTestfile.cmake _deps -# PowerManager specific log files -bin/pPowerManger.log +# PowerManager specific files bin/ccuState.txt -*.db -# pPowerMangerHost 反馈落盘数据库 -feedback_data.db # PowerManager compiled binaries (built into bin/ by CMake) bin/pPowerManger bin/SQLiteTest bin/pPMtest bin/pPowerMangerHost +bin/pCCU +bin/pccuTest +bin/pCanBridge # CI test reports reports/ @@ -262,29 +261,26 @@ bin/PowerMangerTests bin/udpFeeder bin/fullFeeder -# SQLite runtime artifacts +# ============================================================ +# 数据库与日志文件(全局忽略,一律不入库) +# *.db / *.db-* SQLite 数据库及 WAL/SHM/journal 伴生文件 +# (power_data / pccu_data / pCanBridge_data / +# feedback_data / 测试库等) +# *.log 运行日志(pCCU.log / pPowerManger.log 等) +# ============================================================ +*.db *.db-shm *.db-wal *.db-journal +*.log -# Cross-compiled aarch64 artifacts (scripts/cross-build-local.sh) -bin/arm64/ - -# Board-native build dirs (build-arm64.sh / direct on-board builds) +# Board-native build dirs (build-board.sh) / 历史本机构建目录 build-arm64/ build-nosa-test/ # CMake-generated web asset table (pPowerMangerHost) src/pPowerMangerHost/webassets_gen.h -# ============================================================ -# 本机编译产物(避免误提交二进制) -# ============================================================ -bin/pCCU -bin/pccuTest -bin/pCanBridge -pCanBridge_data.db - # ============================================================ # MS Office 临时锁文件 / 编辑器、备份残留 # ============================================================ diff --git a/scripts/build-arm64-image.sh b/scripts/build-arm64-image.sh deleted file mode 100755 index 5789fad..0000000 --- a/scripts/build-arm64-image.sh +++ /dev/null @@ -1,60 +0,0 @@ -#!/bin/bash -#======================================================================= -# FILE: scripts/build-arm64-image.sh -# DESC: 一次性构建 arm64 CI 镜像(MOOS-IvP + jsoncpp + GTest)。 -# 构建产物缓存后,日常交叉编译只需 ./scripts/build-arm64.sh。 -# -# 用法: -# CI_TOKEN=xxx ./scripts/build-arm64-image.sh # 构建(已存在则跳过) -# CI_TOKEN=xxx ./scripts/build-arm64-image.sh --force # 强制重新构建 -# -# 环境变量: -# CI_TOKEN 内网 Gitea token(拉取 moos-ivp / googletest 镜像,兼容 GITEA_TOKEN) -#======================================================================= - -set -euo pipefail - -SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -PROJECT_ROOT="$(dirname "${SCRIPT_DIR}")" - -IMAGE="h100-power-manager-ci:arm64" -GITEA_TOKEN="${CI_TOKEN:-${GITEA_TOKEN:-}}" -FORCE=0 -[ "${1:-}" = "--force" ] && FORCE=1 - -if [ -z "${GITEA_TOKEN}" ]; then - echo "错误: 缺少内网 Gitea token。" >&2 - echo " 请设置: CI_TOKEN=xxx ./scripts/build-arm64-image.sh" >&2 - exit 1 -fi - -if ! command -v docker >/dev/null 2>&1; then - echo "错误: 未找到 docker" >&2 - exit 1 -fi - -if ! docker info >/dev/null 2>&1; then - echo "错误: 无法连接 docker daemon(是否需要用 sudo?)" >&2 - exit 1 -fi - -if ! docker buildx version >/dev/null 2>&1; then - echo "错误: 未找到 buildx。请安装: sudo apt-get install -y docker-buildx" >&2 - exit 1 -fi - -if [ "${FORCE}" = "0" ] && docker image inspect "${IMAGE}" >/dev/null 2>&1; then - echo ">>> 已存在镜像 ${IMAGE},跳过构建(如需重建: ${0} --force)" - exit 0 -fi -if [ "${FORCE}" = "1" ]; then - echo ">>> --force: 重新构建镜像 ${IMAGE}" -fi - -CI_TOKEN="${GITEA_TOKEN}" docker buildx build \ - --platform linux/arm64 \ - --load \ - --secret id=gitea_token,env=CI_TOKEN \ - -t "${IMAGE}" -f "${PROJECT_ROOT}/ci/Dockerfile" "${PROJECT_ROOT}" - -echo ">>> 镜像构建完成: ${IMAGE}" diff --git a/scripts/build-arm64.sh b/scripts/build-arm64.sh deleted file mode 100755 index 7ba6c12..0000000 --- a/scripts/build-arm64.sh +++ /dev/null @@ -1,42 +0,0 @@ -#!/bin/bash -#======================================================================= -# FILE: scripts/build-arm64.sh -# DESC: 交叉编译为 RK3588 (aarch64) / Ubuntu 22.04 二进制,用法同 build.sh。 -# 在 arm64 镜像(h100-power-manager-ci:arm64)内跑 cmake + make, -# 产物输出到 bin/arm64/,与本地 x86_64 的 bin/、build/ 互不影响。 -# -# 用法: -# ./scripts/build-arm64.sh -# -# 前置(一次性,构建 arm64 镜像): -# CI_TOKEN=xxx ./scripts/build-arm64-image.sh -#======================================================================= - -set -euo pipefail - -SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -PROJECT_ROOT="$(dirname "${SCRIPT_DIR}")" - -IMAGE="h100-power-manager-ci:arm64" -JOBS="${JOBS:-$(nproc)}" - -if ! docker image inspect "${IMAGE}" >/dev/null 2>&1; then - echo "错误: 本地不存在镜像 ${IMAGE}" >&2 - echo " 请先执行: CI_TOKEN=xxx ./scripts/build-arm64-image.sh" >&2 - exit 1 -fi - -mkdir -p "${PROJECT_ROOT}/build-arm64" "${PROJECT_ROOT}/bin/arm64" - -docker run --rm --platform linux/arm64 \ - -u "$(id -u):$(id -g)" \ - -v "${PROJECT_ROOT}":/src \ - -w /src/build-arm64 \ - "${IMAGE}" \ - /bin/sh -c "cmake -DCMAKE_BUILD_TYPE=Release \ - -DEXECUTABLE_OUTPUT_PATH=/src/bin/arm64 \ - -DRUNTIME_OUTPUT_DIRECTORY=/src/bin/arm64 .. && make -j${JOBS}" - -echo "" -echo ">>> 完成。产物:" -file "${PROJECT_ROOT}/bin/arm64/pPowerManger" diff --git a/scripts/clean-data.sh b/scripts/clean-data.sh index d0141a4..d3c8243 100755 --- a/scripts/clean-data.sh +++ b/scripts/clean-data.sh @@ -3,14 +3,16 @@ # FILE: scripts/clean-data.sh # DESC: 清理目标板卡 (RK3588 / Ubuntu 22.04) 上的数据库与日志文件。 # 默认清理板卡运行目录 /root/work/h100/data/ 下的: -# power_data.db (+ -wal/-shm) 主机功率数据库 -# feedback_data.db 反馈落盘数据库 -# pPowerManger.log 主机运行日志 -# 默认先停止 4 个服务再清理(避免 SQLite WAL 仍在写入)。 +# power_data.db (+ -wal/-shm) 主机功率数据库 +# feedback_data.db 反馈落盘数据库 +# pccu_data.db (+ -wal/-shm) pCCU 帧日志数据库 +# pCanBridge_data.db (+ -wal/-shm) pCanBridge CAN 帧数据库 +# pPowerManger.log / pCCU.log 运行日志 +# 默认先停止各服务再清理(避免 SQLite WAL 仍在写入)。 # # 用法: # ./scripts/clean-data.sh # 停服务 -> 清理 data 目录(不重启) -# ./scripts/clean-data.sh --start # 清理后重新启动 4 个服务 +# ./scripts/clean-data.sh --start # 清理后重新启动各服务 # ./scripts/clean-data.sh --no-stop # 不停服务直接清理(慎用) # ./scripts/clean-data.sh --stale # 额外清理 bin/ 与 src/bin/ 下的旧 db/log # @@ -38,10 +40,16 @@ DO_START=0 DO_STOP=1 DO_STALE=0 -SERVICES=(moosdb pPowerManger pPowerMangerHost pCCU) +SERVICES=(moosdb pPowerManger pPowerMangerHost pCCU pCanBridge) # 板卡 data 目录下需要清理的文件(含 SQLite WAL/SHM) -DATA_FILES=(power_data.db power_data.db-wal power_data.db-shm feedback_data.db pPowerManger.log pccu_data.db pCCU.log) +DATA_FILES=( + power_data.db power_data.db-wal power_data.db-shm + feedback_data.db + pccu_data.db pccu_data.db-wal pccu_data.db-shm + pCanBridge_data.db pCanBridge_data.db-wal pCanBridge_data.db-shm + pPowerManger.log pCCU.log +) # 历史遗留目录(旧部署位置),仅当 --stale 时清理 STALE_DIRS=("${BOARD_DIR}/bin" "${BOARD_DIR}/src/bin") @@ -52,7 +60,7 @@ warn() { printf '\033[1;33m[clean-data]\033[0m %s\n' "$*"; } err() { printf '\033[1;31m[clean-data]\033[0m %s\n' "$*"; } usage() { - sed -n '2,29p' "${BASH_SOURCE[0]}" | sed 's/^# \{0,1\}//' + sed -n '2,31p' "${BASH_SOURCE[0]}" | sed 's/^# \{0,1\}//' exit 0 } @@ -92,7 +100,8 @@ ok "SSH 连接正常: ${SSH_TARGET}" #------------------------------------------------------------------- if [ "${DO_STOP}" = "1" ]; then info "停止服务 ${SERVICES[*]} ..." - ${SSH} "${SSH_TARGET}" "systemctl stop pPowerMangerHost pPowerManger moosdb 2>/dev/null; true" + # 先停应用,最后停 moosdb + ${SSH} "${SSH_TARGET}" "systemctl stop pCanBridge pPowerMangerHost pPowerManger pCCU moosdb 2>/dev/null; true" ok "服务已停止" else warn "--no-stop:不停服务直接清理,可能产生脏数据(SQLite 仍在写入)" @@ -123,15 +132,15 @@ fi # 5. 可选: 重启服务 #------------------------------------------------------------------- if [ "${DO_START}" = "1" ]; then - info "启动服务 (moosdb -> pPowerManger / pPowerMangerHost / pCCU) ..." + info "启动服务 (moosdb -> pPowerManger / pPowerMangerHost / pCCU / pCanBridge) ..." ${SSH} "${SSH_TARGET}" "systemctl start moosdb && sleep 1 && \ - systemctl start pPowerManger pPowerMangerHost pCCU" \ + systemctl start pPowerManger pPowerMangerHost pCCU pCanBridge" \ || { err "启动失败"; exit 1; } ok "服务已启动" else echo "" info "清理完成,服务未启动。需要重启请加 --start 或手动:" - echo " systemctl start moosdb pPowerManger pPowerMangerHost pCCU" + echo " systemctl start moosdb pPowerManger pPowerMangerHost pCCU pCanBridge" fi echo "" diff --git a/scripts/deploy.sh b/scripts/deploy.sh index 918ee4e..05fc88c 100755 --- a/scripts/deploy.sh +++ b/scripts/deploy.sh @@ -1,18 +1,20 @@ #!/bin/bash #======================================================================= # FILE: scripts/deploy.sh -# DESC: 部署 pPowerManger / pPowerMangerHost / pCCU / pCanBridge(aarch64 二进制 + -# mission)到目标板卡 (RK3588 / Ubuntu 22.04),并用五个独立 -# systemd 服务(moosdb / pPowerManger / pPowerMangerHost / pCCU / -# pCanBridge)管理。只安装服务 + daemon-reload,默认不启动、不自启。 +# DESC: 部署 mission + 5 个 systemd 服务(moosdb / pPowerManger / +# pPowerMangerHost / pCCU / pCanBridge)到目标板卡 (RK3588 / +# Ubuntu 22.04)。只安装服务 + daemon-reload,默认不启动、不自启。 +# +# 注意:二进制由 ./scripts/build-board.sh 在板卡原生编译并部署到 +# /root/work/h100/bin/(交叉编译已移除),本脚本不再推送二进制。 # # 用法: # ./scripts/deploy.sh setup-ssh 一次性:生成 ed25519 key + ssh-copy-id -# ./scripts/deploy.sh 默认:推送二进制 + mission + 装 4 个 +# ./scripts/deploy.sh 默认:推送 mission + 装 5 个 # systemd 服务 + daemon-reload(不启动) # ./scripts/deploy.sh --start 部署后按依赖顺序启动服务 -# ./scripts/deploy.sh status 板卡 4 个服务状态 -# ./scripts/deploy.sh stop 停止 4 个服务 +# ./scripts/deploy.sh status 板卡各服务状态 +# ./scripts/deploy.sh stop 停止各服务 # ./scripts/deploy.sh help 显示帮助 # # 参数: @@ -24,7 +26,7 @@ # --ccu-port 覆盖 mission 中 pPowerManger 的 CCU 端口 (ccuport) # # 板卡布局: -# /root/work/h100/bin/ aarch64 二进制 +# /root/work/h100/bin/ 二进制(由 build-board.sh 板卡编译产出) # /root/work/h100/missions/ 板卡 mission h100.moos # /root/work/h100/data/ 数据库存储目录 (power_data.db 等) # /etc/systemd/system/ moosdb.service / pPowerManger.service / @@ -51,7 +53,7 @@ warn() { printf '\033[1;33m[deploy]\033[0m %s\n' "$*"; } err() { printf '\033[1;31m[deploy]\033[0m %s\n' "$*"; } usage() { - sed -n '2,31p' "${BASH_SOURCE[0]}" | sed 's/^# \{0,1\}//' + sed -n '2,35p' "${BASH_SOURCE[0]}" | sed 's/^# \{0,1\}//' exit 0 } @@ -100,22 +102,6 @@ cmd_setup_ssh() { #------------------------------------------------------------------- # 前置检查 #------------------------------------------------------------------- -check_local() { - local missing=0 - for b in pPowerManger pPowerMangerHost pCCU pCanBridge; do - if [ ! -f "${PROJECT_ROOT}/bin/arm64/${b}" ]; then - err "缺少本地 aarch64 二进制: bin/arm64/${b}(先运行 ./scripts/build-arm64.sh)"; missing=1 - elif ! file "${PROJECT_ROOT}/bin/arm64/${b}" | grep -q "aarch64"; then - err "bin/arm64/${b} 不是 aarch64 二进制"; missing=1 - fi - done - if [ ! -f "${PROJECT_ROOT}/missions/h100.moos" ]; then - err "缺少板卡 mission: missions/h100.moos"; missing=1 - fi - [ "${missing}" -eq 0 ] || return 1 - ok "本地产物校验通过 (aarch64 + mission)" -} - check_ssh() { if ! ${SSH} "${SSH_TARGET}" 'true' 2>/dev/null; then err "无法免密 SSH 到 ${SSH_TARGET}" @@ -194,20 +180,13 @@ upsert_moos_param() { # 命令: deploy #------------------------------------------------------------------- cmd_deploy() { - check_local || return 1 - check_ssh || return 1 + check_ssh || return 1 + [ -f "${PROJECT_ROOT}/missions/h100.moos" ] || { err "缺少板卡 mission: missions/h100.moos"; return 1; } - # 1. 推送二进制 + mission + # 1. 创建板卡目录 + 推送 mission info "创建板卡目录 ${BOARD_DIR}/{bin,missions,data} ..." ${SSH} "${SSH_TARGET}" "mkdir -p ${BOARD_DIR}/bin ${BOARD_DIR}/missions ${BOARD_DIR}/data" || { err "创建目录失败"; return 1; } - info "推送 aarch64 二进制 ..." - ${SCP} -q "${PROJECT_ROOT}/bin/arm64/pPowerManger" \ - "${PROJECT_ROOT}/bin/arm64/pPowerMangerHost" \ - "${PROJECT_ROOT}/bin/arm64/pCCU" \ - "${PROJECT_ROOT}/bin/arm64/pCanBridge" \ - "${SSH_TARGET}:${BOARD_DIR}/bin/" || { err "推送二进制失败"; return 1; } - info "推送 mission h100.moos ..." local mission_src="${PROJECT_ROOT}/missions/h100.moos" local mission_push="${mission_src}" tmp_moos="" @@ -223,8 +202,7 @@ cmd_deploy() { "${SSH_TARGET}:${BOARD_DIR}/missions/" || { err "推送 mission 失败"; [ -n "${tmp_moos}" ] && rm -f "${tmp_moos}"; return 1; } [ -n "${tmp_moos}" ] && rm -f "${tmp_moos}" - ${SSH} "${SSH_TARGET}" "chmod +x ${BOARD_DIR}/bin/pPowerManger ${BOARD_DIR}/bin/pPowerMangerHost ${BOARD_DIR}/bin/pCCU ${BOARD_DIR}/bin/pCanBridge" - ok "二进制与 mission 已推送" + ok "mission 已推送(二进制由 build-board.sh 在板卡编译部署)" # 2. 生成并安装 4 个 systemd unit local unit diff --git a/scripts/fetch-data.sh b/scripts/fetch-data.sh index 15efd9c..dc9e554 100755 --- a/scripts/fetch-data.sh +++ b/scripts/fetch-data.sh @@ -3,10 +3,12 @@ # FILE: scripts/fetch-data.sh # DESC: 从目标板卡 (RK3588 / Ubuntu 22.04) 下载数据库与日志到本地。 # 默认抓取板卡运行目录 /root/work/h100/data/ 下的: -# power_data.db (+ -wal/-shm) 主机功率数据库 -# feedback_data.db 反馈落盘数据库 -# pPowerManger.log 主机运行日志 -# 可选 --journal 一并导出四个 systemd 服务的 journal 日志。 +# power_data.db (+ -wal/-shm) 主机功率数据库 +# feedback_data.db 反馈落盘数据库 +# pccu_data.db (+ -wal/-shm) pCCU 帧日志数据库 +# pCanBridge_data.db (+ -wal/-shm) pCanBridge CAN 帧数据库 +# pPowerManger.log / pCCU.log 运行日志 +# 可选 --journal 一并导出各 systemd 服务的 journal 日志。 # # 用法: # ./scripts/fetch-data.sh # 下载 db + 日志到本地 data/board-<时间>/ @@ -18,7 +20,7 @@ # --user 登录用户(默认 root) # --board-dir 板卡部署根目录(默认 /root/work/h100) # --out-dir 本地保存目录(默认 data/board-<时间>) -# --journal 额外导出 4 个服务的 systemd journal 日志 +# --journal 额外导出各服务的 systemd journal 日志 # -h, --help 显示帮助 # # 前置: 板卡已配免密 SSH(见 scripts/deploy.sh setup-ssh)。 @@ -35,10 +37,16 @@ BOARD_DIR="/root/work/h100" OUT_DIR="" DO_JOURNAL=0 -SERVICES=(moosdb pPowerManger pPowerMangerHost pCCU) +SERVICES=(moosdb pPowerManger pPowerMangerHost pCCU pCanBridge) # 板卡 data 目录下需要下载的文件(含 SQLite WAL/SHM 以保证数据完整) -DATA_FILES=(power_data.db power_data.db-wal power_data.db-shm feedback_data.db pPowerManger.log pccu_data.db pCCU.log) +DATA_FILES=( + power_data.db power_data.db-wal power_data.db-shm + feedback_data.db + pccu_data.db pccu_data.db-wal pccu_data.db-shm + pCanBridge_data.db pCanBridge_data.db-wal pCanBridge_data.db-shm + pPowerManger.log pCCU.log +) info() { printf '\033[1;36m[fetch-data]\033[0m %s\n' "$*"; } ok() { printf '\033[1;32m[fetch-data]\033[0m %s\n' "$*"; } @@ -46,7 +54,7 @@ warn() { printf '\033[1;33m[fetch-data]\033[0m %s\n' "$*"; } err() { printf '\033[1;31m[fetch-data]\033[0m %s\n' "$*"; } usage() { - sed -n '2,26p' "${BASH_SOURCE[0]}" | sed 's/^# \{0,1\}//' + sed -n '2,28p' "${BASH_SOURCE[0]}" | sed 's/^# \{0,1\}//' exit 0 }