Модуль 6.2 · Урок 4
CI/CD и мониторинг автономных агентов
Содержание
- Цель
- Шаг 3: CI/CD с AI
- AI Code Review
- Анализ упавших тестов
- Автообновление документации
- Шаг 4: Мультиагентная настройка
- AGENTS.md (для сред, поддерживающих субагентов)
- Для LangChain/CrewAI/AutoGen
- Шаг 5: Чек-лист безопасности
- Файловая система
- Git
- CI/CD
- Мониторинг
- «Один день с автономным агентом»
- Итоговая структура проекта
- Финальный чек-лист
- Что дальше
Цель
В прошлом уроке мы создали PROJECT.md и систему памяти. Теперь настроим все остальное:
- AI-ревью каждого PR
- Автоматический анализ упавших тестов
- Автообновление документации
- Мультиагентную работу
- Чек-лист безопасности
После этого урока у вас будет полностью настроенная автономная рабочая среда.
Шаг 3: CI/CD с AI
AI Code Review
Настройка AI-ревьюера подробно разобрана в уроке CI/CD руками агента — готовые конфиги для Claude Code Action и PR-Agent. Используйте те YAML-файлы.
Анализ упавших тестов
Этот workflow срабатывает автоматически, когда CI-тесты падают. Он забирает лог ошибки и отправляет в LLM для анализа. На практике агент часто находит причину быстрее человека, потому что видит полный stacktrace без «замыливания глаз».
# .github/workflows/analyze-failures.yml
name: Analyze Test Failures
on:
workflow_run:
workflows: ["Tests"]
types: [completed]
jobs:
analyze:
if: github.event.workflow_run.conclusion == 'failure'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Get logs
run: gh run view ${{ github.event.workflow_run.id }} --log-failed > failure.log
- name: Analyze
run: |
# Универсально: отправьте лог в любой LLM
cat failure.log | your-ai-tool analyze \
--prompt "Проанализируй причину падения тестов, предложи исправление"
Замените your-ai-tool analyze на конкретный инструмент: Claude Code CLI, Codex CLI или прямой вызов API. Важно: результат анализа лучше записывать в комментарий к PR, а не в отдельный issue, чтобы контекст не терялся.
Автообновление документации
Документация, которая расходится с кодом, хуже отсутствующей — она вводит в заблуждение. Workflow ниже отслеживает изменения в файлах роутов и запускает проверку актуальности документации.
# .github/workflows/auto-docs.yml
name: Update Docs
on:
push:
branches: [main]
paths: ['src/**']
jobs:
update:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Check if docs need update
run: |
CHANGED=$(git diff HEAD~1 --name-only src/modules/*/routes.py | wc -l)
if [ "$CHANGED" -gt 0 ]; then
echo "API routes changed -- checking docs"
# Агент проверяет соответствие docs/ актуальному коду
# и создает PR при необходимости
fi
Шаг 4: Мультиагентная настройка
AGENTS.md (для сред, поддерживающих субагентов)
Файл AGENTS.md описывает роли субагентов — специализированных помощников, каждый со своими правами и ограничениями. Принцип минимальных привилегий: ревьюер не может менять код, а кодер не может деплоить. Это работает в Claude Code (нативная поддержка), а в других средах можно реализовать через отдельные конфиги.
# AGENTS.md
## code-writer
Роль: Пишет код по спецификации
Инструменты: чтение/запись файлов в src/, запуск тестов
Ограничения: не менять конфиги, не удалять файлы, не трогать .env
Модель: быстрая (sonnet / gpt-4o / gemini-flash)
## code-reviewer
Роль: Ревью кода на баги, безопасность, стиль
Инструменты: только чтение файлов
Ограничения: не вносить изменения, только комментарии
Модель: мощная (opus / gpt-4o / gemini-pro)
## ops-monitor
Роль: Мониторинг CI/CD, анализ логов
Инструменты: чтение логов, GitHub API (read-only)
Ограничения: не менять код, не деплоить
Модель: средняя (sonnet / gpt-4o-mini)
Для LangChain/CrewAI/AutoGen
Если вы строите мультиагентную систему программно, те же роли описываются в коде. Обратите внимание на max_iter — это страховка от зацикливания: без лимита агент может бесконечно «улучшать» код. Reviewer получает только FileRead() — физически не может внести изменения, даже если prompt injection попытается его заставить.
from crewai import Agent, Crew, Task
writer = Agent(
role='Code Writer',
goal='Написать чистый код по спецификации',
tools=[FileWrite(), RunTests()],
llm='gpt-4o',
max_iter=5 # Лимит попыток
)
reviewer = Agent(
role='Code Reviewer',
goal='Найти баги и проблемы',
tools=[FileRead()], # Только чтение
llm='claude-sonnet',
max_iter=3
)
crew = Crew(
agents=[writer, reviewer],
tasks=[
Task(description="Реализуй endpoint...", agent=writer),
Task(description="Проведи ревью...", agent=reviewer),
],
verbose=True
)
Шаг 5: Чек-лист безопасности
Файловая система
.cursorignore/.gitignoreсодержит:.env,secrets/,*.key,*.pem- Агент работает только в директории проекта
- Production-конфиги недоступны агенту
Git
- Branch protection на main: требуется PR + approve
- Агент коммитит только в feature-ветки
- Подпись коммитов для различения человек/агент
CI/CD
- AI-ревьюер имеет permissions:
read+pull-requests: write - Секреты НЕ доступны в контексте AI-ревьюера
- Есть alert на >20 файлов изменений от агента
Мониторинг
- Логируются все действия агента
- Есть dashboard с метриками: кол-во PR, изменений, тестов
- Алерт при аномальной активности
«Один день с автономным агентом»
08:00 Вы приходите на работу
-> Агент за ночь:
- Отсортировал 5 новых issues (лейблы + приоритеты)
- Обнаружил уязвимость в зависимости, создал issue
- Проверил, что ночной деплой прошел без ошибок
09:00 Вы начинаете кодить
-> Агент в IDE:
- Предлагает дополнения с учетом PROJECT.md
- Помнит решение про Valkey из .memory/decisions.md
- Автоматически создает тесты для нового кода
11:00 Вы создаете PR
-> Агент в CI:
- Автоматический ревью через 2 минуты
- Нашел потенциальный N+1 запрос, оставил комментарий
- Тесты зеленые
- Документация обновлена автоматически
14:00 Тесты на staging упали
-> Агент:
- Проанализировал лог ошибки
- Определил: несовместимость после обновления библиотеки
- Создал PR с фиксом
- Вам остается только approve
17:00 Вы уходите
-> Агент на дежурстве:
- Мониторит логи production
- Если аномалия -- отправит alert в Slack/Telegram
- Новые issues будут отсортированы к утру
Итоговая структура проекта
my-project/
├── PROJECT.md # Единый источник правды
├── CLAUDE.md # -> сгенерирован из PROJECT.md
├── .cursorrules # -> сгенерирован из PROJECT.md
├── .github/
│ ├── copilot-instructions.md # -> сгенерирован из PROJECT.md
│ └── workflows/
│ ├── ai-review.yml # AI code review
│ ├── auto-docs.yml # Автообновление документации
│ └── analyze-failures.yml # Анализ упавших тестов
├── AGENTS.md # Описание субагентов
├── .memory/
│ ├── decisions.md # Архитектурные решения
│ ├── learnings.md # Накопленные знания
│ └── patterns.md # Паттерны проекта
├── .cursorignore # Конфиденциальные файлы
├── mcp-config.json # MCP-серверы (если используются)
├── scripts/
│ └── generate-agent-configs.sh # Генерация конфигов
├── src/ # Код проекта
└── tests/ # Тесты
Финальный чек-лист
- Настройте AI code review для одного из ваших репозиториев (Claude Code Action или PR-Agent)
- Создайте AGENTS.md с описанием минимум 2 субагентов
- Пройдите чек-лист безопасности — отметьте статус каждого пункта
- Проведите «учебный день» с автономным агентом: создайте PR, проверьте качество AI-ревью, настройте алерт
Что дальше
Вы настроили автономную среду. Теперь важно:
- Мониторить первую неделю — смотрите все комментарии AI-ревьюера. Они адекватны? Настройте промпты.
- Обновлять .memory/ — после каждого значимого решения добавляйте запись.
- Пересматривать раз в месяц — PROJECT.md устарел? Обновите.
- Расширять постепенно — начните с review-only, потом добавьте auto-docs, потом auto-fix.