Пакетирование и публикация snap-приложения в Ubuntu 18.04

Финальный этап работы над приложением – пакетирование и распространение готового продукта – является одним из самых трудных. Дружественность и безопасность многих существующих методологий развертывания приложений оставляет желать лучшего. Также далеко не все методы поддерживают автоматическое обновление приложений после установки.

Snap – это современный формат пакетирования приложений с удобной песочницей и надежными функциями безопасности, которые включают изоляцию файловой системы, автоматическое обновление и интегрированное управление зависимостями. Snap-приложения (иногда их называют просто Snaps) можно загрузить и установить с помощью стандартных программ командной строки типа apt и yum. Система Ubuntu поставляется с предустановленным Snap, что делает ее удобной средой для Snap-приложений.

Этот мануал поможет вам создать приложение Snap и опубликовать его на Snap Store.

Требования

  • Сервер Ubuntu 18.04, настроенный согласно этому мануалу.
  • Приложение, которое вы хотите пакетировать и опубликовать в формате Snap. Для этого подойдёт разработанное вами сложное приложение, любой проект с открытым исходным кодом или простая тестовая программа «Hello, world!». Чтобы создать тестовую программу, выполните мануал Написание простой программы Go.
  • Аккаунт Snapcraft Developer Dashboard.

Выполнив все требования, войдите на сервер как пользователь sudo и приступайте к работе.

1: Подготовка приложения к пакетированию

Сначала нужно подготовить приложение к пакетированию как приложение Snap. Для этого нужно, чтобы все необходимое хранилось в одном каталоге.

Создайте каталог для Snap и перейдите в него:

mkdir ~/your-snap
cd ~/your-snap

Затем, если у вас уже есть приложение, поместите полную копию его исходного кода в каталог, который вы только что создали. Этот процесс в значительной степени зависит от того, какое именно приложение вы упаковываете. Если исходный код хранится в репозитории Git, вы можете выполнить git init в этом каталоге и выгрузить весь соответствующий код.

Если у вас еще нет приложения, которое вы хотели бы упаковать, вы можете создать тестовую программу «Hello World».

Читайте также: Написание простой программы Go

Для этого сначала создайте новый файл Go и откройте его с помощью любого удобного текстового редактора:

nano helloworld.go

Затем добавьте в файл следующий код:

package main
import "fmt"
func main() {
fmt.Println("Hello, world!")
}

Сохраните и закройте файл.

Если у вас нет установки Go, вы можете установить программу с помощью команды:

sudo apt install golang-go

Установив Go, вы можете запустить свою программу с помощью команды:

go run helloworld.go

Вы получите такой вывод:

Hello, world!

Итак, ваше приложение готово к пакетированию как Snap. Далее мы установим все программы, необходимые для пакетирования.

2: Установка Snapcraft

На этом этапе мы скачаем и установим Snapcraft, официальный инструмент пакетирования приложений Snap. Snapcraft доступен в Snap Store, который по умолчанию встроен в Ubuntu. То есть вы можете установить Snapcraft из командной строки, используя команду snap.

Команда snap эквивалентна команде apt, но с ее помощью можно устанавливать программное обеспечение из Snap Store, а не из репозиториев Apt.

Чтобы установить Snapcraft, выполните следующую команду:

sudo snap install snapcraft --classic

Аргумент —classic установит Snapcraft без строгой песочницы, которую обычно используют Snaps. Snapcraft нужен этот аргумент, поскольку ему требуется более привилегированный доступ к вашей системе для надежной упаковки приложений.

Установив Snapcraft, вы увидите следующее:

snapcraft 3.9.8 from Canonical✓ installed

Затем вы можете проверить установку Snapcraft, запустив:

snapcraft --version

Эта команда должна вернуть версию установки:

snapcraft, version 3.9.8

Теперь, когда вы установили Snapcraft, вы можете начать определять конфигурацию и метаданные вашего приложения Snap.

3: Определение конфигурации и метаданных приложения Snap

Пора определить конфигурацию, структуру и метаданные приложения Snap.

Убедитесь, что вы все еще находитесь в каталоге приложений Snap:

cd ~/your-snap

Затем создайте и отредактируйте файл snapcraft.yaml через любой удобный текстовый редактор:

nano snapcraft.yaml

Файл snapcraft.yaml будет использоваться для хранения всей конфигурации приложения Snap, включая имя, описание и версию, а также параметры, связанные с управлением зависимостями и изолированной программной средой.

Начните с определения имени, описания и номера версии вашего приложения:

name: your-snap
summary: A summary of your application in 78 characters or less.
description: |
A detailed description of your application.
The description can have multiple lines.
version: '1.0'

Имя вашей программы Snap должно быть уникальным, если вы хотите опубликовать его в Snap Store. Поищите другие приложения с тем именем, которое вы выбрали, чтобы убедиться, что оно еще не занято.

