qwen-code/integration-tests/concurrent-runner/README.md
tanzhenxin 66259aca29 feat: add git branch support for worktree creation
Add optional branch configuration to specify which git branch to use
for worktree creation.

Features:
- New branch config option to specify base branch (e.g., main, develop)
- Each worktree creates a unique branch based on the specified branch
  (format: branch-run-id)
- If branch is not specified, uses the repository default branch
- Falls back gracefully when branch already exists

Changes:
- Add branch field to RunConfig dataclass
- Update GitWorktreeManager.create() to accept branch parameter
- Create unique branches for each worktree to avoid conflicts
- Update load_config() to parse branch from config
- Update config.example.json with branch option
- Update README.md documentation

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
2026-01-28 12:36:23 +08:00

139 lines
3.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Qwen Concurrent Runner
A Python tool for executing multiple Qwen CLI tasks across different models concurrently using isolated git worktrees.
## Overview
This tool enables you to:
- Run multiple tasks against multiple models in parallel
- Create isolated git worktrees for each execution
- Track execution status in real-time
- Capture and store all outputs (stdout, stderr, and OpenAI logs)
- Resume or analyze results after completion
## Installation
```bash
# Install dependencies
pip install -r requirements.txt
```
## Usage
```bash
python runner.py config.json
```
## Configuration
Create a JSON configuration file (see `config.example.json`):
```json
{
"concurrency": 3,
"yolo": true,
"source_repo": ".",
"worktree_base": "~/.qwen/worktrees",
"outputs_dir": "./outputs",
"results_file": "./results.json",
"tasks": [
{
"id": "code-review",
"name": "Security Code Review",
"prompts": ["Review the codebase for security vulnerabilities."]
}
],
"models": ["claude-3-5-sonnet-20241022", "qwen3-coder-plus"]
}
```
### Configuration Options
| Option | Type | Default | Description |
| --------------- | ------ | ----------------- | --------------------------------------------- |
| `concurrency` | int | 4 | Maximum parallel executions |
| `yolo` | bool | true | Auto-approve all actions |
| `source_repo` | string | . | Source git repository path |
| `branch` | string | null | Git branch to checkout (uses default if null) |
| `worktree_base` | string | ~/.qwen/worktrees | Base directory for git worktrees |
| `outputs_dir` | string | ./outputs | Directory for captured output |
| `results_file` | string | ./results.json | JSON file for run tracking |
| `tasks` | array | [] | List of task definitions |
| `models` | array | [] | List of model identifiers |
### Task Definition
Each task has:
- `id`: Unique identifier
- `name`: Human-readable name
- `prompts`: Array of prompt strings (joined with newlines)
## Output Structure
Each run creates an isolated output directory:
```
outputs/
├── {run_id}/
│ ├── stdout.txt # CLI stdout
│ ├── stderr.txt # CLI stderr
│ └── logs/ # OpenAI API logs
│ └── openai-*.json
```
## results.json
```json
{
"updated_at": "2026-01-28T10:30:00",
"runs": [
{
"run_id": "abc123",
"task_id": "code-review",
"task_name": "Security Code Review",
"model": "qwen3-coder-plus",
"status": "succeeded",
"worktree_path": "~/.qwen/worktrees/run-abc123",
"output_dir": "outputs/abc123",
"logs_dir": "outputs/abc123/logs",
"started_at": "2026-01-28T10:00:00",
"ended_at": "2026-01-28T10:05:00",
"exit_code": 0,
"stdout_file": "outputs/abc123/stdout.txt",
"stderr_file": "outputs/abc123/stderr.txt"
}
]
}
```
## Execution Flow
1. **Generate Matrix**: Create N×M run combinations (tasks × models)
2. **Create Worktree**: Git worktree add from source repo
3. **Initialize**: npm install && npm run build
4. **Execute**: Run qwen CLI with captured output (logs go to run-specific folder)
5. **Cleanup**: Remove git worktree (always executed)
## Status Values
- `queued`: Waiting to start
- `preparing`: Creating git worktree
- `initializing`: Running npm install + build
- `running`: Executing qwen CLI
- `succeeded`: Completed successfully
- `failed`: Error occurred
## Requirements
- Python 3.10+
- Git repository (for worktree operations)
- Node.js and npm (for build step)
- `qwen` CLI in PATH
## Exit Codes
- 0: All runs succeeded
- 1: One or more runs failed
- 130: Interrupted by user (Ctrl+C)