Упаковка и публикация приложения Snap в Ubuntu 18.04

Автор выбрал фонд Electronic Frontier Foundation для получения пожертвований в рамках программы Write for DOnations.

Введение

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

Snap — это современный формат упаковки приложений с мощными опциями для песочницы и обеспечения безопасности, включая изоляцию файловой системы, автоматические обновления и комплексное управление зависимостями. Приложения Snap, или «снапы», могут загружаться и устанавливаться с помощью программы командной строки, такой как apt или yum. Snap предоставляется в комплекте с Ubuntu, что означает, что у приложений Snap есть самая широкая аудитория.

В этом обучающем руководстве вы создадите приложение Snap и опубликуете его в Snap Store.

Предварительные требования

Для данного обучающего руководства вам потребуется следующее:

  • Один сервер Ubuntu 18.04, настроенный в соответствии с инструкциями по начальной настройке сервера с Ubuntu 18.04, а также пользователь sudo без прав root.

  • Приложение, которое вы хотите упаковать и выпустить в качестве снапа. Это может быть сложное приложение, которое вы создали, общий проект с открытым исходным кодом, или просто приложение «Hello, world!». Если у вас еще нет приложения, в шаге 1 данного руководства описано, как создать программу Hello World в Go.

  • Учетная запись в Snapcraft Developer Dashboard.

Подготовив все вышеперечисленное, войдите на сервер без привилегий root, чтобы начать подготовку.

Шаг 1 — Подготовка вашего приложения к упаковке

Во-первых, вы подготовите приложение к упаковке в качестве приложения Snap, обеспечив наличие всего необходимого в одной директории.

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

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

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

Если у вас еще нет приложения, которое вы хотите упаковать, вы можете создать программу Hello World и использовать ее. Если вам потребуется добавить дополнительный контекст при написании этой программы на языке Go, ознакомьтесь с руководством Написание вашей первой программы на Go.

Вы можете сделать это, создав новый файл Go и открыв его в предпочитаемом вами текстовом редакторе:

  • nano helloworld.go

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

helloworld.go

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

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

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

  • sudo apt install golang-go

После установки Go вы можете запустить вашу новую программу, чтобы проверить ее работу:

  • go run helloworld.go

Вывод должен выглядеть так:

OutputHello, world! 

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

Шаг 2 — Установка Snapcraft

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

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

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

  • sudo snap install snapcraft --classic

Воспользуйтесь аргументом команды --classic, чтобы установить Snapcraft без строгих функций песочницы, которые обычно используются снапами. Snapcraft требует наличие этого аргумента, поскольку он подразумевает более безопасный доступ к системе для более надежной упаковки приложений.

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

Outputsnapcraft 3.9.8 from Canonical✓ installed 

После этого вы можете еще раз проверить корректность установки Snapcraft с помощью следующей команды:

  • snapcraft --version

В результате будет выведено примерно следующее:

Outputsnapcraft, version 3.9.8 

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

Шаг 3 — Определение конфигурации и метаданных для вашего снапа

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

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

  • cd ~/your-snap

Затем создайте и отредактируйте файл snapcraft.yaml в вашем предпочитаемом текстовом редакторе:

  • nano snapcraft.yaml

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

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

snapcraft.yaml

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 Store — выполните поиск других приложений с таким же именем, чтобы убедиться, что имя еще не занято.

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

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

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 успешно запускать вашу программу.

В результате вы получите следующий пример конфигурации:

snapcraft.yaml

apps:   helloworld:     command: helloworld 

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

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

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

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

  • snapcraft list-plugins

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

Outputant        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.

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

snapcraft.yaml

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

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

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

Например:

snapcraft.yaml

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

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

  • snapcraft help plugin-name

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

snapcraft.yaml

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

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

Вы определили базовую конфигурацию для вашего приложения Snap. Далее вы настроите аспекты безопасности и песочницы для вашего приложения.

Шаг 4 — Защита приложения Snap

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

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

snapcraft.yaml

. . . confinement: strict 

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

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

Конкретные интерфейсы, которые могут потребоваться, будут варьироваться в зависимости от вашего приложения. Ниже представлен ряд наиболее распространенных интерфейсов:

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

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

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

Следующий пример конфигурации позволит приложению получить доступ к сети и домашнему пространству пользователей:

snapcraft.yaml

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

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

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

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

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

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

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

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 будет закрыт, а вы увидите примерно следующее:

OutputSnapped your-snap_1.0_amd64.snap 

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

  • sudo snap install your-snap.snap --dangerous

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

Outputyour-snap 1.0 installed 

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

  • helloworld

В случае используемой в качестве примера программы Hello World вы увидите следующее:

OutputHello, world! 

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

  • snap connections your-snap

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

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

На этом шаге вы выполнили сборку вашего снапа и установили его локально для проверки его работы. Далее вы опубликуете ваш снап в Snap Store.

Шаг 6 — Публикация вашего приложения Snap

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

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

  • snapcraft login

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

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

  • snapcraft register your-snap

После того как вы зарегистрируете имя снапа, вы сможете загрузить созданный пакет приложения Snap в магазин:

  • snapcraft push your-snap.snap

Результат будет выглядеть примерно так:

OutputPreparing 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, номер версии увеличивается, начиная с 1. Это полезно, так как помогает определить различные сборки вашего снапа.

Наконец, вы можете опубликовать ваш снап:

  • snapcraft release your-snap revision-number channel

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

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

  • snapcraft release helloworld 1 stable

Результат будет выглядеть примерно так:

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

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

Snap Store с приложением HelloWorld, которое отображается в результатах поиска

На данном заключительном шаге вы загрузили созданный вами пакет в Snap Store и опубликовали его.

Заключение

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

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

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