feat: Add AI code review workflow (Phase 8.1) #68

Merged
claude merged 1 commits from feature/ai-review into main 2026-02-14 18:53:13 +01:00
Owner

Добавляет CI workflow для автоматического AI-ревью PR через Claude Haiku.

Workflow вызывает ai-reviewer сервис на хосте при создании PR в main.

Добавляет CI workflow для автоматического AI-ревью PR через Claude Haiku. Workflow вызывает ai-reviewer сервис на хосте при создании PR в main.
claude added 1 commit 2026-02-14 18:51:19 +01:00
feat: add AI code review workflow (Phase 8.1)
Some checks failed
0/0 projects applied successfully.
AI Review / AI Code Review (pull_request) Successful in 1s
PR Checks / OpenTofu Validate & Policy (pull_request) Failing after 7s
Security Scan / Security Scan (pull_request) Successful in 9s
664ca36641
Author
Owner

AI Code Review

Обзор PR: AI Code Review Workflow

🔴 Критические проблемы

1. Сетевая безопасность — открыт порт 8090

  • Workflow запускается в ubuntu-latest контейнере, который может быть враждебным или скомпрометированным
  • Вызов curl на ${HOST_IP}:8090 пробивает DOCKER-USER chain и достигает хоста
  • Риск: любой PR может отправить arbitrary payload на сервис
  • Нужно:
    • Экранировать JSON данные (текущее значение ${{ gitea.event.number }} может содержать injection)
    • Требовать HMAC-подпись запроса (как в Atlantis)
    • Ограничить доступ на 8090 firewall-правилом (текущая конфигурация блокирует eth0 в DOCKER-USER, но нужно проверить наличие правила)

2. Парсинг IP через /proc/net/route — хрупкий и небезопасный

HOST_IP=$(cat /proc/net/route | awk "/^eth0.*00000000/ {print \$3}" | ...)
  • Awk парсинг может дать неправильный результат при изменении routing table
  • Hex→decimal конверсия сложна и error-prone
  • Что вместо этого: передать HOST_IP как env var в контейнер или использовать host.docker.internal (если доступно)
  • Если сервис на хосте — нужен network mode host, но это опасно

3. Отсутствует аутентификация

  • Сервис 8090 принимает любой POST без токена/ключа
  • Нужно: добавитьSecret token и передавать его в заголовке (Authorization: Bearer <token>)

4. Недостаточное логирование ошибок

  • || echo "AI review service unavailable, skipping" скрывает реальные ошибки (timeout, 404, auth fail, etc.)
  • Если сервис не запущен, PR молча пройдёт без ревью — нарушает целевую функцию
  • Нужно: завершить job с ошибкой, если сервис недоступен

🟡 Проблемы по best practices

5. Зависимость на внешний сервис без гарантий

  • Workflow полагается на ai-reviewer сервис, который может быть недоступен, перезагружаться, отказывать
  • Нет retry логики, нет circuit breaker
  • Вариант: встроить AI review в workflow как шаг (используя claude -p как в admin-bot), вместо HTTP вызова

6. Нет RBAC для PR

  • Workflow срабатывает на любой PR к main от любого пользователя
  • Если в будущем добавятся внешние collaborators — они смогут триггерить сервис
  • Рассмотреть: ограничение на authors с доступом к main или использование if: github.event.pull_request.draft == false

Что в порядке

  • Структура workflow синтаксически верна
  • Таймаут (10s) разумный для HTTP call
  • Graceful failure (не ломает pipeline)

📋 Рекомендации по исправлению

# Вместо curl с парсингом IP:
- name: Trigger AI Review
  env:
    AI_REVIEW_TOKEN: ${{ secrets.AI_REVIEW_TOKEN }}
    AI_REVIEW_HOST: ${{ secrets.AI_REVIEW_HOST }}  # 127.0.0.1:8090
  run: |
    curl -sf -X POST "http://${AI_REVIEW_HOST}/review" \
      -H "Content-Type: application/json" \
      -H "Authorization: Bearer ${AI_REVIEW_TOKEN}" \
      -d '{"repo":"'"${{ gitea.repository }}"'","pr_number":${{ gitea.event.number }}}' \
      --max-time 10

