【问题标题】:Using Snap applications with Jenkins将 Snap 应用程序与 Jenkins 一起使用
【发布时间】:2018-10-21 08:48:31
【问题描述】:

我正在尝试在 Ubuntu 16.04 服务器上使用 Jenkins 设置 hugo 站点的持续部署。我已经按照他们网站上的建议使用snap 安装了hugo。我已经能够让该网站在我的主用户帐户上运行,但是当我尝试让 Jenkins 这样做时,它遇到了这个错误:

cannot create user data directory: /var/lib/jenkins/snap/hugo/1766: Permission denied

这似乎有点奇怪,因为 Jenkins 对该文件夹具有写入权限,如果我正确读取权限的话:

jenkins@computer: ~$ ls -al /var/lib/jenkins/snap/hugo/1766
total 8
drwxr-xr-x 2 jenkins jenkins 4096 May 11 01:33 .
drwxr-xr-x 4 jenkins jenkins 4096 May 11 01:33 ..

我在这里遗漏了什么吗?我还需要做其他事情吗?

【问题讨论】:

    标签: jenkins hugo snapcraft


    【解决方案1】:

    当我试图让詹金斯这样做时

    确保 Jenkins 作业实际上以 jenkins 运行:在您的作业中添加一个步骤以打印 id -a
    可能是:它不是作为 Jenkins 运行的,而是作为您的主帐户运行的,它无权在该文件夹中写入。


    “无法创建用户数据目录”:可能 1766 是用户帐户的 id,作为用户创建。
    检查使用 chmod 777(用于测试)创建(作为您的主帐户)1766 文件夹是否有帮助。

    注意hugo issue 3143 确实提到:

    为了安全起见,快照是只读的。我们希望防止敌对方偷偷更改您机器上的软件,因此您无法修改系统上安装的快照。这也意味着您可以随时检查 snap 上的签名,即使在安装很久之后,也可以确保它仍然是您想要的软件。如果您想修改快照,通常可以构建自己的版本,特别是如果它是开源的。

    那么快照可以在哪里写入数据?每个快照都有自己的一组具有特定属性的可写目录。快照可以独立于用户写入两个目录。其中之一是版本化的 - 每次升级快照时都会保存数据,新的快照修订可以升级其副本。另一个“通用”数据目录没有版本控制,用于存储您不想在 snap 的修订版之间复制的大块数据:

    /var/snap/<name>/current/  ← $SNAP_DATA is the versioned snap data directory
    /var/snap/<name>/common/   ← $SNAP_COMMON will not be versioned on upgrades
    

    通常,配置与快照的系统范围数据一起存储在其中一个中。

    用户主目录中的每个快照也有两个等效的可写目录,可用于分别存储特定于一个用户或另一个用户的快照数据:

    ~/snap/<name>/current/      ← $SNAP_USER_DATA that can be rolled back
    ~/snap/<name>/common/       ← $SNAP_USER_COMMON unversioned user-specific data
    

    您可以使用 Hugo 的 snap 版本在 $HOME 目录内的任何位置写入(即运行 hugo new site 等),例如 ~/tmp/htest,但不能在系统范围内的 @ 987654331@目录。

    匹配"Hugo Install from snap" section:

    由于 Snaps 的限制和安全模型,Hugo-as-a-snap 只能写入用户的 $HOME 目录和用户拥有的 gvfs 挂载目录中

    如果您希望hugo 能够在用户的$HOME 目录之外的其他路径中具有写访问权限,请使用sudo snap install hugo --classic 禁用默认安全模型。

    【讨论】:

    • 脚本在很大程度上是从 Jenkins 帐户运行的。我确实做了id -a 的事情,但是当我第一次进行故障排除时,我是以 Jenkins 用户的身份从控制台运行它
    • @theodinspire 所以你确认,在你的 Jenkins 工作中,在 hugo 命令之前完成的 id -a (顺便说一下,你使用的是哪个 hugo 命令?)确实返回 jenkins?
    • 不幸的是,这对我不起作用。虽然这确实给了我一个最终找到它的想法。我希望我能给一半的功劳。
    • @theodinspire 太棒了!发表你的答案(你也可以接受)
    【解决方案2】:

    我最终通过以下方式解决了这个问题:

    • 使用sudo apt-get remove --purge jenkins 卸载 Jenkins
    • 创建一个名为jenkins的标准用户帐户
    • 重新安装 Jenkins 并
    • 将 Jenkins 工作区根目录设置为 /home/jenkins/workspace/${ITEM_FULL_NAME}

    也可以通过创建一个由 Jenkins 配置文件拥有的目录 /home/jenkins 来解决

    【讨论】:

    • 最重要的是为 Jenkins 创建了一个用户文件夹,这样它就有了可以写入的地方。我想我也可以伪造它:为它创建一个主目录并将所有权分配给 Jenkins 帐户。
    • 这是我在自己的回答开始时所假设的:该进程正在使用一个独立的 Jenkins 帐户运行,具有自己的文件夹。
    猜你喜欢
    • 1970-01-01
    • 2016-11-29
    • 2012-12-29
    • 1970-01-01
    • 2013-01-13
    • 2015-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多