Table of contents
- CI/CD и автоматизация
- 1. Линтинг и статический анализ
- 2. Сборка и публикация Docker-образа
- 3. Генерация Wiki через AI
- Архитектура процесса
- Шаг 1: Упаковка репозитория (Repomix)
- Шаг 2: Генерация структуры и контента (LiteLLM + LLM)
- Шаг 3: Синхронизация с Forgejo Wiki
- Правила генерации контента
- Переменные окружения для Wiki-генерации
- Интеграция с другими модулями
- Устранение неполадок CI/CD
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.
CI/CD и автоматизация
В проекте MinerU MCP Server настроен полноценный цикл непрерывной интеграции и доставки (CI/CD), включающий линтинг кода, сборку Docker-образов с автотестами и автоматическую генерацию технической документации (Wiki) с использованием AI.
Ниже описаны три основных этапа автоматизации: статический анализ, сборка артефактов и генерация знаний.
1. Линтинг и статический анализ
Процесс линтинга запускается автоматически при создании Pull Request в ветку main. Он гарантирует соблюдение стандартов кодирования (PEP 8, ruff) и предотвращает попадание ошибок в основной код.
Конфигурация: .forgejo/workflows/lint.yml
Как это работает:
- Триггер: событие
pull_requestна веткуmain. - Среда: легкий контейнер
python-3.11-slim. - Инструмент: Ruff — быстрый линтер и форматер Python.
- Выход: отчет в формате GitHub Annotations (ошибки подсвечиваются прямо в PR).
# Пример команды из workflow
run: ruff check . --output-format=github
2. Сборка и публикация Docker-образа
Сборка Docker-образа является центральным элементом CI/CD. Она не только создает исполняемый контейнер, но и выполняет unit-тесты непосредственно внутри образа перед его публикацией.
Конфигурация: .forgejo/workflows/ci-cd.yml
Dockerfile: Dockerfile
Триггеры запуска
- Push в
main: Автоматическая сборка образа с тегомlatest. - Push тега
v*: Сборка релизного образа с версией из тега (например,v0.2.5). - Workflow Dispatch: Ручной запуск с возможностью указать кастомный тег.
Этапы пайплайна
- Checkout: Получение исходного кода.
- Docker Buildx: Настройка мультиплатформенной сборки и кэширования.
- Registry Login: Авторизация в Forgejo Container Registry с помощью секрета
REGISTRY_TOKEN. - Version Extraction: Извлечение версии приложения из
pyproject.tomlс помощью встроенного модуляtomllib. - Metadata Generation: Формирование тегов и OCI-лейблов через
docker/metadata-action. - Build & Push:
- Перед сборкой образа выполняется шаг
RUN python -m pytest tests/ -vвнутри Dockerfile. - Если тесты падают (см. раздел Тестирование), сборка прерывается, и образ не публикуется.
- Успешный образ пушится в реестр
git.maydayoffice.kz/maydayoffice/mineru-mcp-server.
- Перед сборкой образа выполняется шаг
3. Генерация Wiki через AI
Уникальная особенность проекта — автоматическое создание и обновление технической документации на основе актуального кода. Этот процесс использует инструменты из отдельного репозитория .ai-tools.
Конфигурация Workflow: .forgejo/workflows/wiki-gen.yml
Скрипт генерации: .ai-tools/wiki-gen/generate_wiki.py
Архитектура процесса
Процесс состоит из трех ключевых этапов, выполняемых последовательно:
Шаг 1: Упаковка репозитория (Repomix)
Скрипт использует инструмент Repomix для создания единого сжатого XML-файла, содержащего структуру директорий и содержимое всех файлов репозитория.
- Это позволяет передать LLM полный контекст проекта без превышения лимитов токенов, связанных с чтением множества отдельных файлов.
- Команда запуска:
npx -y repomix --style xml --compress ...
Шаг 2: Генерация структуры и контента (LiteLLM + LLM)
Используя локальную или облачную LLM (по умолчанию Qwen3.6-27B через прокси LiteLLM), скрипт выполняет два действия:
- Генерация TOC (Table of Contents): LLM анализирует упакованный код и предлагает структуру документации (список страниц, их slug и фокус).
- Параллельная генерация страниц: Для каждой страницы из TOC запускается отдельный запрос к LLM.
- Контекст: Полный XML репозитория + список других страниц для формирования перекрёстных ссылок.
- Инструкция: Написать страницу в Markdown, используя правила оформления ссылок (см. ниже).
- Параллелизм: Используется
threading.Semaphoreдля ограничения одновременных запросов (по умолчанию 4), чтобы не перегрузить LLM-прокси.
Шаг 3: Синхронизация с Forgejo Wiki
Сгенерированные Markdown-файлы копируются в локальный клон Wiki-репозитория и пушатся обратно в Forgejo.
- Проактивная проверка: Перед клонированием скрипт проверяет существование Wiki-репозитория через
git ls-remote. Если Wiki не инициализирована, процесс останавливается с понятной ошибкой (см.test_wiki_init.py). - Git Operations: Клонирование -> Копирование файлов ->
git add->git commit->git push.
Правила генерации контента
Чтобы документация оставалась связанной и полезной, LLM инструктируется следовать строгим правилам при написании Markdown:
-
Перекрёстные ссылки:
- При упоминании темы из другого раздела, необходимо использовать ссылку в формате
[Название](slug). - Доступные слуги жестко заданы в промпте (например,
overview,quick-start,architecture).
- При упоминании темы из другого раздела, необходимо использовать ссылку в формате
-
Ссылки на код:
- При упоминании конкретного файла или функции, необходимо создавать активную ссылку на GitLab/Forgejo.
- Формат файла:
[путь/к/файлу.py](https://git.maydayoffice.kz/maydayoffice/mineru-mcp-server/src/branch/main/путь/к/файлу.py) - Формат функции:
[func_name()](https://git.maydayoffice.kz/maydayoffice/mineru-mcp-server/src/branch/main/путь/к/файлу.py#L42-L58)
-
Запреты:
- Не ссылаться на несуществующие файлы.
- Не галлюнировать номера строк, если они не очевидны из контекста (лучше ссылаться на весь файл или функцию целиком).
Переменные окружения для Wiki-генерации
Для работы пайплайна требуются следующие секреты и переменные (настраиваются в Forgejo Project Settings):
| Переменная | Описание | Источник |
|---|---|---|
WIKI_LLM_MODEL |
Название модели в LiteLLM | Qwen3.6-27B |
WIKI_LITELLM_BASE |
URL LiteLLM API | Секрет CI/CD |
WIKI_LITELLM_API_KEY |
Ключ доступа к LiteLLM | Секрет CI/CD |
WIKI_TOKEN |
Access Token с правами на запись в Wiki | Секрет CI/CD |
AI_TOOLS_TOKEN |
Токен для доступа к репозиторию .ai-tools |
Секрет CI/CD |
Интеграция с другими модулями
- Архитектура: CI/CD пайплайн напрямую зависит от структуры проекта (
src layout) и наличия тестов в директорииtests/. - Тестирование: Результаты выполнения unit-тестов являются блокирующим условием для публикации Docker-образа.
- Конфигурация: Версия приложения, используемая в Docker-лейблах, берется из тех же источников, что и при локальном запуске (
pyproject.toml). - Руководство разработчика: Локальная разработка может имитировать шаги CI (запуск линтера и тестов), но генерация Wiki обычно выполняется только на сервере CI из-за необходимости доступа к LLM и Git-репозиториям.
Устранение неполадок CI/CD
Если пайплайн падает, проверьте следующие аспекты:
- Ошибка линтинга: Посмотрите детали шага
Lint Code. Обычно требуется запуститьruff check . --fixлокально. - Падение тестов при сборке: Ошибка в коде или отсутствии зависимостей. См. раздел Устранение неполадок для частых ошибок (
ImportError,Session ID). - Ошибка авторизации в Registry: Проверьте секрет
REGISTRY_TOKENв настройках репозитория. - Ошибка генерации Wiki:
- Wiki not initialized: Выполните ручной запуск workflow
Test Wiki Initializationиз репозитория.ai-toolsили инициализируйте Wiki вручную через интерфейс Forgejo. - LLM Timeout: Увеличьте таймауты в конфигурации LiteLLM или выберите более быструю модель.
- Wiki not initialized: Выполните ручной запуск workflow