|
| 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