Авторские статьи

TopAlias в snap.


Не устану повторять что snap идеально подходит стороннему программисту, который хочет представить своё детище широкому кругу пользователей, но ввязываться в геморрой с дичайшей фрагментацией linux экосистемы он, по понятным причинам, не хочет. Ко мне обратился один из таких разработчиков - Сергей Чудаков ака CSRedRat.

Знакомство

Мы сторговались с Сергеем, что помогу с созданием snapcraft.yaml и объяснением по шагам что и почему делалось, но наработки он продолжит сам и сам будет выкладывать в Snap Store без дополнительной сущности в моём лице. Вся суть snap, в противовес deb, не стоять, как сопровождающий, между программистом и пользователем. Платой за мою работу будет вот эта статья.

Итак, мы захотели запаковать topalias. Linux bash/zsh alias generator and statistics from command history, written on Python.

Сначала знакомимся с проектом topalias. Видим в разделе Installation инструкции по сборке и всё это может и умеет snapcraft. Сам стащит проект с git, сам "откомпилит", но по ряду причин у меня не получилось, так как мало опыта в упаковке программ на Python. Хотя разработчики snap выкладывают в разделе документация массу информации, в том числе и как паковать программы на питоне.

Решил схитрить, так как в гит проекта даже написано как запустить topalias без установки.
git clone https://github.com/CSRedRat/topalias
python3 topalias/topalias/cli.py -h

Поэтому пока готов вам показать "облегчённую версию" snapcraft.yaml. Мы просто упакуем готовое! В принципе данный метод имеет право на жизнь.

Первые шаги

Итак. Нужна пустая папка и установленный инструмент snapcraft. По логике можно и нужно на сборочном сервере установить топовую Ubuntu LTS, но, по ряду причин, у меня пока Ubuntu 18.04 LTS.

Делаем в пустой папке git clone https://github.com/CSRedRat/topalias

Рождается каталог topalias/, будем работать внутри её. Создаём подпапку topalias/snap/ и там файл snapcraft.yaml. Создаём подпапку topalias/snap/gui/, чтобы дальнейшем размещать там desktop файлы и т.д. В папку topalias/topalias/ где лежит cli.py подкладываем стартовый исполняемый скрипт topalias_snap.sh

В итоге у нас должно получиться примерно так

├── snap/
│   ├── gui/
│   └── snapcraft.yaml
├── topalias/
│   ├── aliascore.py
│   ├── cli.py
│   ├── data/
│   ├── __init__.py
│   ├── __main__.py
│   ├── py.typed
│   └── topalias_snap.sh

Содержимое исполняемого скрипта topalias_snap.sh, который будет представлен "как бинарник" в будущем snap пакете.
#!/bin/bash
export PATH="$SNAP/usr/sbin:$SNAP/usr/bin:$SNAP/sbin:$SNAP/bin:$PATH"
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$SNAP/lib:$SNAP/usr/lib:$SNAP/lib/x86_64-linux-gnu:$SNAP/usr/lib/x86_64-linux-gnu"
export LD_LIBRARY_PATH="$SNAP/lib/x86_64-linux-gnu:$SNAP/usr/lib/x86_64-linux-gnu:$LD_LIBRARY_PATH"
export LD_LIBRARY_PATH=$SNAP_LIBRARY_PATH:$LD_LIBRARY_PATH
export LC_ALL=C.UTF-8
export LANG=C.UTF-8
# Run python script
python3 $SNAP/cli.py $@
echo "Report you great ideas and any feedback: https://github.com/CSRedRat/topalias/issues/new"

Теперь объясняю построчно snapcraft.yaml, который упакует topalias/topalias/ в snap пакет. Официальная документация.

name: topalias

Имя проекта. Должно быть заранее зарегистрировано и это будет задачей Сергея!

Снапкрафтер посещает официальный сайт и резервирует в Store себе имя. В особо "тяжёлых" случаях нужно будет доказать владение таким названием и, возможно, получить отказ. Не сталкивался с подобным, но нужно быть готовым. Если был получен отказ в имени, то придётся изменить snapcraft.yaml и отразить изменения в имени.
https://snapcraft.io/snaps
https://dashboard.snapcraft.io/stores/snaps/

version: "1.0-snap1"

Любое название согласно документации. Люблю версия + снап_подверсия если мало ли будут выпуски исправленных пакетов снап на эту же версию программы.

summary: topalias

Краткое описание.

description: |
     Linux bash/zsh alias generator and statistics from command history, written on Python.

Длинное название.

confinement: devmode

Ограничение пока, к сожалению, devmode, так как не знаю как получить доступ к скрытым файлам в домашней директории. Дело в том, что будем просить подключить к интерфейсу home, но он даёт фильтрованный доступ к домашней папке пользователя (allows access to non-hidden files owned by the user in the user’s home). В будущем, нужно спросить опытных разработчиков snap как лучше поступить, так как пока выходом является указание ограничение как devmode, а не strict. НИКОГДА не заливал в Snap Store пакеты в devmode и нет опыта, Сергею придётся этот вопрос решить при заливке пакета в Snap Store.

