如何在 Ubuntu 18.04 上打包和发布 Snap 应用程序

作者选择了 Electronic Frontier Foundation作为 Write for Donations计划的一部分接受捐款。

介绍

应用程序开发的最大挑战之一是将最终产品分发给用户或客户的最后一步,许多现有的应用程序部署方法缺乏用户友好性和安全性,或者不提供安装后自动更新应用程序的方法。

Snap是一个现代化的应用程序包装格式,具有强大的沙盒和安全功能,包括文件系统隔离,自动更新和集成依赖管理。Snap应用程序,称为Snaps,可以使用命令行程序下载和安装,就像aptyum一样。

在本教程中,您将创建一个 Snap 应用程序并在 Snap Store上发布它。

前提条件

要完成本教程,您将需要:

  • 一个 Ubuntu 18.04 服务器通过遵循 初始服务器设置与 Ubuntu 18.04设置,包括一个 sudo 非根用户。
  • 一个你想要包装和发布的应用程序作为一个 Snap. 这可能是你创建的复杂的应用程序,一个常见的开源项目,或一个简单的你好,世界!程序. 如果你还没有应用程序, 本教程的步骤 1将涵盖如何在 Go 中创建一个 Hello World 程序。

一旦你已经准备好了,登录你的服务器作为你的非根用户开始。

步骤 1 – 让您的应用程序为包装做好准备

首先,您将准备您的应用程序作为Snap应用程序的包装,确保所需的一切都存在于一个目录中。

首先,为您的 Snap 创建一个新目录,然后进入它:

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

接下来,如果您已经有一个应用程序,将您的应用程序的源代码的完整副本放入您刚刚创建的目录中,此过程将取决于您正在包装的具体应用程序,但如果源代码存储在 Git 存储库中,您可以在目录中git init一个存储库,并将所有相关的代码拖下来。

如果你还没有一个你想包装的应用程序,你可以创建一个Hello World程序来使用,而不是。

您可以这样做,首先创建一个新的 Go 文件,然后使用您喜爱的文本编辑器打开它:

1nano helloworld.go

然后将以下代码添加到文件中:

1[label helloworld.go]
2package main
3import "fmt"
4func main() {
5  fmt.Println("Hello, world!")
6}

然后保存并退出文件。

如果您没有安装 Go,您可以使用以下命令安装它:

1sudo apt install golang-go

一旦安装了Go,你可以运行你的新程序来检查它是否工作:

1go run helloworld.go

您将看到以下输出:

1[secondary_label Output]
2Hello, world!

您已经准备了您的包装应用程序作为一个 Snap. 接下来,您将安装开始包装过程所需的软件。

第2步:安装Snapcraft

在此步骤中,您将下载并安装Snapcraft,这是官方Snap应用程序包装工具的名称。Snapcraft可从Snap Store获取,该工具是默认内置在Ubuntu中。

snap命令与apt命令相当,但您可以使用它来安装来自Snap Store的软件,而不是来自Apt存储库的软件。

要安装 Snapcraft,请执行以下命令:

1sudo snap install snapcraft --classic

您使用 - 经典命令参数,以便Snapcraft 安装而无需Snaps 通常使用的严格沙盒功能。

一旦您安装了 Snapcraft,您将看到以下内容:

1[secondary_label Output]
2snapcraft 3.9.8 from Canonical✓ installed

最后,您可以通过运行下列方法对 Snapcraft 安装进行双重检查:

1snapcraft --version

这将显示类似的东西:

1[secondary_label Output]
2snapcraft, version 3.9.8

现在您已经安装了 Snapcraft,您可以开始为 Snap 应用程序定义配置和元数据。

步骤 3 — 定义您的 Snap 的配置和元数据

在此步骤中,您将开始为 Snap 应用程序定义配置、结构和元数据。

首先,确保您仍然在 Snap 应用程序目录中工作:

1cd ~/your-snap

接下来,使用您喜爱的文本编辑器创建和编辑 snapcraft.yaml 文件:

1nano snapcraft.yaml

您将使用snapcraft.yaml文件来存储您的Snap应用程序的所有配置,包括名称,描述和版本,以及与依赖管理和沙盒相关的设置。

首先,定义您的应用程序的名称、摘要、描述和版本号:

1[label snapcraft.yaml]
2name: your-snap
3summary: A summary of your application in 78 characters or less.
4description: |
5  A detailed description of your application.
6  The description can have multiple lines.  
7version: '1.0'

