396 lines
9.3 KiB
Markdown
396 lines
9.3 KiB
Markdown
# 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 "<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:**
|
|
```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
|