feat: provide available GitHub labels to AI reviewer #27
Workflow file for this run
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: AI Code Reviewer | |
| on: | |
| pull_request: | |
| types: [labeled] | |
| jobs: | |
| comprehensive-review: | |
| name: 🤖 AI Code Review | |
| runs-on: ubuntu-latest | |
| if: github.event.action == 'labeled' && github.event.label.name == 'ai_code_review' | |
| permissions: | |
| contents: read | |
| pull-requests: write | |
| issues: write | |
| steps: | |
| - name: Checkout repository | |
| uses: actions/checkout@v5 | |
| with: | |
| fetch-depth: 0 | |
| - name: Install dependencies | |
| run: | | |
| sudo apt-get update | |
| sudo apt-get install -y jq | |
| - name: Get PR diff | |
| run: | | |
| # Fetch the base branch (works for any target branch, not just main) | |
| git fetch origin ${{ github.event.pull_request.base.ref }} | |
| git diff origin/${{ github.event.pull_request.base.ref }}...HEAD --no-color > diff.txt | |
| - name: AI Code Review | |
| env: | |
| GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
| OPENROUTER_API_KEY: ${{ secrets.OPENROUTER_API_KEY }} | |
| AI_MODEL: ${{ vars.AI_MODEL || 'z-ai/glm-4.6' }} | |
| AI_TEMPERATURE: ${{ vars.AI_TEMPERATURE || '0.1' }} | |
| AI_MAX_TOKENS: ${{ vars.AI_MAX_TOKENS || '2000' }} | |
| MAX_DIFF_SIZE: ${{ vars.MAX_DIFF_SIZE || '800000' }} | |
| EXCLUDE_FILE_PATTERNS: ${{ vars.EXCLUDE_FILE_PATTERNS || '*.lock,*.min.js,*.min.css,package-lock.json,yarn.lock' }} | |
| PR_NUMBER: ${{ github.event.pull_request.number }} | |
| REPO_FULL_NAME: ${{ github.repository }} | |
| FAIL_ON_REQUESTED_CHANGES: ${{ vars.FAIL_ON_REQUESTED_CHANGES || 'false' }} | |
| DEBUG_MODE: ${{ vars.DEBUG_MODE || 'false' }} | |
| run: | | |
| # Run the AI reviewer and save response to file | |
| echo "Running AI code review..." | |
| AI_RESPONSE=$(cat diff.txt | bash ai-reviewer.sh) | |
| # Save response for debugging (only in debug mode) | |
| if [ "$DEBUG_MODE" = "true" ]; then | |
| echo "Debug: AI response saved to ai_response.txt" | |
| echo "$AI_RESPONSE" > ai_response.txt | |
| fi | |
| # Check if AI_RESPONSE is empty | |
| if [ -z "$AI_RESPONSE" ]; then | |
| echo "❌ AI response is empty" | |
| exit 1 | |
| fi | |
| # Parse JSON response | |
| if ! echo "$AI_RESPONSE" | jq . >/dev/null 2>&1; then | |
| echo "⚠️ AI response is not valid JSON. Cannot process review." | |
| # Don't post raw response as it may contain sensitive data | |
| echo "AI response could not be processed. Please check the workflow logs." | gh pr comment ${{ github.event.pull_request.number }} --repo ${{ github.repository }} -F - | |
| exit 1 | |
| fi | |
| # Extract fields from JSON | |
| REVIEW=$(echo "$AI_RESPONSE" | jq -r '.review // "No review provided"') | |
| DECISION=$(echo "$AI_RESPONSE" | jq -r '.fail_pass_workflow // "uncertain"') | |
| LABELS=$(echo "$AI_RESPONSE" | jq -r '.labels_added[]? // empty') | |
| # Post the review as PR comment | |
| echo "$REVIEW" | gh pr comment ${{ github.event.pull_request.number }} --repo ${{ github.repository }} -F - | |
| # Add labels to PR | |
| echo "Labels to add: $LABELS" | |
| for label in $LABELS; do | |
| echo "Adding label: $label" | |
| if gh label create "$label" --color "0366d6" --description "Auto-created by AI reviewer" 2>/dev/null; then | |
| echo "Created new label: $label" | |
| else | |
| echo "Label already exists: $label" | |
| fi | |
| if gh issue edit ${{ github.event.pull_request.number }} --add-label "$label" 2>/dev/null; then | |
| echo "Successfully added label: $label" | |
| else | |
| echo "Failed to add label: $label" | |
| fi | |
| done | |
| # Handle workflow decision | |
| echo "AI decision: $DECISION" | |
| if [ "$FAIL_ON_REQUESTED_CHANGES" = "true" ] && [ "$DECISION" = "fail" ]; then | |
| echo "❌ AI requested changes and FAIL_ON_REQUESTED_CHANGES is enabled. Failing workflow." | |
| exit 1 | |
| fi | |
| echo "✅ AI review completed successfully" | |
| # Remove the ai_code_review label to make re-triggering easier | |
| echo "Removing ai_code_review label to allow easy re-triggering" | |
| if gh issue edit ${{ github.event.pull_request.number }} --remove-label "ai_code_review" 2>/dev/null; then | |
| echo "Successfully removed ai_code_review label" | |
| else | |
| echo "Failed to remove ai_code_review label (may have been already removed)" | |
| fi | |
| - name: Cleanup | |
| if: always() | |
| run: | | |
| rm -f diff.txt | |
| # Only remove ai_response.txt if it exists (only created in debug mode) | |
| if [ -f "ai_response.txt" ]; then | |
| rm -f ai_response.txt | |
| fi |