如果您希望在 Snap Store上发布 Snap 名称,则需要独特的名称 - 寻找具有相同名称的其他应用程序,以确保它尚未被拍摄。

接下来,您可以定义您希望与应用程序相关联的命令(命令)。

将以下内容添加到您的 snapcraft.yaml 文件中:

1[label snapcraft.yaml]
2. . .
3apps:
4  your-snap-command:
5    command: your-snap

「your-snap-command」是您想要定义的命令的名称,例如,您可能希望使用命令「helloworld」来运行您的 Hello World 程序。

在 Hello World 程序中,您将使用值 helloworld 来引用 helloworld.go 文件,这将允许 Snapcraft 成功运行您的程序。

结果是下面的示例配置:

1[label snapcraft.yaml]
2apps:
3  helloworld:
4    command: helloworld

如果命令名称完全匹配 Snap 名称,则可以直接从命令行执行命令名称. 如果命令不匹配 Snap 名称,则命令将自动以 Snap 名称为前缀。

最后,您可以定义构成 Snap 应用程序的 _parts。 Snap 应用程序由多个部分组成,这些都是构成您的应用程序的组件。

例如,对于您在 Ruby 中写的应用程序的组件,使用ruby插件,而对于在 Go 中写的组件,使用go插件。

您可以使用Snapcraft的列表插件命令来识别您的应用程序的正确插件:

1snapcraft list-plugins

这将产生类似于以下的列表:

1[secondary_label Output]
2ant catkin-tools conda dump gradle make nil python rust
3autotools cmake crystal go kbuild maven nodejs qmake scons
4catkin colcon dotnet godeps kernel meson plainbox-provider ruby waf

最常见的插件是用于常见的编程语言,如Go,Rust,Ruby或Python。

一旦您确定了适用于您的应用程序的正确插件,您可以开始将parts配置添加到您的snapcraft.yaml文件中:

1[label snapcraft.yaml]
2. . .
3parts:
4  your-snap:
5    plugin: plugin-name
6    source: .

您使用配置参数来指定应用程序的源代码的相对路径. 通常这将是与snapcraft.yaml文件本身相同的目录,因此值是一个单点(.)。

<$>[注] 注: 如果您的应用程序组件具有构建或运行它所需的任何依赖性,则可以使用构建包阶段包属性来指定这些依赖性。

例如:

 1[label snapcraft.yaml]
 2parts:
 3  your-snap:
 4  plugin: plugin-name
 5  source: .
 6  build-packages:
 7  - gcc
 8  - make
 9  stage-packages:
10  - libcurl4

美元

一些 Snapcraft 插件有自己的特定选项,可能需要您的应用程序,因此值得查看您的插件的相关手册页面:

1snapcraft help plugin-name

在 Go 应用程序中,您还会指定 go-importpath. 对于 Hello World 配置,这会导致以下示例配置:

1[label snapcraft.yaml]
2parts:
3  helloworld:
4    plugin: go
5    source: .
6    go-importpath: helloworld

您可以将您的 snapcraft.yaml 文件打开,以在下一步中添加进一步的配置。

您已经定义了 Snap 应用程序的基本配置,接下来,您将配置应用程序的安全和沙盒方面。

步骤 4 – 保护您的Snap应用程序

Snap 应用程序旨在在沙盒环境中运行,所以在此步骤中您将为 Snap 配置沙盒,首先,您需要为您的应用程序启用沙盒,这在 Snapcraft 中被称为限制

将以下内容添加到您的 snapcraft.yaml 文件中:

1[label snapcraft.yaml]
2. . .
3confinement: strict

这将允许您的应用程序进行沙盒存储,防止其访问互联网,其他运行 Snaps 或主机系统本身,但在大多数情况下,应用程序需要能够在沙盒外进行通信,例如当他们需要访问互联网或阅读 / 写入文件系统时。

这些权限,在Snapcraft中被称为 interfaces,可以通过插件授予您的Snap应用程序。

需要的确切界面将取决于您的应用程序,其中一些最常见的界面是:

●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●

可用的接口的完整列表可以在 Snapcraft 文档中找到 支持的接口

一旦您确定了您的应用程序所需的所有界面,您可以开始将这些界面分配到您的snapcraft.yaml文件中的插件

以下示例配置将允许应用程序访问网络和用户的家庭区域:

1[label snapcraft.yaml]
2. . .
3plugs:
4  your-snap-home:
5    interface: home
6  your-snap-network:
7    interface: network

保存和退出您的文件。

插件的名称应该是描述性的名称,以帮助用户识别插件的目的。

您已启用Sandboxing,并配置了一些插件,以允许限制对系统资源的访问。

步骤5 – 构建和测试您的Snap应用程序

现在,您已经为 Snap 编写了所有所需的配置,您可以继续构建它并在本地测试 Snap 包。

如果你一直在使用 Hello World 程序作为你的应用程序,你的完整的 snapcraft.yaml 文件现在将看起来如下:

 1[label snapcraft.yaml]
 2name: helloworld
 3summary: A simple Hello World program.
 4description: |
 5  A simple Hello World program written in Go.
 6  Packaged as a Snap application using Snapcraft.  
 7version: '1.0'
 8confinement: strict
 9
10apps:
11  helloworld:
12    command: helloworld
13
14parts:
15  helloworld:
16    plugin: go
17    source: .
18    go-importpath: helloworld
19
20plugs:
21  helloworld-home:
22    interface: home
23  helloworld-network:
24    interface: network

为了构建您的Snap应用程序,请从Snapcraft的目录中运行snapcraft命令:

1snapcraft

Snapcraft 将自动启动虚拟机(VM),并开始构建 Snap. 一旦完成,Snapcraft 将退出,您将看到类似于以下的东西:

1[secondary_label Output]
2Snapped your-snap_1.0_amd64.snap

您现在可以本地安装 Snap,以检查它是否工作:

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

需要--危险命令参数,因为您正在安装尚未签署的本地 Snap。

1[secondary_label Output]
2your-snap 1.0 installed

一旦安装过程完成,您可以使用相关命令运行 Snap。

1helloworld

在 Hello World 程序的例子中,以下输出将是:

1[secondary_label Output]
2Hello, world!

您还可以查看 Snap 的沙盒策略,以确保所分配的权限得到正确授予:

1snap connections your-snap

这将产生一个插件和接口列表,类似于以下情况:

1[secondary_label Output]
2snap connections your-snap
3Interface Plug Slot Notes
4home your-snap:your-snap-home     :home     -
5network your-snap:your-snap-network  :network  -

在此步驟中,您建立了 Snap 並在本地安裝,以測試它是否有效。

步骤6 - 发布您的 Snap

现在你已经构建并测试了你的Snap应用程序,是时候在Snap商店发布它了。

首先,请使用 Snapcraft 命令行应用程序登录您的 Snap Developer 帐户:

1snapcraft login

按照提示输入您的电子邮件地址和密码。

接下来,您需要在Snap商店注册应用程序的名称:

1snapcraft register your-snap

一旦您注册了Snap名称,您可以将内置的Snap包推到商店:

1snapcraft push your-snap.snap

您将看到类似于以下的输出:

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

每次你推到Snap商店时,修订次数就会增加,从一个开始,这有助于识别Snap的各种不同构建。

最后,您可以向公众发布您的Snap:

1snapcraft release your-snap revision-number channel

如果这是您第一次点击Snap Store,则修订号为1,您还可以选择将应用程序发布到稳定,候选,beta边缘频道(https://snapcraft.io/docs/channels),如果您的应用程序在不同开发阶段有多个版本。

例如,下列命令将 Hello World Snap 的修订1释放到稳定频道:

1snapcraft release helloworld 1 stable

您将看到类似于以下的输出:

1[secondary_label Output]
2Track Arch Channel Version Revision
3latest amd64 stable 1.0 1
4                 candidate  ^          ^
5                 beta       ^          ^
6                 edge       ^          ^
7The 'stable' channel is now open.

您现在可以在 Snap Store搜索您的应用程序,并在您的任何设备上安装它。

Snapcraft store with HelloWorld App displayed from search results

在这个最后一步中,您将内置的Snap包上传到Snap Store,并向公众发布。

结论

在本文中,您配置并构建了一个Snap应用程序,然后通过Snap Store向公众发布它,您现在拥有维护应用程序和构建新应用程序所需的基本知识。

如果您想进一步探索 Snaps,您可能希望浏览完整的 Snap Store

最后,如果您想进一步研究Snap的发展,您可能喜欢阅读有关实施Snap Hooks,这使Snaps能够动态地对系统变更(如升级或安全策略调整)作出反应。

Published At
Categories with 技术
comments powered by Disqus