snap and gitlab-CI: error: cannot communicate with server: Post http://localhost/v2/snaps/hello-world

snap and gitlab-CI: error: cannot communicate with server: Post http://localhost/v2/snaps/hello-world

如果我尝试 运行 在 gitlab-CI 管道下捕捉,安装最简单的包,它失败了:

$ snap install hello-world

error: cannot communicate with server: Post http://localhost/v2/snaps/hello-world: dial unix /run/snapd.socket: connect: no such file or directory

gitlab-ci最简单的yml配置文件:

image: ubuntu:18.04

before_script:
  - apt-get update -qq

test:
  script:
    - apt-get install -y snapd
    - snap version
    - snap install hello-world
    - hello-world

怎么回事?

不幸的是,快照使用了 docker 使用的许多底层安全技术,而且它们的表现不是很好。安装 snap 还需要 snapd 为 运行,它不在 docker 中(因此出现错误)。恐怕您今天根本无法在 docker 容器中可靠地安装快照。

请注意,还有其他非 docker 基于 CI 的系统。您可以通过一些自定义工作,使用 LXD 作为 GitLab CI 运行器的后端,它可以很好地处理快照。您还可以使用 GitHub 操作,它似乎基于 Azure VM,它也可以很好地处理快照。

似乎 GithubActionsCI 不使用 Docker 所以我现在使用它而不是 GitLabCI 来构建和测试 snap 包。

请注意:

  • 您需要 sudo 来使用 apt-get 安装 snap,以及使用 snap 命令安装任何 snap 包。
  • 如果你想 运行 snapcraft(构建包,而不仅仅是测试它们),通过 apt-get 获取它是可行的,但给出的版本有点旧(例如,它不支持布局)。如果你想要更新的版本,你可以使用 snap install snapcraft 通过 snap 安装它,但是你需要一些变通方法来使它成为 运行,例如 sudo chown root:root / 并传递 --destructive-mode 标志(参见 https://forum.snapcraft.io/t/permissions-problem-using-snapcraft-in-azure-pipelines/13258/16)。

在我的例子中,它是通过启动 snapd 服务解决的:

systemctl start snapd.service