Импорт манифестов flatpak-builder#
Приложения для Flathub описываются манифестами flatpak-builder: список модулей, каждый со своими источниками и системой сборки. Собрать такой манифест на Astra Linux напрямую мешают две вещи: другая среда выполнения и то, что многое из перечисленного в манифесте система уже даёт готовыми пакетами.
Команда import-manifest разбирает такой манифест и переносит его на среды Astra. По каждому модулю она решает, откуда его взять: исключить, потому что среда выполнения уже его содержит; поставить deb-пакетом из репозитория; собрать из исходников, как это делает flatpak-builder. Разрешения переносятся из finish-args, источники скачиваются с проверкой контрольных сумм.
Права администратора команде не нужны.
Как это применяется#
Манифест указывается позиционным аргументом. Принимаются оба формата, в которых пишут манифесты flatpak-builder:
aft-app import-manifest org.qbittorrent.qBittorrent.yaml
Команду можно сокращать до import.
Что бы ни было указано дальше, сначала печатается план: сколько модулей всего, сколько собирается из исходников, сколько заменено deb-пакетами, сколько исключено средой. По каждому модулю выводится решение и его причина. План стоит прочитать до сборки: он показывает, где перенос на Astra расходится с исходным манифестом.
Режимы работы#
Режим определяет, что делать после разбора манифеста. Без явного указания
выполняется --plan.
--plan- показать план и выйти. Ничего не скачивается и не собирается.--emit-yaml <файл>- записать манифест в формате AFT. Его можно править вручную и собирать командой build (см. Манифест приложения).--emit-script <файл>- записать самодостаточный скрипт сборки. Скрипт скачивает источники, собирает модули и экспортирует результат; его удобно читать, править и хранить рядом с проектом.--fetch-sources <каталог>- только скачать источники в указанный каталог и сложить рядом файл с контрольными суммами. Сборка не выполняется.--run- выполнить сборку и экспортировать приложение в репозиторий.
Целевое окружение#
Манифест с Flathub ссылается на среду выполнения Flathub. Чтобы собрать приложение на среде Astra, среда переопределяется:
--fb-runtime <id>- среда выполнения вместо указанной в манифесте.--fb-runtime-version <версия>- её версия.--fb-sdk <id>- SDK.--arch <арх>- архитектура (по умолчанию amd64).
Без этих флагов берутся значения из самого манифеста.
aft-app import-manifest app.yaml --plan \
--fb-runtime org.astra.Platform --fb-runtime-version 1.8
Правила разбора модулей#
По умолчанию модуль ищется сначала в среде выполнения, затем среди deb-пакетов репозитория, и только потом собирается из исходников. Поиск идёт по имени модуля и по его известным псевдонимам, а найденное сверяется по версии.
--version-policy <политика>- насколько строго сверять версии. Значениеexactтребует точного совпадения,major-minor(по умолчанию) считает совместимыми версии с одинаковыми старшими двумя числами,geпринимает любую версию не ниже указанной в манифесте.--no-runtime-drop- не исключать модули, которые уже даёт среда.--no-deb- не заменять модули deb-пакетами.--no-probe- не опрашивать ни среду, ни репозиторий: всё собирается из исходников, как это делает flatpak-builder.--force-source <модуль>- всегда собирать указанный модуль из исходников.--force-drop <модуль>- всегда исключать указанный модуль.
Последние два флага повторяемы и принимают имя модуля так, как оно записано в манифесте. Они перекрывают любые правила поиска.
Если версию модуля определить не удалось, а подходящий по имени deb-пакет нашёлся, замена выполняется по имени, и в предупреждениях об этом сообщается отдельно. Такие модули стоит проверить.
Сборка и экспорт#
--output <путь>(или-o) - репозиторий OSTree (по умолчанию./repo).--branch <ветка>- ветка экспорта (по умолчанию stable).--gpg-sign <keyid>(-g) - подписать репозиторий ключом GPG.--gpg-homedir <путь>- каталог GPG.--bsignи--bsign-key <keyid>- подписать исполняемые файлы по ГОСТ (см. Подпись, состав ПО и экспорт приложения).--bundle-sources <каталог>- брать источники из каталога, а не из сети.
Сборка без сети#
Скачивание источников и сборка разносятся на два шага. Сначала источники собираются в каталог на машине с доступом в сеть:
aft-app import-manifest app.yaml --fetch-sources ./src-bundle
Затем каталог переносится на машину сборки, и сборка идёт из него:
aft-app import-manifest app.yaml --run --bundle-sources ./src-bundle
Рядом с источниками сохраняются их контрольные суммы, поэтому подмену файлов при переносе видно.
Что переносится из манифеста#
Разрешения песочницы берутся из finish-args: сокеты, общий доступ, устройства, файловые системы, сохраняемые каталоги, переменные окружения и имена D-Bus, включая запреты. Всё остальное, что встретилось в finish-args, выводится списком нераспознанного и в разрешения не попадает. Такие записи переносятся вручную (см. Разрешения песочницы).
Источники модулей поддержаны в тех видах, что встречаются в манифестах Flathub: архив по ссылке с контрольной суммой, git-репозиторий, отдельный файл, локальный каталог, патчи, команды оболочки и генерируемые скрипты. Архивы и файлы проверяются по контрольной сумме, git-репозиторий выгружается по зафиксированному коммиту, поэтому сборка воспроизводима. Источники прочих видов пропускаются с предупреждением.
Системы сборки модулей распознаются те же, что у flatpak-builder: autotools, cmake, cmake-ninja, meson, qmake и сборка собственными командами. Модуль без указанной системы сборки собирается по схеме autotools. Параметры сборки, переменные окружения и команды после установки переносятся вместе с модулем.
Правила очистки верхнего уровня отрабатывают после сборки всех модулей, при
сборке командой --run и в скрипте из --emit-script.
Тонкости#
Полученный манифест AFT описывает сборку из каталога с исходниками: скачивание и сборка модулей записаны командами, а модули, замещённые deb-пакетами, попадают в дополнительные зависимости. Дальше с ним работают как с обычным манифестом: правят, проверяют командой validate и собирают командой build.
Имя приложения в полученном манифесте выводится из идентификатора, а версия
берётся от последнего модуля, собираемого из исходников. Оба значения имеет
смысл поправить. Правила очистки в манифест AFT не переносятся: если из сборки
нужно что-то вычистить, это задаётся полем files.cleanPatterns или командами
commands.pre-export.
Режим --no-probe полезен как точка отсчёта: он показывает сборку без единой
замены, ровно как её выполнил бы flatpak-builder. Сравнение этого плана с обычным
показывает, что именно взяли на себя среда выполнения и репозиторий Astra.