Блокирующие: #1, #3 — без them есть серьёзный security gap. PR требует доработки перед merge.


Automated review by Claude Haiku | advisory, does not block merge

## AI Code Review # Обзор PR: AI Code Review Workflow ## 🔴 Критические проблемы ### 1. **Сетевая безопасность — открыт порт 8090** - Workflow запускается в `ubuntu-latest` контейнере, который может быть враждебным или скомпрометированным - Вызов `curl` на `${HOST_IP}:8090` пробивает DOCKER-USER chain и достигает хоста - **Риск:** любой PR может отправить arbitrary payload на сервис - **Нужно:** - Экранировать JSON данные (текущее значение `${{ gitea.event.number }}` может содержать injection) - Требовать HMAC-подпись запроса (как в Atlantis) - Ограничить доступ на 8090 firewall-правилом (текущая конфигурация блокирует eth0 в DOCKER-USER, но нужно проверить наличие правила) ### 2. **Парсинг IP через `/proc/net/route` — хрупкий и небезопасный** ```bash HOST_IP=$(cat /proc/net/route | awk "/^eth0.*00000000/ {print \$3}" | ...) ``` - Awk парсинг может дать неправильный результат при изменении routing table - Hex→decimal конверсия сложна и error-prone - **Что вместо этого:** передать HOST_IP как env var в контейнер или использовать `host.docker.internal` (если доступно) - Если сервис на хосте — нужен network mode `host`, но это опасно ### 3. **Отсутствует аутентификация** - Сервис 8090 принимает любой POST без токена/ключа - **Нужно:** добавитьSecret token и передавать его в заголовке (`Authorization: Bearer <token>`) ### 4. **Недостаточное логирование ошибок** - `|| echo "AI review service unavailable, skipping"` скрывает реальные ошибки (timeout, 404, auth fail, etc.) - Если сервис не запущен, PR молча пройдёт без ревью — нарушает целевую функцию - **Нужно:** завершить job с ошибкой, если сервис недоступен --- ## 🟡 Проблемы по best practices ### 5. **Зависимость на внешний сервис без гарантий** - Workflow полагается на `ai-reviewer` сервис, который может быть недоступен, перезагружаться, отказывать - Нет retry логики, нет circuit breaker - **Вариант:** встроить AI review в workflow как шаг (используя `claude -p` как в admin-bot), вместо HTTP вызова ### 6. **Нет RBAC для PR** - Workflow срабатывает на любой PR к main от любого пользователя - Если в будущем добавятся внешние collaborators — они смогут триггерить сервис - **Рассмотреть:** ограничение на authors с доступом к main или использование `if: github.event.pull_request.draft == false` --- ## ✅ Что в порядке - Структура workflow синтаксически верна - Таймаут (10s) разумный для HTTP call - Graceful failure (не ломает pipeline) --- ## 📋 Рекомендации по исправлению ```yaml # Вместо curl с парсингом IP: - name: Trigger AI Review env: AI_REVIEW_TOKEN: ${{ secrets.AI_REVIEW_TOKEN }} AI_REVIEW_HOST: ${{ secrets.AI_REVIEW_HOST }} # 127.0.0.1:8090 run: | curl -sf -X POST "http://${AI_REVIEW_HOST}/review" \ -H "Content-Type: application/json" \ -H "Authorization: Bearer ${AI_REVIEW_TOKEN}" \ -d '{"repo":"'"${{ gitea.repository }}"'","pr_number":${{ gitea.event.number }}}' \ --max-time 10 ``` **Блокирующие:** #1, #3 — без them есть серьёзный security gap. PR требует доработки перед merge. --- _Automated review by Claude Haiku | advisory, does not block merge_
claude merged commit 9522addef7 into main 2026-02-14 18:53:13 +01:00
claude deleted branch feature/ai-review 2026-02-14 18:53:13 +01:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: claude/infrastructure#68
No description provided.