build立和部署网站作为.deb包的最佳方式

我一直在努力将(主要是PHP)网站部署为.deb文件一段时间,并想知道是否有比我相当复杂的方法更好的方法。 我的目标是在我的登台服务器上进行持续集成,并通过一键式部署到Jenkins内的现场服务器。

我的用例现在:

  • 在OSX上开发代码
  • Git中的版本控制
  • 源包含debian /文件夹与控制,postinst和prerm脚本
  • Phing构build脚本在fakeroot环境中本地运行
    • 将文件复制到镜像文件系统布局的/ tmp build文件夹中
    • 将文件所有权设置为root / www-data
    • 运行dpkg-deb –build $ {build.dir} $ {working.dir}
    • 将包复制到我局域网上的专用deb库

我试图build立一个Jenkins CI服务器来观察Git仓库提交并自动执行构build。 问题在于Jenkins以自己的用户身份运行,他们没有像上面那样设置文件权限的权限。 我也看不到一个明显的方法来在Jenkins内部的fakeroot环境中运行Phing版本。

我的问题是:

  • 有没有更好的方法来设置正确的文件所有权和权限,而不是将所有内容复制到一个临时目录,并有一个Phing步chmod的一切?
    • dpkg-deb命令是否真的需要事先在文件系统上设置的所有文件权限? 有没有什么东西,我可以放在debian /文件夹,将安装.deb时设置这些权限?
  • 我怎样才能让jenkins运行一个有正确的权限来设置文件所有权的构build脚本?

我可能误解了.debs的工作方式,但是看起来相当不方便的是,本地文件系统源代码的文件所有权必须镜像到目的地!

我接受任何其他构build和CI系统上人们用来执行类似任务的build议。

看来你几乎手工使用dpkg-deb命令创build了一个二进制debian软件包。 虽然这种方法并没有那么糟糕,但是如果您尝试通过创build源包来构build包,然后构build二进制包(即使它是独立于架构的文件,如PHP包),也可以更好地处理很多事情。 。 这需要在debian/目录下一次性configuration好几个文件。

有一个特殊的debian/rules文件,它决定了为了构build不同风格的Debian软件包(即源代码,二进制文件,二进制无关文件)以及维护构build目录本身所要运行的内容。 你可能会考虑从这个文件中运行所有的构build工具,而不是逐个调用它们。 要解决这个问题,在从非特权用户的构build过程中设置所有者/权限,您需要运行在fakeroot包装下构buildDebian包的整个过程。 对于官方的debian软件包,这可以通过运行fakeroot debian/rules binary来实现。 然而,这是从dpkg-buildpackage调用的,所以你只需要运行fakeroot dpkg-buildpackage

Debian在开发工具方面非常出色(参见软件包debhelperdevscripts和相关的debhelper ),看起来你并没有使用它(显然是因为你在另一个操作系统下构build了这个软件包)。 他们会为你节省很多时间。 例如,有dh_fixperms将修复您的权限和所有权问题, dh_install将文件放置到正确的位置, dh_link创build必要的符号链接和其他dh_的脚本。 你可能想看看它在现实世界中是如何工作的,所以这里是一个用PHP实现的软件列表,并且打包在Debian中 。

另一个好的工具是git-buildpackage ,它是debian构build工具的包装器,用于构build在Git DVCS下维护的包。

您可能需要查看在Debian wiki页面上使用Git构build的一般信息。

不幸的是,在Debian中没有phing,所以你可能想问问别人为Debian打包(这样你就可以在Debian中获得完整的构build栈),或者只是用debootstrap来做一个Debian chroot,然后手动安装phing。

如果你坚持把Debian软件包作为一个主要的部署机制和一些CI系统一起使用,这里有一些要点:

  1. 如果可能的话,将整个构build堆栈获取到Debian中。 这将使您可以使用pbuildercowbuilder等工具在干净的Debian chroot中构build软件。 否则,做一个Debian的盒子build设。 您可能想创build一个虚拟机,并为其他开发人员提供。
  2. 组织一个受限制的Debian仓库(为存储库自动签名创buildGPG密钥足以减less来自apt的警告)并将其放在那里。 将其添加到目标框的/etc/apt/sources.list.d/my-repository.listconfiguration文件中。 不要忘记导入您的密钥。 这将为您提供有关依赖关系的信息,如果您仅使用dpkg -i *.deb安装包,则直到安装阶段本身才会知道这些依赖关系。
  3. 您可能需要定期从软件包安装站点(如发布/ nightly / etc),而不是在每个构build中安装它们以节省时间和带宽。 我主要使用rsync和一些Makefile来更新数据库(从ruby数据库模式迁移中借鉴的想法)。
  4. 您可能希望从CI代理程序运行一些没有密码的pipe理命令(例如,使用sudo invoke-rc.d nginx reload更新web服务器configuration时,如果是,则分别通过修改/etc/sudoers文件限制运行精确命令。

Debian软件包是一个包含数据和控制信息/debian的多部分档案。 数据存档基本上是按原样提取的。 控制归档文件被提取出来,大部分移动到/var/lib/dpkg/info ,适当的时候会调用pre | post-inst | rm脚本。 如果你想在你的文件被提取后改变一些东西,那就在你的postinst中做。

但是在你本地文件系统源代码上的文件所有权必须镜像到目的地似乎相当不方便!

通常,人们将构build一个chroot或虚拟机,以反映他们构build软件包的体系结构。 试图从OSX构build一个Debian系统的包是非常罕见的。

dpkg-deb命令是否真的需要事先在文件系统上设置的所有文件权限?

这是权限处理的正常方式。 修改权限后安装是例外,而不是规则。