# Phase 3: Build Test Workflow - Documentation **Status:** ✅ ACTIVE **Workflow ID:** `EG9SCUWgbkdtr8Gm` **Webhook URL:** `https://n8n.oky.sh/webhook/openhands-build-test` **Created:** 2025-12-02 **Active:** Yes --- ## 🎯 Purpose Autonomous build/test system that: - ✅ Executes builds automatically - ✅ Detects failures - ✅ Provides feedback to OpenHands - ✅ Retries with improved instructions - ✅ Updates commit status in Gitea - ✅ Prevents infinite loops with max retry limit (3) --- ## 🔄 Workflow Flow ### High-Level Process ``` [1] Git Push (Developer) ↓ [2] Filter OpenHands Commits (skip if message contains "openhands") ↓ [3] Prepare Build Task (initialize retry counter) ↓ [4] Execute OpenHands (run build/test) ↓ [5] Analyze Build Result (check success/failure) ↓ [6] Decision: Build Success? ├─ YES → [7] Update Gitea Success → [8] Respond └─ NO → [9] Check Retry Count ├─ < 3 → Back to [3] (retry with error feedback) └─ ≥ 3 → [8] Respond with failure ``` --- ## 📊 Node Details ### 1. Gitea Webhook - **Type:** Webhook Trigger - **Path:** `openhands-build-test` - **Method:** POST - **Purpose:** Receives push events from Gitea ### 2. Filter OpenHands Commits - **Type:** Code Node - **Purpose:** Detects commits made by OpenHands and skips them to prevent infinite loop - **Logic:** ```javascript if (commitMsg.toLowerCase().includes('openhands')) { return { skip: true, reason: 'OpenHands commit detected' }; } ``` ### 3. Should Skip? - **Type:** IF Node - **Condition:** `skip === true` - **Branches:** - TRUE → Commit Skipped (exit workflow) - FALSE → Prepare Build Task (continue) ### 4. Prepare Build Task - **Type:** Code Node - **Purpose:** - Increments retry counter using `$getWorkflowStaticData('global')` - Checks if max retries (3) exceeded - Builds task message with error feedback (if retry) - **Retry Logic:** ```javascript staticData.retry_count = (staticData.retry_count || 0) + 1; if (retryCount >= 3) { return { action: 'FAIL', status: 'FAILED' }; } ``` ### 5. Execute OpenHands - **Type:** SSH Node - **Command:** ```bash sh /home/bam/openhands-sdk-wrapper-sh.sh "" "" ``` - **Purpose:** Runs OpenHands SDK to build/test the project ### 6. Analyze Build Result - **Type:** Code Node - **Purpose:** Determines if build succeeded or failed - **Success Indicators:** - Exit code = 0 - Contains "passing", "✓", "PASS" - Contains "success" or "build complete" - **Failure Indicators:** - Exit code ≠ 0 - Contains "failing", "✗", "FAIL" - Contains "error" in stderr ### 7. Build Success? - **Type:** IF Node - **Condition:** `build_result.status === 'SUCCESS'` - **Branches:** - TRUE → Handle Success - FALSE → Handle Failure ### 8. Handle Success - **Type:** Code Node - **Purpose:** - Formats success message - Resets retry counter to 0 - Returns completion status - **Output:** ```javascript { status: 'SUCCESS', action: 'COMPLETED', message: '✅ BUILD SUCCESSFUL', retry_count: X, build_result: {...} } ``` ### 9. Update Gitea Success - **Type:** SSH Node - **Purpose:** Updates commit status in Gitea - **API Call:** ```bash curl -X POST "https://git.oky.sh/api/v1/repos/{owner}/{repo}/statuses/{sha}" \ -H "Authorization: token {GITEA_TOKEN}" \ -H "Content-Type: application/json" \ -d "{\"state\": \"success\", \"description\": \"Build successful after X attempt(s)\"}" ``` ### 10. Handle Failure - **Type:** Code Node - **Purpose:** - Formats failure message with error details - Calculates remaining retry attempts - Determines if should retry or give up - **Logic:** ```javascript const remaining = max_retries - retry_count; const willRetry = remaining > 0; return { action: willRetry ? 'RETRY' : 'GIVE_UP', will_retry: willRetry }; ``` ### 11. Get Token - **Type:** SSH Node - **Purpose:** Reads Gitea API token from `/home/bam/.gitea_api_token` ### 12. Commit Skipped - **Type:** Code Node - **Purpose:** Handles skipped OpenHands commits - **Output:** ```javascript { status: 'SKIPPED', message: 'OpenHands commit - skipped to prevent loop' } ``` ### 13. Respond - **Type:** Respond to Webhook - **Purpose:** Returns final response to webhook caller --- ## 🔁 Retry Loop Flow ### On Failure (retry_count < 3): ``` Handle Failure → Prepare Build Task → Execute OpenHands → [LOOP] ``` **Task Message on Retry:** ``` 🔄 BUILD RETRY - Attempt 2/3 Previous build FAILED with errors: [ERROR_DETAILS] Please fix these issues and rebuild the project in /home/bam/claude/[repo] Steps: 1. Analyze the errors above 2. Fix the code 3. Run tests (npm test or appropriate command) 4. If tests pass, commit with message: "OpenHands: Build successful" ``` ### On Max Retries (retry_count >= 3): ``` Handle Failure → Respond with GIVE_UP status ``` --- ## 🚀 How to Use ### Step 1: Developer Pushes Code ```bash cd /path/to/repo git add . git commit -m "Add new feature" git push origin main ``` ### Step 2: Webhook Triggered - Gitea sends POST to `https://n8n.oky.sh/webhook/openhands-build-test` - Workflow starts processing ### Step 3: OpenHands Builds - Executes in project directory - Runs build commands (npm install, npm test, etc.) - Commits fixes with message: "OpenHands: Build successful" ### Step 4: Loop Prevention - If OpenHands commits changes, workflow skips it (no infinite loop) - Only processes commits from developers ### Step 5: Status Updates - **Success:** Gitea commit status = ✅ success - **Failure:** After 3 attempts, status = ❌ failure --- ## 📝 Testing ### Manual Test ```bash curl -X POST https://n8n.oky.sh/webhook/openhands-build-test \ -H "Content-Type: application/json" \ -d '{ "repository": { "name": "phase3-test", "full_name": "gitadmin/phase3-test" }, "ref": "refs/heads/main", "after": "abc123", "commits": [{"message": "Test commit"}] }' ``` ### Real Repository Test 1. Make changes to `/home/bam/claude/phase3-test/` 2. Commit with message: "Test build" 3. Push to Gitea 4. Watch workflow execute 5. Check logs in `/home/bam/claude/phase3-test/openhands-task.log` --- ## 🔐 Configuration ### Required Files - **OpenHands SDK:** `/tmp/software-agent-sdk` - **Wrapper Script:** `/home/bam/openhands-sdk-wrapper-sh.sh` - **Gitea Token:** `/home/bam/.gitea_api_token` - **SSH Key:** `/home/bam/.ssh/n8n_key` ### Environment Variables - OpenHands API keys in `/home/bam/openhands/.env` - MiniMax API key configured - DeepSeek API key configured --- ## 📊 Logging ### Log Files - **Task Log:** `/home/bam/claude/phase3-test/openhands-task.log` (clean summary) - **Full Log:** `/home/bam/claude/phase3-test/openhands-full.log` (detailed) ### Log Contents **openhands-task.log:** ``` ======================================== OpenHands Task Summary: Tue Dec 2 02:30:13 PM UTC 2025 ======================================== TASK TO EXECUTE: [Task description] FILES CREATED/MODIFIED: [File operations] COMMANDS EXECUTED: [Commands run] RESULT: SUCCESS ``` --- ## ⚙️ Workflow Settings - **Execution Order:** v1 - **Caller Policy:** workflowsFromSameOwner - **Available in MCP:** false - **Active:** true --- ## 🔧 Troubleshooting ### Issue: Workflow Not Triggered - Check Gitea webhook configuration - Verify webhook URL is correct - Check n8n logs for errors ### Issue: OpenHands Not Creating Files - Verify workspace directory exists - Check SSH credentials - Review OpenHands logs ### Issue: Infinite Loop - Ensure commit messages contain "OpenHands" when committing - Check filter logic is working ### Issue: Gitea Status Not Updated - Verify Gitea API token is valid - Check token permissions - Ensure token is in `/home/bam/.gitea_api_token` --- ## 📈 Monitoring ### Check Workflow Status ```bash # List workflows curl -s https://n8n.oky.sh/api/v1/workflows \ -H "X-N8N-API-KEY: $(cat /home/bam/.n8n_api_key)" \ | jq '.data[] | select(.id=="EG9SCUWgbkdtr8Gm") | {name, active, updatedAt}' # Check execution history curl -s https://n8n.oky.sh/api/v1/workflow-runs?workflowId=EG9SCUWgbkdtr8Gm \ -H "X-N8N-API-KEY: $(cat /home/bam/.n8n_api_key)" ``` ### View Logs ```bash # Task log tail -f /home/bam/claude/phase3-test/openhands-task.log # Full log tail -f /home/bam/claude/phase3-test/openhands-full.log ``` --- ## ✅ Success Criteria - [x] Workflow created and activated - [x] Loop prevention working (skips OpenHands commits) - [x] Retry logic implemented (max 3 attempts) - [x] Error feedback provided to OpenHands - [x] Gitea status updates working - [x] Logging system operational - [x] End-to-end test passing --- ## 🎉 Conclusion The Phase 3 Build Test Workflow is now fully operational! It provides autonomous build/test capabilities similar to agent.minimax.io, with proper loop prevention and retry logic. **Key Features:** - Automatic build and test execution - Intelligent retry with error feedback - Loop prevention for OpenHands commits - Gitea commit status integration - Comprehensive logging - Max 3 retry attempts to prevent infinite loops **Next Steps:** 1. Test with real repository changes 2. Monitor workflow executions 3. Adjust build commands as needed for different project types --- **Created:** 2025-12-02 **Status:** ✅ Production Ready **Documentation Version:** 1.0