Своя среда выполнения или расширение

Своя среда выполнения или расширение#

Приложение работает поверх среды выполнения. Если готовые среды Astra не подходят, есть два пути: собрать свою среду инструментом aft-runtime или дополнить готовую расширением через aft-extension. Пути решают разные задачи, и выбирают между ними по тому, кому нужны недостающие файлы.

Что выбрать#

Своя среда нужна, когда набор библиотек отличается принципиально: другая линия дистрибутива, другой набор графических библиотек, свой закрытый состав ПО для изолированного контура. Среда собирается из репозиториев дистрибутива и становится общей основой для всех приложений на ней. Обновление среды обновляет основу сразу всем приложениям, но и требует их проверки.

Расширение нужно, когда к готовой среде не хватает конкретного набора файлов: тулчейн для SDK, кодеки, языковые пакеты, драйверы. Расширение монтируется в объявленную хостом точку и живёт своим циклом обновления, не затрагивая ни среду, ни приложения.

Правило простое. Если недостающее нужно всем приложениям на этой основе - это среда. Если оно нужно части приложений или только при сборке - это расширение.

Своя среда выполнения#

Среда собирается из репозиториев дистрибутива и описывается манифестом aft-runtime. Пакеты делятся на два списка: runtime попадает в саму среду, sdk добавляется только в SDK-вариант:

version: "1.0"
metadata:
  id: ru.example.Platform
  name: "Example Platform"
  version: "1.0"
  branch: "1.0"
  arch: amd64
source:
  type: debootstrap
  debootstrap:
    distribution: 1.8_x86-64
    mirror: https://download.astralinux.ru/astra/stable/1.8_x86-64/repository-main/
    components: [main, contrib, non-free]
    variant: minbase
packages:
  runtime:
    - libgtk-3-0
    - libssl3
  sdk:
    - build-essential
    - cmake
environment:
  LANG: ru_RU.UTF-8
build:
  sdk: true
  sbom: true
  clean-docs: true
export:
  repository: ./repo

Сборка среды меняет систему и требует прав администратора:

sudo aft-runtime build platform.yaml

Флаг build.sdk собирает SDK-вариант рядом со средой: идентификатор получается из идентификатора среды, а пакеты берутся из обоих списков. Приложения собираются на SDK, а работают на среде.

Точки расширения#

Среда объявляет точки, в которые потом можно смонтировать расширения. Точка описывается в секции extensions манифеста среды:

extensions:
  - name: ru.example.Platform.Extension
    version: "1.0"
    directory: lib/extension
    subdirectories: true
    add-ld-path: lib
    no-autodownload: true

Поле directory задаёт каталог монтирования относительно /usr. Каталог должен существовать в самой среде, иначе смонтировать в него не получится. Поле subdirectories разрешает нескольким расширениям встать в подкаталоги одной точки, каждое в свой. Поле no-autodownload оставляет установку расширения на усмотрение пользователя, без него расширение приезжает вместе со средой.

Расширение попадает в точку по совпадению начала имени: ref ru.example.Platform.Extension.codecs встаёт в точку ru.example.Platform.Extension. Имя точки не обязано начинаться с идентификатора среды, поэтому одно расширение может обслуживать несколько сред, если все они объявляют точку с одинаковым именем.

Расширение к готовой среде#

Расширение собирается из тех же источников, что и приложение, но раскладывается не в /app, а в каталог точки. Обязательны идентификатор и расширяемый хост:

version: "1.0"
metadata:
  id: ru.example.Platform.Extension.codecs
  name: "Кодеки"
  version: "1.0"
  branch: "1.0"
  arch: amd64
extends:
  ref: runtime/ru.example.Platform/x86_64/1.0
  directory: lib/extension/codecs
buildRuntime:
  id: ru.example.Platform
  version: "1.0"
  sdk: ru.example.Sdk
source:
  type: repository
  repository:
    package: gstreamer1.0-libav
export:
  repository: ./repo

Секция buildRuntime задаёт среду, относительно которой собрано расширение. По её составу отсекается всё, что в среде уже есть: расширение не дублирует библиотеки хоста. Пакет, который нужен в расширении несмотря на присутствие в среде, перечисляется в dependencies.force.

Ветка расширения должна совпадать со значением version или входить в versions точки расширения хоста. Иначе flatpak не смонтирует расширение, и никакой ошибки при этом не будет: точка просто останется пустой.

Пути внутри расширения не переписываются. Содержимое монтируется в каталог точки, а не в /app, поэтому пакет должен быть пригоден к монтированию как есть либо переразложен правилами layout.