grade: stable

Уровень качества выставлен stable, хотя до конца не дожата тема с confinement. В любом случае, при заливке готового пакета в Snap Store можно будет позже указать на каком уровне качества вы хотели бы опубликовать пакет. Поэтому не стоит в данном месте зацикливаться.

architectures: [amd64]

Пакую только в 64 бита. Есть возможность сделать multiarch .. не делал!

base: core18

Пока базой считаю ubuntu-core 18.04 и с ней меня "состыкуют". По идее можно переходить на core20.

apps:
  topalias:
    command: topalias_snap.sh
    plugs: [ home ]

Секция apps - "исполняемые бинарники". Как минимум должен быть один "бинарник" и должен совпадать с именем пакета. Когда пользователь запускает topalias, то он неявно просит запустить topalias.topalias. Если внутри пакета несколько бинарников, то они должны запускаться явно имя_пакета.имя_бинарника Обратите внимание что указание стартового скрипта topalias_snap.sh идёт без использования пути к нему. В идеале, нужно писать путь в виде $SNAP/path/to/file, но ниже станет понятно, как работает эта "магия". Из множества различных интерфейсов просим подключить лишь к home, так как topalias программа консольная.

parts:
  topalias-files:
    plugin: dump
    source: topalias/
    after: [integration]

  integration:
    plugin: nil
    stage-packages:
      - python3
      - python3-click
      - locales
    stage:
    - -usr/share/doc/*
    - -usr/share/man/*

Сделал 2 кусочка-части (parts)

  • Кусочек integration использует плагин nil и просто добавляет нужное внутрь снап пакета. Прошу удалить мануалы на этапе stage, так как это не работает для пользователя и просто делает snap жирнее в мегабайтах.
  • Кусочек topalias-files прошу обработать после integration и с помощью dump плагина разместить подпапку topalias/ прямо в "корне" будущего пакета. В данном месте вас может покорёбить и начнёте вспоминать стандарт размещения файлов FHS, но всё это лишнее. Snap пакет не распаковывается в систему и всё внутри слово заморожено, как Хан Соло в карбоните.

Рождение snap пакета

Когда вы запускаете snapcraft в папке вашего проекта, он считывает файл snap/snapcraft.yaml и начинает обрабатывать кусочки integration и topalias-files, каждый из которых проходит этапы pull -> build -> stage. Мне вам легко и просто дать готовое, но когда сам делал первую итерацию упаковки, то получил ошибку, которую бы Сергей, как автор, не допустил бы. Я, не являясь автором программы и опытным разработчиком на Питоне, забыл добавить пакет python3-click. После добавления python3-click в секцию stage-packages, получил ругань при старте программы - бла-бла-бла click бла-бла-бла locales.

Добавил строки
export LC_ALL=C.UTF-8
export LANG=C.UTF-8

в стартовый topalias_snap.sh.

Итог

После мытарств, рано или поздно родится snap пакет. Для тестирования автору в систему нужно устанавливать sudo snap --dangerous --devmode topalias*.snap. Ключом --dangerous вы соглашаетесь что осознаёте факт установки не подписанного пакета в систему.

Публикация пакета подробно описана в статье Releasing your app. Нужно залогиниться в Snap Store snapcraft login и залить пакет на нужный вам уровень надёжности. Пример показывает заливку на канал stable - snapcraft upload --release=stable имя-пакета.snap.

Пакет должен пройти вереницу тестов и будет подписан ключом автора. После этого программа станет доступна пользователям через установку в Терминале, GNOME Software, KDE Discover и в различных магазинах софта, которые умеют работать со Snap Store.

Как сказано выше, из-за специфики topalias, который работает со скрытыми файлами, к которым доступ из пакета снап фильтруется, мы не соблюли условие ограничение strict и использовали confinement: devmode, что может повлечь не допущение в Snap Store. Данные вопросы придётся разрулить Сергею самостоятельно, так как, меня как лишней сущности, нет в процессе - автор заливает свой софт для пользователей. Сергею останется заполнить для удобства пользователей различные опциональные поля, залить картинки-скриншоты и т.д. В дальнейшем, Сергей может всё изменить по своему усмотрению в snapcraft.yaml. Перейти от упаковки готового к сборке-упаковке. Инструмент snapcraft гибок и позволяет различными путями достигнуть результата.

Ускорение процесса упаковки snap.
Snap vs Deb.
Мои snap пакеты.

Дата последней правки: 2020-11-24 16:30:57

RSS vasilisc.com   


Разделы

Главная
Новости
Ворох бумаг
Видео Linux
Игры в Linux
Безопасность
Статьи об Astra Linux
Статьи о FreeBSD
Статьи об Ubuntu
Статьи о Snappy
Статьи об Ubuntu Phone
Статьи о Kubuntu
Статьи о Xubuntu
Статьи о Lubuntu
Статьи об Open Source
Карта сайта