Files
fission-console/doc/descriptions/lint-archive-flow.md

3.2 KiB

Линтинг архива функции — flow (май 2026)

Назначение

Пользователь может загрузить zip-архив с кодом функции. Перед сохранением или после загрузки — архив можно прогнать через линтер, чтобы убедиться что код синтаксически корректен.

Линтинг выполняется на сервере (в Kubernetes), а не на машине пользователя.


Endpoint

POST /console/api/ai/lint-archive
Authorization: X-Auth-Token: <sub>
Content-Type: multipart/form-data

Поле: archive — zip-файл.

Ограничения

  • Максимальный размер zip-архива: 100 KB
  • Максимальный суммарный размер распакованных файлов: 100 KB (защита от zip bomb)
  • При превышении — HTTP 413

Response (200 OK)

{
  "ok": true,
  "results": [
    {"file": "hello.py", "ok": true},
    {"file": "bad.js", "ok": false, "output": "SyntaxError: Unexpected token (2:0)"}
  ]
}

Response (ошибка)

{"error": "архив слишком большой: максимум 100 KB"}

Поддерживаемые языки

Расширение Язык Линтер
.py Python python3 -m py_compile
.js Node.js node --check
.rb Ruby ruby -c
.php PHP php -l

Файлы с другими расширениями (.json, .txt, .md, .yaml и т.д.) — пропускаются. Если в архиве нет ни одного поддерживаемого файла — HTTP 400.


Реализация (backend)

Файл: console/internal/api/lint_archive.go

  1. Архив читается в память (bytes.Buffer), без записи на диск.
  2. zip открывается через archive/zip.Reader из буфера в памяти.
  3. Проверяется суммарный распакованный размер — защита от zip bomb.
  4. Каждый поддерживаемый файл читается из zip в память.
  5. Записывается во временный файл в /dev/shm (RAM-backed tmpfs), fallback — /tmp.
  6. Линтер запускается с таймаутом 10 секунд на файл.
  7. Временный файл удаляется сразу после линтинга.
  8. Путь к tmp-файлу скрыт от пользователя в выводе линтера.

Что ещё нужно сделать

  • UI: кнопка "Проверить архив" рядом с полем загрузки архива в форме создания функции
  • Показывать результаты в UI (список файлов, статус, ошибки)
  • Тесты: scripts/test_fn_archives.sh — добавить вызов lint-archive endpoint