mvp-factory-openhands/PHASE3-BUILD-TEST-WORKFLOW.md

9.3 KiB

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:
    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:
    staticData.retry_count = (staticData.retry_count || 0) + 1;
    if (retryCount >= 3) {
      return { action: 'FAIL', status: 'FAILED' };
    }
    

5. Execute OpenHands

  • Type: SSH Node
  • Command:
    sh /home/bam/openhands-sdk-wrapper-sh.sh "<task>" "<workspace>"
    
  • 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:
    {
      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:
    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:
    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:
    {
      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

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

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

# 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

# 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

  • Workflow created and activated
  • Loop prevention working (skips OpenHands commits)
  • Retry logic implemented (max 3 attempts)
  • Error feedback provided to OpenHands
  • Gitea status updates working
  • Logging system operational
  • 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