name: AI Reviewer on: pull_request: types: [opened, synchronize, reopened] jobs: review: runs-on: ubuntu-latest # Using an external Ollama server at 192.168.1.92:11434 # Do NOT start a local Ollama service in the runner; the workflow will connect to the external host. steps: - name: Checkout uses: actions/checkout@v4 - name: Set up Python uses: actions/setup-python@v4 with: python-version: '3.11.x' check-latest: true - name: Show Python run: python --version - name: Ensure Python 3.11 present (fallback) run: | set -e echo "Checking python version..." if command -v python >/dev/null 2>&1; then python --version || true fi if python --version 2>&1 | grep -q "Python 3.11"; then echo "Python 3.11 already installed" else echo "Attempting to install python3.11 via apt" sudo apt-get update sudo apt-get install -y python3.11 python3.11-venv python3.11-distutils python3-pip || true if [ -x "/usr/bin/python3.11" ]; then sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.11 1 || true fi python --version || /usr/bin/python3.11 --version || true fi - name: Create venv and install run: | python -m venv venv . venv/bin/activate pip install --upgrade pip pip install -e ".[dev]" - name: Wait for Ollama run: | for i in $(seq 1 30); do if curl -sSf http://192.168.1.92:11434/ >/dev/null 2>&1; then echo "ollama ready" && break fi sleep 1 done - name: (Optional) Pull model into Ollama run: | . venv/bin/activate ollama pull qwen2.5-coder:7b || true - name: Run ai-reviewer env: OLLAMA_HOST: http://192.168.1.92:11434 run: | . venv/bin/activate ai-reviewer review --repo . --base "${{ github.event.pull_request.base.ref }}" --head "${{ github.head_ref }}" --format json > review.json - name: Post PR comment with findings uses: actions/github-script@v6 with: script: | const fs = require('fs'); let body = '{}'; try { body = fs.readFileSync('review.json', 'utf8'); } catch (e) { body = JSON.stringify({ error: 'missing-review', message: String(e) }); } let parsed = {}; try { parsed = JSON.parse(body); } catch (e) { parsed = { error: 'invalid-json', raw: body }; } const findings = parsed.findings || []; const summary = findings.length === 0 ? 'AI Reviewer: no findings.' : `AI Reviewer found ${findings.length} findings.`; const commentBody = `${summary}\n\n
Full JSON\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n` + '```json\n' + JSON.stringify(parsed, null, 2) + '\n```\n
'; await github.rest.issues.createComment({ owner: context.repo.owner, repo: context.repo.repo, issue_number: context.issue.number, body: commentBody, });