-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdeploy.ps1
More file actions
157 lines (118 loc) · 4.98 KB
/
Copy pathdeploy.ps1
File metadata and controls
157 lines (118 loc) · 4.98 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
$ErrorActionPreference = "Stop"
$JETSON_USER = "raycast"
$JETSON_HOST = "192.168.55.1"
$REMOTE_DIR = "/home/$JETSON_USER/raycast-app"
$SERVICE = "raycast.service"
$LOCAL_ARCHIVE = Join-Path $env:TEMP "deploy_raycast.tgz"
if (Test-Path $LOCAL_ARCHIVE) { Remove-Item $LOCAL_ARCHIVE -Force }
tar -czf $LOCAL_ARCHIVE `
--exclude=".git" `
--exclude=".venv" `
--exclude="__pycache__" `
--exclude="*.pyc" `
--exclude="deploy.tgz" `
--exclude="*.env" `
--exclude=".DS_Store" `
--exclude="*.log" `
--exclude="*.png" `
.
Write-Host "=== Uploading archive to Jetson: /tmp/deploy.tgz ==="
scp $LOCAL_ARCHIVE "$JETSON_USER@${JETSON_HOST}:/tmp/deploy.tgz"
Write-Host "=== Running remote deploy script (remote output below) ==="
$remoteScript = @'
set -euxo pipefail
echo "=== Remote host: $(hostname) ==="
echo "=== deploy.tgz stats ==="
ls -lh /tmp/deploy.tgz
echo "=== deploy.tgz contents (first 40) ==="
tar -tzf /tmp/deploy.tgz | head -n 40 || true
echo "=== Stopping service (if running) ==="
systemctl --user stop __SERVICE__ || true
echo "=== Ensure dir exists: __REMOTE_DIR__ ==="
mkdir -p "__REMOTE_DIR__"
echo "=== BEFORE: __REMOTE_DIR__ ==="
ls -la "__REMOTE_DIR__" | head -n 80 || true
echo "=== Manual remove old code paths ==="
rm -rf "__REMOTE_DIR__/src" \
"__REMOTE_DIR__/README.md" \
"__REMOTE_DIR__/requirements.txt" \
"__REMOTE_DIR__/runs" \
"__REMOTE_DIR__/LICENSE" \
"__REMOTE_DIR__/.vscode" \
"__REMOTE_DIR__/.crossnote" \
"__REMOTE_DIR__/deploy.ps1" \
"__REMOTE_DIR__/requirements.local.lock" \
"__REMOTE_DIR__/.python-version" \
"__REMOTE_DIR__/.gitignore" \
"__REMOTE_DIR__/.gitattributes" || true
echo "=== Extracting /tmp/deploy.tgz into __REMOTE_DIR__ ==="
tar -xzf /tmp/deploy.tgz -C "__REMOTE_DIR__" -o
echo "=== AFTER: __REMOTE_DIR__ ==="
ls -la "__REMOTE_DIR__" | head -n 80
echo "=== AFTER: __REMOTE_DIR__/src ==="
ls -la "__REMOTE_DIR__/src" | head -n 80
echo "=== Verify entrypoint ==="
test -f "__REMOTE_DIR__/src/main.py"
cd "__REMOTE_DIR__"
echo "=== Force correct venv (must be Python 3.10 on JP6.2) ==="
PY=python3.10
$PY --version
VENV_DIR=".venv"
# If venv exists, check what python it actually contains
if [ -x "$VENV_DIR/bin/python" ]; then
VENV_PYVER="$("$VENV_DIR/bin/python" -c 'import sys; print(f"{sys.version_info.major}.{sys.version_info.minor}")' || echo "unknown")"
else
VENV_PYVER="missing"
fi
echo "Existing venv python: $VENV_PYVER"
# Recreate if not 3.10
if [ "$VENV_PYVER" != "3.10" ]; then
echo "Recreating venv with python3.10..."
rm -rf "$VENV_DIR"
$PY -m venv --system-site-packages "$VENV_DIR"
fi
. "$VENV_DIR/bin/activate"
echo "Venv python now: $(python -c 'import sys; print(sys.version)')"
echo "=== Pip bootstrap ==="
python -m pip install -U pip setuptools wheel
echo "=== Install JetPack 6.2 CUDA PyTorch (cp310 / cu126) ==="
python -m pip uninstall -y torch torchvision torchaudio || true
python -m pip install \
--index-url https://pypi.jetson-ai-lab.io/jp6/cu126 \
torch torchvision torchaudio
echo "=== Verify CUDA torch ==="
python -c "import torch; print('torch', torch.__version__); print('cuda', torch.version.cuda); print('is_available', torch.cuda.is_available()); print('count', torch.cuda.device_count())"
echo "=== Install the rest of deps (excluding torch/torchvision/torchaudio) ==="
REQ_HASH_FILE="$VENV_DIR/.requirements.sha256"
# Build a temp requirements file without torch pins so we don't overwrite CUDA torch
grep -vE '^(torch|torchvision|torchaudio)=' requirements.txt > /tmp/requirements.no_torch.txt
NEW_HASH="$(sha256sum /tmp/requirements.no_torch.txt | awk '{print $1}')"
OLD_HASH="$(cat "$REQ_HASH_FILE" 2>/dev/null || true)"
if [ "$NEW_HASH" = "$OLD_HASH" ]; then
echo "=== requirements unchanged; skipping pip install ==="
else
python -m pip install -r /tmp/requirements.no_torch.txt
echo "$NEW_HASH" > "$REQ_HASH_FILE"
fi
# Safeguard installs
pip install filterpy==1.4.5
pip install depthai==2.31.0.0
# Additional Jetson-specific installs
pip install ultralytics[export]
# pip install https://github.com/ultralytics/assets/releases/download/v0.0.0/torch-2.5.0a0+872d972e41.nv24.08-cp310-cp310-linux_aarch64.whl
# pip install https://github.com/ultralytics/assets/releases/download/v0.0.0/torchvision-0.20.0a0+afc54f7-cp310-cp310-linux_aarch64.whl
# pip install https://github.com/ultralytics/assets/releases/download/v0.0.0/onnxruntime_gpu-1.23.0-cp310-cp310-linux_aarch64.whl
python -m pip freeze > requirements.jetson.lock
echo "=== Starting service ==="
systemctl --user daemon-reload
systemctl --user start __SERVICE__
systemctl --user status __SERVICE__ --no-pager || true
echo "DEPLOY_OK"
deactivate
exit 0
'@
$remoteScript = $remoteScript.Replace("__REMOTE_DIR__", $REMOTE_DIR).Replace("__SERVICE__", $SERVICE)
$remoteScript = $remoteScript -replace "`r`n", "`n"
$remoteScript | ssh -tt "$JETSON_USER@$JETSON_HOST" "bash -s"
if ($LASTEXITCODE -ne 0) { throw "Remote deploy failed with exit code $LASTEXITCODE" }
Write-Host "Deploy complete."