Автор выбрал фонд 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, чтобы начать подготовку.
Во-первых, вы подготовите приложение к упаковке в качестве приложения Snap, обеспечив наличие всего необходимого в одной директории.
Начнем с создания новой директории для вашего снапа, после чего вам нужно перейти в эту директорию:
- mkdir ~/your-snap
- cd ~/your-snap
Затем, если у вас уже есть приложение, поместите полную копию исходного кода вашего приложения в только что созданную вами директорию. Данный процесс в значительной степени зависит от конкретного приложения, которое вы упаковываете, но если ваш исходный код хранится в репозитории Git, вы можете воспользоваться командой git init
, чтобы инициализировать репозиторий для директории и загрузить весь соответствующий код.
Если у вас еще нет приложения, которое вы хотите упаковать, вы можете создать программу Hello World и использовать ее. Если вам потребуется добавить дополнительный контекст при написании этой программы на языке Go, ознакомьтесь с руководством Написание вашей первой программы на 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
Вывод должен выглядеть так:
OutputHello, world!
Вы успешно подготовили приложение для упаковки в качестве снапа. Далее вы установите программное обеспечение, необходимое для начала процесса упаковки.
На этом шаге вы загрузите и установите 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.
На этом шаге вы начнете определять конфигурацию, структуру и метаданные для вашего приложения 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 Store — выполните поиск других приложений с таким же именем, чтобы убедиться, что имя еще не занято.
Далее вы можете определить команду (команды) для связи с вашим приложением. Это позволит использовать ваш снап напрямую из командной строки 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
Если имя команды совпадает с именем снапа, вы сможете запустить его напрямую из командной строки. Если команда не соответствует имени снапа, к команде будет автоматически добавлен префикс с именем снапа. Например, 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
:
. . .
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. Далее вы настроите аспекты безопасности и песочницы для вашего приложения.
Приложения Snap разрабатываются для запуска в изолированной среде, поэтому в этом шаге вы настроите песочницу для вашего снапа. Во-первых, вам нужно будет активировать песочницу для вашего приложения, известную в Snapcraft как ограждение
.
Добавьте следующее в файл snapcraft.yaml
:
. . .
confinement: strict
Это позволит организовать песочницу для вашего приложения, предотвращая возможность доступа через Интернет, из других запущенных снапов или самой хост-системы. Однако в большинстве случаев приложения должны иметь возможность передавать данные за пределы своей песочницы, например, когда им требуется получить доступ к Интернету или выполнить чтение/запись в файловой системе.
Эти разрешения, известные в Snapcraft как интерфейсы, могут быть предоставлены вашему приложению Snap с помощью плагов. С помощью плагов вы можете организовать детальный контроль песочницы для вашего приложения, чтобы предоставить ей доступ к тому, что нужно, и ничего более (принцип «минимум полномочий»).
Конкретные интерфейсы, которые могут потребоваться, будут варьироваться в зависимости от вашего приложения. Ниже представлен ряд наиболее распространенных интерфейсов:
audio-playback
— разрешает вывод аудио/проигрывание звуков.audio-record
— разрешает ввод/запись аудио.camera
— разрешает доступ к подключенным веб-камерам.home
— разрешает доступ к нескрытым файлам внутри домашней директории.network
— разрешает доступ к сети/Интернету.network-bind
— разрешает привязку портов для работы в качестве сетевой службы.system-files
— разрешает доступ ко всей файловой системе хост-компьютера.Полный список доступных интерфейсов можно найти в документации Snapcraft в разделе Поддерживаемые интерфейсы.
После того как вы определили все требуемые интерфейсы для вашего приложения, вы можете начать присвоение плагов
внутри вашего файла snapcraft.yaml
.
Следующий пример конфигурации позволит приложению получить доступ к сети и домашнему пространству пользователей:
. . .
plugs:
your-snap-home:
interface: home
your-snap-network:
interface: network
Сохраните и закройте файл.
Имя плага должно быть описательным, чтобы пользователи могли понять, для чего нужен плаг.
Вы активировали песочницу для вашего снапа и настроили несколько плагов для предоставления ограниченного доступа к системным ресурсам. Далее вы сможете завершить процесс сборки приложения 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 будет закрыт, а вы увидите примерно следующее:
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.
Теперь, когда вы выполнили сборку и тестирование приложения 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 и опубликовали его.
В этой статье вы настроили и выполнили сборку приложения 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.
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!