Затем вы можете определить команды, которые хотите связать с вашим приложением. Это позволит использовать Snap прямо из командной строки Bash как обычную команду.

Добавьте в файл snapcraft.yaml следующее:

. . .
apps:
your-snap-command:
command: your-snap

your-snap-command – это имя команды, которую вы хотите определить. Например, вы можете использовать команду helloworld для запуска вашей программы Hello World.

Строка command: your-snap позволяет сообщить Snapcraft, что делать при запуске команды приложения. В случае с «Hello World» вы должны использовать значение helloworld для ссылки на файл helloworld.go, что позволит Snapcraft успешно запустить вашу программу.

В итоге получится такая конфигурация:

apps:
helloworld:
command: helloworld

Если имя команды точно соответствует имени Snap-пакета, вы сможете запустить его непосредственно из командной строки. Если команда не соответствует имени Snap-пакета, оно будет автоматически добавляться перед командой (например, helloworld.command1).

Затем вы можете определить раздел parts, где хранятся компоненты, которые составляют ваше приложение Snap. Некоторые приложения Snap состоят из нескольких компонентов, но во многих случаях приложение включает всего один компонент – собственно само приложение.

Каждый компонент имеет связанный плагин. Например, для компонентов приложения, написанных на Ruby, используется плагин ruby, а для компонентов, написанных на Go, используется плагин go.

Вы можете использовать команду Snapcraft list-plugins, чтобы определить правильные плагины для приложения:

snapcraft list-plugins

На экране появится такой список:

ant        catkin-tools  conda    dump    gradle  make   nil                python  rust
autotools  cmake         crystal  go      kbuild  maven  nodejs             qmake   scons
catkin     colcon        dotnet   godeps  kernel  meson  plainbox-provider  ruby    waf

Наиболее распространенными плагинами являются плагины для популярных языков программирования, таких как Go, Rust, Ruby или Python.

После того как вы определили необходимые плагины для своего приложения, вы можете добавить конфигурацию раздела parts в файл snapcraft.yaml:

. . .
parts:
your-snap:
plugin: plugin-name
source: .

Параметр конфигурации source позволяет указать относительный путь к исходному коду вашего приложения. Обычно это тот же каталог, в котором находится и сам файл snapcraft.yaml, поэтому значение source – символ точки (.).

Примечание: Если компонент вашего приложения имеет какие-либо зависимости, необходимые для его сборки или запуска, вы можете указать их, используя атрибуты build-packages и stage-packages. Указанные имена зависимостей будут автоматически извлечены менеджером пакетов вашей системы по умолчанию. Например:

parts:
your-snap:
plugin: plugin-name
source: .
build-packages:
- gcc
- make
stage-packages:
- libcurl4

Некоторые плагины Snapcraft имеют свои специфические параметры, которые могут потребоваться для работы вашего приложения. Поэтому стоит ознакомиться с соответствующими страницами справочника плагина:

snapcraft help plugin-name

Для приложений Go вы также должны указать go-importpath. Например, для простой программы Hello World получится такая конфигурация:

parts:
helloworld:
plugin: go
source: .
go-importpath: helloworld

Вы можете пока оставить свой файл snapcraft.yaml открытым, чтобы добавить остальные настройки на следующем этапе.

Итак, вы определили базовую конфигурацию своего приложения Snap. Теперь давайте настроим безопасность и песочницу вашего приложения.

4: Защита приложения Snap

Приложения Snap предназначены для работы в изолированной среде, поэтому на этом этапе мы настроим песочницу для Snap. Для начала вам необходимо включить «песочницу» для вашего приложения, в Snapcraft она называется confinement.

Добавьте в файл snapcraft.yaml следующее:

. . .
confinement: strict

Это включит песочницу для вашего приложения, запретив ему доступ к Интернету, другим запущенным Snaps и к самой хост-системе. Однако в большинстве случаев приложения должны иметь возможность обмениваться данными вне своей изолированной программной среды, (например, когда им требуется доступ к Интернету или право на чтение/запись в файловой системе).

Эти привилегии в контексте Snapcraft называются «интерфейсы», их можно предоставить вашему приложению Snap с помощью плагинов (Plugs). Плагины дают вам точный контроль над песочницей приложения и позволяют предоставить ему только необходимый доступ (по принципу наименьших привилегий).

Точный список требуемых интерфейсов зависит от вашего приложения. Вот некоторые из наиболее распространенных интерфейсов:

  • audio-playback: звуковой вывод, проигрывание звуков.
  • audio-record: звуковой ввод, запись звуков.
  • camera: доступ к камере.
  • home: доступ к обычным (не скрытым) файлам в вашем домашнем каталоге
  • network: доступ к сети, к интернету.
  • network-bind: позволяет приложению привязываться к определенному порту и работать как сервис.
  • system-files: открывает доступ ко всей файловой системе хост-машины.

