Skip to content

Commit b1f1106

Browse files
Merge pull request sipeed#10 from amiyak-codespace/codex/feat-ec2-onecmd-deploy
feat: add one-command EC2 deploy script
2 parents 3620128 + dad3858 commit b1f1106

1 file changed

Lines changed: 74 additions & 0 deletions

File tree

scripts/deploy_picoclaw_ec2.sh

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
#!/usr/bin/env bash
2+
set -euo pipefail
3+
4+
# One-command deploy for private picoclaw repo.
5+
# Default mode: build locally, copy image to EC2, restart service.
6+
7+
MODE="${MODE:-local-copy}"
8+
SYNC_UPSTREAM="${SYNC_UPSTREAM:-1}"
9+
10+
while [ $# -gt 0 ]; do
11+
case "$1" in
12+
--mode)
13+
MODE="$2"
14+
shift 2
15+
;;
16+
--no-sync)
17+
SYNC_UPSTREAM="0"
18+
shift
19+
;;
20+
*)
21+
echo "unknown arg: $1"
22+
echo "usage: $0 [--mode local-copy|build-on-ec2] [--no-sync]"
23+
exit 2
24+
;;
25+
esac
26+
done
27+
28+
SSH_KEY="${SSH_KEY:-/Users/amiyakumar.m/Ws/ssh/apps-magic-ec2.pem}"
29+
EC2_HOST="${EC2_HOST:-ubuntu@44.204.150.112}"
30+
AI_SPACE_DIR="${AI_SPACE_DIR:-/home/ubuntu/Ws/ai-space}"
31+
REPO_DIR="${REPO_DIR:-$(cd "$(dirname "$0")/.." && pwd)}"
32+
IMAGE_NAME="${IMAGE_NAME:-picoclaw-picoclaw:latest}"
33+
34+
sync_upstream_main() {
35+
if [ "$SYNC_UPSTREAM" != "1" ]; then
36+
return 0
37+
fi
38+
if ! command -v gh >/dev/null 2>&1; then
39+
echo "[sync] gh not found; skipping workflow sync"
40+
return 0
41+
fi
42+
43+
local repo="amiyak-codespace/picoclaw-private"
44+
echo "[sync] triggering upstream sync workflow for ${repo}"
45+
gh workflow run "Upstream Sync PR" -R "$repo" >/dev/null || true
46+
sleep 2
47+
local run_id
48+
run_id="$(gh run list -R "$repo" --workflow "Upstream Sync PR" --limit 1 --json databaseId --jq '.[0].databaseId' 2>/dev/null || true)"
49+
if [ -n "${run_id:-}" ]; then
50+
gh run watch "$run_id" -R "$repo" --interval 3 || true
51+
fi
52+
local pr
53+
pr="$(gh pr list -R "$repo" --state open --head upstream-sync --json number --jq '.[0].number' 2>/dev/null || true)"
54+
if [ -n "${pr:-}" ]; then
55+
echo "[sync] merging upstream PR #$pr"
56+
gh pr merge "$pr" -R "$repo" --squash --delete-branch --admin || true
57+
fi
58+
}
59+
60+
sync_upstream_main
61+
62+
if [ "$MODE" = "build-on-ec2" ]; then
63+
ssh -i "$SSH_KEY" "$EC2_HOST" "set -e; cd $AI_SPACE_DIR/picoclaw; git fetch origin --prune; git checkout main; git reset --hard origin/main; AI_SPACE_DIR=$AI_SPACE_DIR ./scripts/deploy_picoclaw_with_context.sh"
64+
else
65+
cd "$REPO_DIR"
66+
git fetch origin --prune
67+
git checkout main
68+
git reset --hard origin/main
69+
docker buildx build --platform linux/amd64 -t "$IMAGE_NAME" --load .
70+
docker save "$IMAGE_NAME" | ssh -i "$SSH_KEY" "$EC2_HOST" 'docker load'
71+
ssh -i "$SSH_KEY" "$EC2_HOST" "set -e; cd $AI_SPACE_DIR/picoclaw; git fetch origin --prune; git checkout main; git reset --hard origin/main; AI_SPACE_DIR=$AI_SPACE_DIR ./scripts/sync_ai_space_context.sh; AI_SPACE_DIR=$AI_SPACE_DIR docker compose up -d --no-build --force-recreate picoclaw"
72+
fi
73+
74+
ssh -i "$SSH_KEY" "$EC2_HOST" "set -e; docker ps --format 'table {{.Names}}\t{{.Status}}\t{{.Image}}'; echo; curl -s -o /dev/null -w 'HEALTH=%{http_code} READY=' http://localhost:18790/health; curl -s -o /dev/null -w '%{http_code}\n' http://localhost:18790/ready"

0 commit comments

Comments
 (0)