【问题标题】:Continuous Delivery for FUSE OSS and GithubFUSE OSS 和 Github 的持续交付
【发布时间】:2014-05-29 15:48:06
【问题描述】:

我想为我的开源应用程序设置一个持续交付周期。它基于 Linux 的用户空间文件系统 (FUSE)。我试图在CloudBees' Jenkins 上设置它,它提供了不错的免费帐户,但我没有 root 访问权限,这是有问题的,因为我的项目有很多依赖项。我继续使用Travis CI,它非常适合测试内部 API,因为我拥有安装依赖项的 root 访问权限。但它确实not support FUSE,所以我不能直接在文件系统上运行测试。 根据我使用 Travis CI 的经验,持续交付方法可能会阻止许多错误的发布,并有助于更快地发现问题。

有没有类似Travis CI的服务,集成Github,允许root访问,支持FUSE?

[编辑]
六。建议在 Travis-ci 机器上运行用户模式 ​​Linux,以模拟 FUSE。总结在 Vi.s 帮助下取得的进展:

  1. 要设置具有更多内存、网络访问和文件系统访问权限的 UML,请执行:

    /usr/bin/linux.uml init=script_to_run.sh rootfstype=hostfs rw eth0=slirp mem=2G
    

在用户脚本中,调用:

# Enable fuse module.
insmod /usr/lib/uml/modules/`uname -r`/kernel/fs/fuse/fuse.ko

# Set up TCP/UDP network access.
ifconfig lo up
ifconfig eth0 10.0.2.15
ip route add default via 10.0.2.1
  1. 如果您使用 gcc,请设置您的 PATH 变量:

    export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
    
  2. 如果需要 procfs,请在 UML 中执行:

    mount none /proc -t hppfs
    
  3. 对于 Python,您应该激活 UML 中的虚拟环境:

    source /home/travis/virtualenv/python2.6.9/bin/activate
    

activate 的路径可以通过在启动 UML 之前发出以下命令来找到:

echo "Path to Python executable: "$(which python)

我仍然无法运行 FUSE:

简而言之:

`fuse' likely not compiled with -mcmodel=kernel
insmod: error inserting '/usr/lib/uml/modules/3.2.2/kernel/fs/fuse/fuse.ko': -1 Invalid module format
modprobe: FATAL: Could not load /lib/modules/3.2.2/modules.dep: No such file or directory
modprobe: FATAL: Could not load /lib/modules/3.2.2/modules.dep: No such file or directory
[...]
fuse: device not found, try 'modprobe fuse' first        

【问题讨论】:

  • 也许 UML(用户模式 ​​linux)可以作为一种解决方法?
  • 如果我理解正确的话,这类似于虚拟机。我必须检查为每个测试设置它需要多少资源,也看看这个解决方案是否可行。感谢您的建议。

标签: github fuse continuous-delivery


【解决方案1】:

Travis-CI 允许安装系统包,包括 UML(用户模式 ​​Linux)。

您可以在 UML 中启动您的应用程序(使用帮助脚本)。示例:https://travis-ci.org/vi/execfuse/builds/47789978

这里是帮助脚本:

#!/bin/bash

CURDIR="`pwd`"

cat > umltest.inner.sh <<EOF
#!/bin/sh
(
   export PATH="$PATH"
   set -e
   set -x
   insmod /usr/lib/uml/modules/\`uname -r\`/kernel/fs/fuse/fuse.ko
   cd "$CURDIR"
   ./tests.sh
   echo Success
)
echo "\$?" > "$CURDIR"/umltest.status
halt -f
EOF

chmod +x umltest.inner.sh

/usr/bin/linux.uml init=`pwd`/umltest.inner.sh rootfstype=hostfs rw

exit $(<umltest.status)

.travis.yml中的补充命令:

- sudo apt-get install -qq libfuse-dev pkg-config fuse user-mode-linux
- sudo mknod /dev/fuse c 10 229
- sudo chmod 666 /dev/fuse

【讨论】:

  • @phobic,我可以创建一个支持网络的脚本版本。最简单的模式:eth0=slirplinux.uml 命令行,然后在脚本中 ifconfig lo up; ifconfig eth0 10.0.2.15; ip route add default via 10.0.2.1。请注意,ping 不起作用,但 TCP 和 UDP 应该可以工作。 slirp 需要安装包。手动:user-mode-linux.sourceforge.net/old/UserModeLinux-HOWTO-6.html
  • @phobic,UML 中有适当的选项。试试linux.uml --help。您可以像往常一样从容器内部挂载 procfs mount -t proc proc /proc。就性能而言,我预计系统调用的速度会降低 50 倍左右,CPU 密集型计算的速度可能会降低 2 倍。
  • 看起来像设置正确的PATH(即export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin)固定gcc。也许它也会修复其他程序。
  • @phobic,它告诉你加载模块。尝试使用insmod 显式加载它。请参阅此答案中的示例脚本;注意uname -r 周围的转义反引号。他们将加载 UML 的模块,而不是主机内核的模块。您还可以指定init=/bin/bash(不在 Travis 这边,在您的本地主机上)并在部署到 Travis 之前更直接地在 UML 中进行试验。
  • 我看到这个错误:overflow in relocation type 11 val e15d0fc0; 'fuse' likely not compiled with -mcmodel=kernel。您是否更改了 UML 参数中的任何内容,或者 Travis 方面的内容发生了变化?我会尝试重新测试我的案例。更新:重新审视了我的构建:travis-ci.org/vi/execfuse/builds/48371659,它起作用了。也许mem=2G
猜你喜欢
  • 2013-04-20
  • 1970-01-01
  • 2018-12-05
  • 2017-02-22
  • 2012-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多