Полный список доступных интерфейсов можно найти в документации Snapcraft в разделе Supported Interfaces.

После того как вы определили все необходимые интерфейсы вашего приложения, вы можете присвоить их плагинам в файле snapcraft.yaml.

Например, в этой конфигурации приложение получит доступ к сети и домашней области пользователей:

. . .
plugs:
your-snap-home:
interface: home
your-snap-network:
interface: network

Имя подключаемого плагина должно быть описательным, чтобы помочь пользователям определить его назначение.

Итак, вы включили «песочницу» своего приложения и настроили некоторые плагины для предоставления ограниченного доступа к системным ресурсам. Давайте закончим сборку приложения Snap.

5: Сборка и тестирование приложения Snap

Теперь, когда вы написали всю необходимую конфигурацию для приложения Snap, вы можете приступить к сборке и локальному тестированию своего итогового пакета.

Если вы тоже выполняли этот мануал на примере программы Hello World, ваш файл snapcraft.yaml теперь будет выглядеть примерно так:

name: helloworld
summary: A simple Hello World program.
description: |
A simple Hello World program written in Go.
Packaged as a Snap application using Snapcraft.
version: '1.0'
confinement: strict
apps:
helloworld:
command: helloworld
parts:
helloworld:
plugin: go
source: .
go-importpath: helloworld
plugs:
helloworld-home:
interface: home
helloworld-network:
interface: network

Чтобы собрать приложение Snap, запустите команду snapcraft из каталога приложения:

snapcraft

Snapcraft автоматически запустит виртуальную машину (VM) и начнет сборку. После завершения Snapcraft закроется, и вы увидите нечто похожее:

Snapped your-snap_1.0_amd64.snap

Теперь вы можете установить приложение Snap локально, чтобы убедиться, что оно работает:

sudo snap install your-snap.snap --dangerous

Аргумент —dangerous необходим, так как вы устанавливаете локальный Snap, который не был подписан.

После завершения установки вы можете запустить Snap, используя соответствующую команду. Например:

helloworld

В данном случае команда вернет следующий вывод:

Hello, world!

Вы также можете просмотреть политику песочницы вашего приложения Snap, чтобы убедиться, что привилегии были предоставлены правильно:

snap connections your-snap

Эта команда выведет список плагинов и интерфейсов:

snap connections your-snap
Interface  Plug                         Slot      Notes
home       your-snap:your-snap-home     :home     -
network    your-snap:your-snap-network  :network  -

Итак, вы собрали свой Snap-пакет. Теперь давайте опубликуем его.

6: Публикация приложения Snap

Теперь, когда вы создали и протестировали приложение Snap, пришло время выпустить его релиз в Snap Store.

Войдите в свою учетную запись Snap Developer с помощью приложения командной строки Snapcraft:

snapcraft login

Следуйте дальнейшим инструкциям программы (нужно ввести свой адрес электронной почты и пароль).

Далее необходимо зарегистрировать имя приложения в Snap Store:

snapcraft register your-snap

После этого вы можете отправить собранный пакет Snap в магазин:

snapcraft push your-snap.snap

Вы увидите похожий вывод:

Preparing to push 'your-snap_1.0_amd64.snap'.
Install the review-tools from the Snap Store for enhanced checks before uploading this snap.
Pushing 'your-snap_1.0_amd64.snap' [===================================================================================================] 100%
Processing...|
Ready to release!
Revision 1 of 'your-snap' created.

При появлении новых пакетов этого приложения на Snap store номер ревизии будет увеличиваться (отсчёт начитается с единицы). Это помогает различать сборки приложения Snap.

Наконец, вы можете выпустить свое приложение Snap в публичный доступ:

snapcraft release your-snap revision-number channel

Если вы впервые отправляете пакеты в Snap Store, номер ревизии будет равен 1. Если у вас несколько версий приложения на разных этапах разработки, вы можете выбрать канал stable, candidate, beta или edge.

Например, следующая команда выпустит версию 1 программы Hello World на канале stable:

snapcraft release helloworld 1 stable

Вы увидите такой вывод:

Track    Arch    Channel    Version    Revision
latest   amd64   stable     1.0        1
candidate  ^          ^
beta       ^          ^
edge       ^          ^
The 'stable' channel is now open.

Теперь вы можете найти свое приложение в Snap Store  и установить его на любое из ваших устройств.

Заключение

В этом мануале вы научились собирать и публиковать приложения в формате Snap.

Если вы хотите узнать о Snap больше, изучите Snap Store или почитайте Snapcraft YAML Reference, где вы сможете определить дополнительные атрибуты для вашей конфигурации Snap.

Если вы хотите продолжить изучение разработки в Snap, почитайте о внедрении Snap Hooks, которые позволяют Snaps динамически реагировать на системные изменения (обновления или настройки политики безопасности).

Tags: , , , ,

Добавить комментарий