Skip to content
Apothem
Справочник

Манифест закрепления зависимостей

Политика объявления зависимостей, охватывающая диапазоны среды выполнения Python, инструменты разработки, lock-файлы инструментов выпуска и утверждённые нижние границы версий для каждой поверхности сборки.

Утверждённая позиция в отношении того, как Apothem объявляет, закрепляет и блокирует зависимости. Аудитория: участники и нижестоящие потребители, которым нужно понять модель воспроизводимости.

Позиция

Apothem — это Python CLI с небольшим набором зависимостей среды выполнения плюс более крупная цепочка инструментов для разработки, аудита, выпуска и документации. Зависимости среды выполнения используют консервативные нижние границы в pyproject.toml; сайт коммитит site/package-lock.json; GitHub Actions закреплены по неизменяемому SHA с комментариями версий и обновляются через Renovate.

КлассОбъявлениеПолитика блокировки
Зависимости среды выполнения Python[project.dependencies] в pyproject.tomlДиапазоны с нижней границей; закоммиченный lock среды выполнения Python отсутствует
Инструменты разработки / безопасностиextras из [project.optional-dependencies]Диапазоны с нижней границей; CI устанавливает текущие совпадающие версии
Инструменты выпускаscripts/release/requirements-build-linux.txtЗаблокированы по хешу для рабочих процессов выпуска; сгенерированы из замыкания инструментов выпуска
Инструменты только для CI.github/workflows/*.ymlpip-инструменты, относящиеся только к рабочему процессу, используют точные закрепления (pip, bandit, pip-audit, pip-licenses, pyinstaller)
Сайт документацииsite/package.jsonsite/package-lock.json закоммичен и потребляется npm ci
GitHub ActionsЗакреплённые по SHA ссылки uses: с комментариями версийRenovate предлагает обновления; исключения несут маркеры action-pinning-exempt:

Утверждение выпуска

ПоверхностьУтверждённое состояниеОбоснование
Зависимости среды выполненияТекущие нижние границы находятся в pyproject.toml [project.dependencies]Текущие стабильные нижние границы утверждены перед выпуском; известных блокеров по CVE среды выполнения нет
Инструменты разработкиТекущие нижние границы находятся в extra dev файла pyproject.tomlПоследние стабильные нижние границы утверждены перед выпуском
Инструменты безопасностиТекущие нижние границы находятся в extra security файла pyproject.tomlТекущие нижние границы сканеров утверждены перед выпуском
Инструменты выпускаЗаблокированное по хешу замыкание находится в scripts/release/requirements-build-linux.txtРабочий процесс выпуска устанавливает с --require-hashes; локальные скрипты требуют, чтобы build уже существовали, вместо молчаливой установки изменяющихся зависимостей
Инструменты документацииТекущие диапазоны находятся в site/package.json; точное разрешение находится в site/package-lock.jsonnpm outdated не возвращает устаревших зависимостей документации после обновления lock-файла
GitHub ActionsСуществующие закрепления по SHA сохранены для текущего выпуска; повторно используемый рабочий процесс SLSA остаётся задокументированным исключением, закреплённым по тегуПовторный запуск публичного CI зелёный; широкие мажорные обновления actions намеренно оставлены PR автоматизации зависимостей, чтобы избежать колебаний поверхности выпуска
Упаковка npmТолько ручной рабочий процесс publish-npm.yml; без автоматического триггера выпускаЕдинственный публичный npm-пакет — @ahmed-g-gad/apothem; публикация выполняется после прохождения готовности к выпуску

Блокировка

Lock-файлы Python генерируются по требованию участником. Они не коммитятся, поскольку замыкание среды выполнения Apothem невелико, CLI поддерживает несколько минорных версий Python, а CI намеренно прорабатывает новейшие совпадающие версии инструментов.

# Astral uv:
uv pip install -e ".[dev,security,release]"
uv pip freeze > requirements.dev.lock

# pip-tools:
pip-compile --extra=dev --extra=security --extra=release -o requirements.dev.lock pyproject.toml

# Plain pip:
pip install -e ".[dev,security,release]"
pip freeze > requirements.dev.lock

Сайт устроен иначе: site/package-lock.json коммитится, а CI использует npm ci, поэтому отрендеренный сайт документации имеет воспроизводимое замыкание Node.

Обоснование

  • Почему диапазонные закрепления для Python? CLI поддерживает широкую матрицу Python, и CI должен выявлять проблемы совместимости с текущими инструментами до того, как с ними столкнутся пользователи.
  • Почему закоммиченный lock Node? Сайт — это развёрнутый статический артефакт; lock-файл даёт детерминированные сборки npm ci для этой публичной поверхности.
  • Почему закреплённые по SHA Actions? Теги изменяемы; SHA неизменяемы. Renovate обновляет закреплённые SHA, а шлюз выпуска фиксирует любую намеренную задержку.

On this page