Files
sunnypilot-byd/deploy_to_device.sh
Quintine 1a4f296aa8 tools: add deploy_to_device.sh — git-archive-over-ssh deploy that preserves symlinks
Copying the tree to a device with scp/file managers mangles symlinks
(car_list.json et al become text files containing the target path),
crashing the UI with JSONDecodeError. This script deploys via
'git archive HEAD | ssh tar -x', which preserves symlinks, verifies
them on-device, and keeps the previous install for rollback.
2026-07-25 16:53:38 +10:00

76 lines
2.2 KiB
Bash
Executable File

#!/usr/bin/env bash
# Deploy this repo to a comma device over SSH, preserving symlinks.
#
# Usage:
# ./deploy_to_device.sh <device-ip> [target-dir]
#
# Examples:
# ./deploy_to_device.sh 192.168.1.50
# ./deploy_to_device.sh comma.local /data/openpilot
#
# Notes:
# - Deploys EXACTLY what is committed in git (git archive), so commit first.
# - Symlinks are preserved (unlike scp -r / file managers).
# - The existing install is kept as <target>.old for rollback.
# - Only the last ~deploy is transferred (no .git, no .venv) — fast and small.
set -euo pipefail
DEVICE="${1:?usage: ./deploy_to_device.sh <device-ip> [target-dir]}"
TARGET="${2:-/data/openpilot}"
SSH_USER="${SSH_USER:-comma}"
cd "$(dirname "$0")"
# sanity: must be run from the repo root
if [ ! -d .git ]; then
echo "error: no .git here — run from the repo root" >&2
exit 1
fi
# sanity: working tree must be committed (deploy uses git archive HEAD)
if [ -n "$(git status --porcelain)" ]; then
echo "warning: uncommitted changes exist — they will NOT be deployed."
echo " commit first, or press enter to deploy HEAD anyway."
read -r _
fi
echo "==> deploying HEAD ($(git rev-parse --short HEAD)) to ${SSH_USER}@${DEVICE}:${TARGET}"
TMP="${TARGET}.deploy-new"
OLD="${TARGET}.old"
# 1) stream the archive to the device and extract into a staging dir
git archive HEAD | ssh "${SSH_USER}@${DEVICE}" "
set -e
rm -rf '$TMP'
mkdir -p '$TMP'
tar -xf - -C '$TMP'
"
# 2) verify symlinks landed correctly on the device
echo "==> verifying symlinks on device"
ssh "${SSH_USER}@${DEVICE}" "
set -e
for l in opendbc msgq rednose teleoprtc tinygrad \
openpilot/sunnypilot/selfdrive/car/car_list.json; do
if [ ! -L '$TMP/'\$l ]; then
echo \"FATAL: \$l is not a symlink on device\" >&2
exit 1
fi
done
head -c 2 '$TMP/openpilot/sunnypilot/selfdrive/car/car_list.json' | grep -q '^{'
echo ' symlinks OK'
"
# 3) swap into place (keep previous as .old)
ssh "${SSH_USER}@${DEVICE}" "
set -e
rm -rf '$OLD'
if [ -d '$TARGET' ]; then mv '$TARGET' '$OLD'; fi
mv '$TMP' '$TARGET'
echo '==> swapped into place (previous kept as $OLD)'
"
echo "==> done. Reboot the device to start the new build."