一段时间以来,我一直在努力将网站(主要是 PHP)部署为 .deb 文件,我想知道是否有比我这种相当复杂的方法更好的方法。我的目标是在我的临时服务器上进行持续集成,并从 Jenkins 中一键部署到实时服务器。
我现在的用例:
- 在 OSX 上开发代码
- Git 中的版本控制
- 源包含带有控制、postinst 和 prerm 脚本的 debian/ 文件夹
- Phing 构建脚本在 fakeroot 环境中本地运行
- 将文件复制到 /tmp 构建文件夹中,镜像文件系统布局
- 根据需要将文件所有权设置为 root / www-data
- 运行 dpkg-deb --build ${build.dir} ${working.dir}
- 将包复制到我的 LAN 上的私有 deb 存储库
我曾尝试设置 Jenkins CI 服务器来监视 Git 存储库中的提交并自动执行构建。问题是 Jenkins 以自己的用户身份运行,该用户无权设置上述文件权限。我也找不到在 Jenkins 内部的 fakeroot 环境中运行 Phing 构建的明显方法。
我的问题是:
- 有没有更好的方法来设置正确的文件所有权和权限,而不是必须将所有内容复制到临时目录并进行 Phing 步骤来 chmod 所有内容?
- dpkg-deb 命令真的需要全部文件系统上预先设置的文件权限?我是否可以将某些东西放入 debian/ 文件夹中,以便在安装 .deb 时设置这些权限?
- 如何让 Jenkins 运行具有正确权限来设置文件所有权的构建脚本?
我可能误解了 .debs 的工作原理,但本地文件系统源代码上的文件所有权必须镜像目标,这似乎相当不方便!
我愿意接受有关人们用来执行类似任务的任何其他构建和 CI 系统的建议。
答案1
看起来您几乎是使用 dpkg-deb 命令手动创建二进制 Debian 包。虽然这种方法并不坏,但如果您尝试通过创建源包然后从中构建二进制包(即使它是与体系结构无关的文件,如 PHP 文件)来构建包,您将更好地处理很多事情。这需要一次性配置debian/
目录中的几个文件。
有一个特殊debian/rules
文件决定要运行什么来构建不同风格(即源代码、二进制、二进制独立)的 Debian 软件包并维护构建目录本身。您可以考虑从此文件运行所有构建工具,而不是逐个调用它们。要解决从非特权用户构建期间设置所有者/权限的问题,您需要在fakeroot
包装器下运行构建 Debian 软件包的整个过程。对于官方 Debian 软件包,可以通过运行来实现fakeroot debian/rules binary
。但是,这是从调用的,dpkg-buildpackage
因此您只需运行fakeroot dpkg-buildpackage
。
Debian 的开发者工具非常棒(请参阅软件包debhelper
和devscripts
相关内容),但您似乎没有使用它们(显然是因为您在其他操作系统下构建软件包)。它们将为您节省大量时间。例如,有dh_fixperms
可以为您修复权限和所有权问题、dh_install
将文件放入正确位置、dh_link
创建必要的符号链接和其他dh_
类似脚本的工具。您可能想看看它在现实世界中是如何工作的,因此这里有一个使用 PHP 实现并打包在 Debian 中的软件列表。
另一个适合您的好工具是git-buildpackage它是 Debian 构建工具的包装器,旨在构建在 Git DVCS 下维护的包。
您可能需要查看有关使用 Git 进行构建的常规信息Debian 维基页面。
不幸的是,Debian 中没有 phing,因此您可能需要请别人为 Debian 打包它(这样您就可以在 Debian 中使用完整的构建堆栈)或者只需制作一个 Debian chroot 并debootstrap
在其中手动安装 phing。
如果您坚持使用 Debian 软件包作为主要部署机制以及某些 CI 系统,请考虑以下几点:
- 如果可能,将整个构建堆栈放入 Debian。这将使您能够使用
pbuilder
或等工具在干净的 Debian chroot 中构建软件cowbuilder
。否则,请制作一个 Debian 盒子进行构建。您可能希望创建一个虚拟机并将其提供给其他开发人员。 - 组织一个受限制的 Debian 存储库(创建 GPG 密钥以自动为存储库签名足以减少来自 apt 的警告)并将软件包放在那里。将其添加到目标框的配置文件中。不要忘记导入您的密钥。这将为您提供有关依赖项的信息,如果您在安装阶段之前
/etc/apt/sources.list.d/my-repository.list
安装了软件包,您将不会知道这些信息。dpkg -i *.deb
- 您可能希望定期从软件包安装网站(例如 releases/nightly/etc),而不是每次构建时都安装它们,以节省时间和带宽。我主要使用 rsync 和一些 Makefile 来更新数据库(想法借鉴自 ruby 数据库架构迁移)。
- 您可能希望从 CI 代理运行一些无需密码的管理命令(例如,在使用 更新时重新加载 Web 服务器配置) 。如果是这样,则通过分别修改文件
sudo invoke-rc.d nginx reload
来限制运行确切的命令。/etc/sudoers
答案2
Debian 软件包是一个包含数据和控制信息的多部分档案/debian
。数据档案基本上按原样提取。控制档案被提取并大部分移入/var/lib/dpkg/info
,并在适当的时候调用 pre|post-inst|rm 脚本。如果您想在提取文件后更改某些内容,请在 postinst 中进行更改。
但本地文件系统源代码上的文件所有权必须镜像目标,这似乎相当不方便!
通常,人们会构建一个 chroot 或虚拟机来镜像他们要为其构建软件包的体系结构。尝试从 OSX 为 Debian 系统构建软件包的情况相当少见。
dpkg-deb 命令是否真的需要预先在文件系统上设置所有文件权限?
这是处理权限的正常方式。安装后修改权限是例外,而不是规则。