Tutorial

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

Published on March 19, 2020
Русский
Упаковка и публикация приложения 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, обеспечив наличие всего необходимого в одной директории.

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

  1. mkdir ~/your-snap
  2. cd ~/your-snap

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

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

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

  1. nano helloworld.go

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

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

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

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

  1. sudo apt install golang-go

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

  1. go run helloworld.go

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

Output
Hello, world!

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

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

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

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

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

  1. sudo snap install snapcraft --classic

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

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

Output
snapcraft 3.9.8 from Canonical✓ installed

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

  1. snapcraft --version

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

Output
snapcraft, version 3.9.8

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

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

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

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

  1. cd ~/your-snap

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

  1. 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, чтобы определить надлежащий плагин (плагины) для вашего приложения:

  1. snapcraft list-plugins

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

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

После того как вы определили надлежащие плагины для вашего приложения, вы можете переходить к добавлению конфигурации частей для вашего файла 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 имеют собственные конкретные опции, которые могут потребоваться вашему приложению, поэтому полезно изучить соответствующие страницы руководства для вашего плагина:

  1. 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 внутри директории вашего снапа:

  1. snapcraft

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

Output
Snapped your-snap_1.0_amd64.snap

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

  1. sudo snap install your-snap.snap --dangerous

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

Output
your-snap 1.0 installed

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

  1. helloworld

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

Output
Hello, world!

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

  1. snap connections your-snap

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

Output
snap 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:

  1. snapcraft login

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

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

  1. snapcraft register your-snap

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

  1. snapcraft push your-snap.snap

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

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

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

  1. snapcraft release your-snap revision-number channel

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

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

  1. snapcraft release helloworld 1 stable

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

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

Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.

Learn more about our products

About the authors
Default avatar

Security Engineer

IT Security Engineer, technical writer and occasional blogger from the United Kingdom, with an interest in security defence and blue team activities.



Still looking for an answer?

Ask a questionSearch for more help

Was this helpful?
 
Leave a comment


This textbox defaults to using Markdown to format your answer.

You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!

Try DigitalOcean for free

Click below to sign up and get $200 of credit to try our products over 60 days!

Sign up

Join the Tech Talk
Success! Thank you! Please check your email for further details.

Please complete your information!

Featured on Community

Get our biweekly newsletter

Sign up for Infrastructure as a Newsletter.

Hollie's Hub for Good

Working on improving health and education, reducing inequality, and spurring economic growth? We'd like to help.

Become a contributor

Get paid to write technical tutorials and select a tech-focused charity to receive a matching donation.

Welcome to the developer cloud

DigitalOcean makes it simple to launch in the cloud and scale up as you grow — whether you're running one virtual machine or ten thousand.

Learn more