- Vue 67.2%
- JavaScript 21.2%
- CSS 10.4%
- TypeScript 1.2%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
Co-authored-by: ci-bot <cibot@local.host> Reviewed-on: #1 Co-authored-by: Ilya_Work_pc <massoncheg@gmail.com> Co-committed-by: Ilya_Work_pc <massoncheg@gmail.com> |
||
| .vitepress | ||
| .yarn | ||
| config | ||
| docs | ||
| notes | ||
| scripts | ||
| src | ||
| .gitignore | ||
| .prettierignore | ||
| .prettierrc | ||
| .stylelint.json | ||
| .yarnrc.yml | ||
| env.d.ts | ||
| eslint-report.json | ||
| eslint.config.mjs | ||
| package.json | ||
| README.md | ||
| tsconfig.json | ||
| yarn.lock | ||
Текущий алгоритм CI/CD на русском Общая архитектура Система состоит из 4 этапов (jobs), которые выполняются последовательно при каждом пуше в ветку main: Git push → Check → Fix (если есть ошибки) → Deploy (если ошибки исправлены)
1️⃣ Этап Check (Проверка)
Цель: Анализировать код на наличие ошибок и вычислить метрики для принятия решений. Шаги:
- Checkout кода
- Клонирует репозиторий в контейнер
clean: false- не удаляет файлы для ускорения
- Установка зависимостей
yarn install- устанавливает все npm пакеты
- Запуск ESLint
yarn eslint --format json > eslint-report.json- Генерирует детальный отчет в формате JSON со всеми ошибками
|| true- не падает, если ошибок нет
- Анализ отчета (анализ-скрипт)
- Скрипт
scripts/analyze-eslint.mjsпарсит JSON-отчет - Вычисляет:
has-errors- есть ли вообще ошибки (true/false)fixable-error-count- сколько ошибок можно автоматически исправитьtotal-error-count- общее количество ошибокimport-errors- количество ошибок импорта (недостающие пакеты)is-fully-fixable- все ли ошибки можно исправить автоматическиneeds-package-install- нужно ли устанавливать пакеты
- Скрипт
- Загрузка артефакта
- Сохранный отчет
eslint-report.jsonзагружается как артефакт - Позволяет получить отчет в следующих этапах Результат: Output-переменные для использования в следующем job
- Сохранный отчет
2️⃣ Этап Fix (Исправление) - условный
Цель: Автоматически исправить все найденные ошибки
Условие запуска: if: needs.check.outputs.has-errors == "true"
(Запускается ТОЛЬКО если есть ошибки)
Шаги:
- Checkout кода
- Проверка с fetch-depth: 0 (полная история коммитов)
- Установка зависимостей
- yarn install
- Конфигурация Git
- Имя пользователя: runner-auto-fix
- Email: runner@forgejo
- Настройка Git remote
- URL: https://FORGEJO_TOKEN@forgejo/repo.git
- Использует секрет для авторизации
- Загрузка отчета ESLint
- Скачивает артефакт из этапа check
- Исправление ESLint
- yarn eslint --fix . - применяет автозамену ко всем исправимым ошибкам
- Создает файлы с исправленным кодом
- Коммит и пуш ESLint изменений
- Проверка: Если есть изменения
- Тегирование: git tag -a "runner-auto-fix-iteration-N" где N = номер рана workflow
- Коммит: fix: runner-auto-fix eslint
- Пуш: git push
- Установка недостающих пакетов (если нужно)
- Условие: if: needs.check.outputs.needs-package-install == 'true'
- Запускает scripts/eslint-auto-fix.mjs
- Скрипт:
- Парсит отчет ESLint
- Находит импорты с ошибками
- Проверяет их в config/allowed-packages.json
- Добавляет в package.json через yarn add
- Коммит и пуш изменений в package.json и yarn.lock
- Исправление Prettier
- yarn prettier --write . - форматирование всех файлов
- Коммит и пуш изменений
- Трекинг итераций (Итерация-контроллер)
- Сравнивает локальный SHA и удаленный SHA
- Проверяет циклическую зависимость
- Максимум 3 итерации (из переменной окружения MAX_FIX_ITERATIONS)
- Если превышен лимит → workflow fails
- Результат: iteration-count передается в output
- Финальная проверка ESLint
- Пересоздает eslint-final-report.json
- Вызывает scripts/analyze-eslint.mjs
- Определяет, остались ли ошибки
- Загрузка финального артефакта - eslint-final-report.json как артефакт Output:
- final-has-errors - остались ли ошибки после всех исправлений
- fix-count - сколько итераций было выполнено
3️⃣ Этап Deploy (Деплой) - условный
Цель: Развернуть приложение на production, если код прошел все проверки
Условие запуска:
if: |
needs.check.outputs.has-errors == "false" ||
(needs.check.outputs.has-errors == "true" &&
needs.fix.outputs.final-has-errors == "false")
Срабатывает если:
- ❌ Ошибок не было изначально, ИЛИ
- ✅ Ошибки были, но все исправлены в fix-этапе Шаги:
- Проверка итераций (если fix job успешен)
- Сравнивает использованные итерации с лимитом
- Если превышен → workflow fails
- Установка зависимостей
- yarn install
- Сборка
- yarn run build - собирает проект
- Деплой на Host FS
- Создает директорию /var/srv/www/имя-репозитория
- Копирует .vitepress/dist/* в целевую директорию
Отмена:
Если условия не выполняются → workflow фейлится, деплой не происходит
🛡️ Безопасные механизмы
- Защита от пустых коммитов if [ -n "$(git status --porcelain)" ]; then
только если есть изменения
fi 2. Ограничение итераций MAX_FIX_ITERATIONS: 3
- Prevent infinite loops
- Если > 3 итераций → workflow fails
- Git-тагирование
- Каждая итерация тегируется как runner-auto-fix-iteration-N
- Пакеты тегируются как runner-auto-fix-deps-N
- Позволяет трекировать историю авто-фиксов
- Качественные коммиты
- fix: runner-auto-fix eslint - точное описание
- Не поверхностные "fix typo" или "update"
- Запись артефактов
- Сохраняются отчеты ESLint на 1 день
- Для отладки и анализа
🔄 Сценарии выполнения
Сценарий 1: Без ошибок (чистый код)
Push → Check: has-errors=false
Fix job: НЕ запускается (нет ошибок)
Deploy job: ← Запускается (has-errors=false) ✓
Сценарий 2: Исправимые ошибки
Push → Check: has-errors=true
Fix job: → ESLint fix → commit+push
→ Prettier fix → commit+push
→ Check снова: has-errors=false
Deploy job: ← Запускается ✓
Сценарий 3: Ошибки импорта (нужны пакеты)
Push → Check: has-errors=true, needs-package-install=true
Fix job: → ESLint fix → commit+push
→ Install deps → commit+push
→ Prettier fix → commit+push
→ Check снова: has-errors=false
Deploy job: ← Запускается ✓
Сценарий 4: Нефиксируемые ошибки
Push → Check: has-errors=true, is-fully-fixable=false
Fix job: → Attempts fix → Check снова: has-errors=true
Deploy job: НЕ запускается ✗
Сценарий 5: Превышение лимита итераций
Push → Check: has-errors=true
Fix job:
Iteration 1 → Check: has-errors=true
Iteration 2 → Check: has-errors=true
Iteration 3 → exceeds MAX_FIX_ITERATIONS
Workflow fails ✗
Deploy job: НЕ запускается
📊 Результаты и артефакты
Артефакты (хранятся 1 день):
eslint-report.json- отчет о первоначальных ошибкахeslint-final-report.json- отчет после авто-фиксов
Git-история:
- Все авто-фиксы помечены тегами
- Можно отследить историю улучшений качества кода
- Полные hash SHA для каждого изменения
Логи workflow:
- Каждая операция имеет понятное сообщение
- Ошибки детально описаны
- Счетчик итераций виден в логах
🔑 Ключевые особенности
- Zero-downtime development - разработчик не ждёт деплоя
- Quality gate - только чистый код попадает в production
- Safety - предотвращение бесконечных циклов
- Traceability - полная история всех исправлений
- Automation - 100% автозапуск без человеческого вмешательства
- Conditional - умная логика (деплоим только если готово) Эта система гарантирует, что в production попадает только качественный, оттестированный код с минимальными ошибками! 🚀 ▣ Plan · z-ai/glm-4.7-flash · 51.9s