Импорт манифестов 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.