diff --git a/.gitea/workflows/ci.yml b/.gitea/workflows/ci.yml index 7bde692..27dd7f3 100644 --- a/.gitea/workflows/ci.yml +++ b/.gitea/workflows/ci.yml @@ -51,7 +51,48 @@ jobs: needs: [validate] steps: - uses: actions/checkout@v4 + - name: Deploy to agents + env: + TAG: ${{ github.ref_name }} run: | - echo "๐Ÿš€ Deploying tag $(echo $GITHUB_REF | sed 's|refs/tags/||')" - echo "Run: ./scripts/deploy.sh --mode=native $(echo $GITHUB_REF | sed 's|refs/tags/||')" + echo "๐Ÿš€ Deploying tag $TAG" + + # Canary: Tanko first + echo "--- Tanko (CT 112) ---" + ssh -o StrictHostKeyChecking=no -o ConnectTimeout=10 jerome@192.168.68.122 \ + "cd /root && bash -s" < scripts/deploy.sh --ct=tanko --mode=native "$TAG" 2>&1 || echo "โš ๏ธ Tanko deploy skipped" + + # Wait for canary to settle + sleep 30 + + # Full rollout: Mumuni + echo "--- Mumuni (CT 114) ---" + ssh -o StrictHostKeyChecking=no -o ConnectTimeout=10 root@192.168.68.123 \ + "cd /root && bash -s" < scripts/deploy.sh --ct=mumuni --mode=native "$TAG" 2>&1 || echo "โš ๏ธ Mumuni deploy skipped" + + - name: Deploy kagentz (Agent Zero) + env: + TAG: ${{ github.ref_name }} + run: | + echo "--- kagentz (CT 105) ---" + # For Agent Zero, copy files into the Docker container + ssh -o StrictHostKeyChecking=no -o ConnectTimeout=10 root@192.168.68.14 \ + "cd /root && bash -s" < scripts/deploy.sh --ct=kagentz --mode=legacy "$TAG" 2>&1 || echo "โš ๏ธ kagentz deploy skipped" + + - name: Verify deployment + run: | + echo "๐Ÿ” Verifying deployments..." + sleep 10 + + # Check Tanko + TANKO=$(ssh -o StrictHostKeyChecking=no -o ConnectTimeout=5 jerome@192.168.68.122 \ + "cat ~/.hermes/gateway_state.json 2>/dev/null" 2>/dev/null || echo '{}') + echo "Tanko: $(echo $TANKO | python3 -c "import sys,json; d=json.load(sys.stdin); print(d.get('platforms',{}).get('zulip',{}).get('state','unknown'))" 2>/dev/null)" + + # Check Mumuni + MUMUNI=$(ssh -o StrictHostKeyChecking=no -o ConnectTimeout=5 root@192.168.68.123 \ + "cat ~/.hermes/gateway_state.json 2>/dev/null" 2>/dev/null || echo '{}') + echo "Mumuni: $(echo $MUMUNI | python3 -c "import sys,json; d=json.load(sys.stdin); print(d.get('platforms',{}).get('zulip',{}).get('state','unknown'))" 2>/dev/null)" + + echo "โœ… Deploy verification complete" diff --git a/.gitea/workflows/deploy.yml b/.gitea/workflows/deploy.yml index 534db98..3da6006 100644 --- a/.gitea/workflows/deploy.yml +++ b/.gitea/workflows/deploy.yml @@ -37,11 +37,24 @@ jobs: steps: - uses: actions/checkout@v4 - name: Deploy to Tanko + env: + TAG: ${{ github.ref_name }} run: | - TAG=$(echo $GITHUB_REF | sed 's|refs/tags/||') echo "๐Ÿงช Canary deploy $TAG โ†’ Tanko (CT 112)" - echo "Run: ssh root@192.168.68.122 'cd /root && ./deploy.sh --ct=tanko --mode=native $TAG'" - echo "Wait 60s for health check..." + ssh -o StrictHostKeyChecking=no -o ConnectTimeout=10 jerome@192.168.68.122 \ + "cd /root && bash -s" < scripts/deploy.sh --ct=tanko --mode=native "$TAG" 2>&1 + + - name: Canary health check + run: | + echo "โณ Waiting 60s for canary to settle..." + sleep 60 + STATE=$(ssh -o StrictHostKeyChecking=no -o ConnectTimeout=5 jerome@192.168.68.122 \ + "cat ~/.hermes/gateway_state.json 2>/dev/null" 2>/dev/null || echo '{}') + ZULIP_STATE=$(echo $STATE | python3 -c "import sys,json; d=json.load(sys.stdin); print(d.get('platforms',{}).get('zulip',{}).get('state','unknown'))" 2>/dev/null) + echo "Tanko Zulip state: $ZULIP_STATE" + if [ "$ZULIP_STATE" != "connected" ]; then + echo "โš ๏ธ Canary health check failed โ€” promoting anyway (non-blocking)" + fi # โ”€โ”€ Track 2: Hermes agents (after canary passes) โ”€โ”€โ”€โ”€โ”€โ”€ deploy-hermes: @@ -52,11 +65,26 @@ jobs: steps: - uses: actions/checkout@v4 - name: Deploy to all Hermes agents + env: + TAG: ${{ github.ref_name }} run: | - TAG=$(echo $GITHUB_REF | sed 's|refs/tags/||') echo "๐Ÿš€ Promoting $TAG to Hermes agents" - echo " โ†’ Mumuni (CT 114): ssh root@192.168.68.123 ..." - echo " โ†’ Tanko already on $TAG (canary passed)" + + # Mumuni + echo "--- Mumuni (CT 114) ---" + ssh -o StrictHostKeyChecking=no -o ConnectTimeout=10 root@192.168.68.123 \ + "cd /root && bash -s" < scripts/deploy.sh --ct=mumuni --mode=native "$TAG" 2>&1 + + - name: Production health check + run: | + sleep 30 + for agent in "jerome@192.168.68.122" "root@192.168.68.123"; do + STATE=$(ssh -o StrictHostKeyChecking=no -o ConnectTimeout=5 $agent \ + "cat ~/.hermes/gateway_state.json 2>/dev/null" 2>/dev/null || echo '{}') + NAME=$(echo $agent | cut -d@ -f2) + echo "$NAME: $(echo $STATE | python3 -c "import sys,json; d=json.load(sys.stdin); print(d.get('platforms',{}).get('zulip',{}).get('state','unknown'))" 2>/dev/null)" + done + echo "โœ… Production rollout complete" # โ”€โ”€ Track 3: Agent Zero (kagentz) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ deploy-agent-zero: @@ -67,10 +95,10 @@ jobs: steps: - uses: actions/checkout@v4 - name: Deploy to kagentz + env: + TAG: ${{ github.ref_name }} run: | - TAG=$(echo $GITHUB_REF | sed 's|refs/tags/az-||') echo "๐Ÿค– Deploying Agent Zero $TAG โ†’ kagentz (CT 105)" - echo "Steps:" - echo " 1. Copy adapter.py โ†’ docker cp agent-zero:/a0/usr/kagentz-zulip/" - echo " 2. Copy a2a_server.py โ†’ docker cp agent-zero:/a0/usr/a2a_agent.py" - echo " 3. Restart adapter + A2A server" + TAG_CLEAN=$(echo $TAG | sed 's/^az-//') + ssh -o StrictHostKeyChecking=no -o ConnectTimeout=10 root@192.168.68.14 \ + "cd /root && bash -s" < scripts/deploy.sh --ct=kagentz --mode=legacy "$TAG_CLEAN" 2>&1 diff --git a/.gitignore b/.gitignore index 13ff510..85c95e0 100644 --- a/.gitignore +++ b/.gitignore @@ -24,3 +24,13 @@ Thumbs.db # Logs *.log deploy.log + +# Gitea runner +.act_runner/ +.cache/act/ + +# Git hooks (installed locally) +.githooks/ + +# PM2 ecosystem (local configs) +ecosystem.*.config.cjs diff --git a/.gitmessage b/.gitmessage new file mode 100644 index 0000000..f28d347 --- /dev/null +++ b/.gitmessage @@ -0,0 +1,23 @@ + +# Commit message conventions: +# +# feat: New feature (bumps minor) +# fix: Bug fix (bumps patch) +# refactor: Code change without feature/fix +# docs: Documentation only +# ci: CI/CD changes +# chore: Maintenance, deps, tooling +# test: Test changes +# style: Formatting, no logic change +# +# Breaking changes: append ! after type +# feat!: breaking change (bumps major) +# +# Scope (optional): (hermes), (pi), (agent-zero), (deploy), (ci) +# +# Examples: +# feat(hermes): add health check endpoint +# fix(agent-zero): reconnect on queue expiry +# ci!: switch to Gitea Actions runner +# chore(deps): bump zulip-js to v0.7 +