wkhtmltopdf/packaging

GitHub: wkhtmltopdf/packaging

wkhtmltopdf 的跨平台打包构建系统,通过 Docker 和 Vagrant 实现隔离、可重现的自动化发布流程。

Stars: 363 | Forks: 176

# 打包 wkhtmltopdf 发布版本 打包 wkhtmltopdf 是一项挑战,因为需要使用打过补丁的 Qt 以提供额外功能,以及针对跨平台目标的需求。 特别是对于 Linux,打包的方法已经改变了很多次, 因此最好将其与发布版本本身分离开来。 这将允许根据最新的最佳实践创建包,在静态构建中使用 最新的依赖库,并允许在发布后很久再添加新目标。 所有目标都在单独的容器或 VM 中构建,以确保构建 机器中的任何内容都不会泄漏到输出包中,并且任何人 都可以重现构建。 # 需求 构建机器上的软件需求如下: * `git` 和 `p7zip` * `python` 和 `PyYAML` * `docker` >= 17.05(用于 linux 目标) * 此版本中引入了 `FROM` 中的构建时参数 * Linux 内核 >= 4.8(用于 linux 目标 -- 仅限外架构) * 用于通过 qemu-user-static 进行无缝外架构模拟 * 带有 `virtualbox` 的 `vagrant`(用于非 linux 目标) 在 Ubuntu 20.04 上,可以通过单个命令安装这些: ``` sudo apt install -y python-yaml docker.io vagrant virtualbox p7zip-full ``` 如果你是为非默认架构构建,可能需要启用 `experimental: "true"` 标志以启用 `docker pull --platform`:参见 https://docs.docker.com/engine/reference/commandline/pull/#options 默认情况下,构建系统假定主机系统运行在 x86-64 GNU/Linux 上 并且它将使用 QEMU 在 Docker 中模拟非 x86 平台。 你可以使用 `--no-qemu` 完全禁用 QEMU 或 `--use-qemu ` 强制使用针对你的 主机平台的特定 QEMU 构建版本来覆盖此设置。平台参数遵循 `os/arch(/variant)` 格式。 这两个参数对于从非 x86 平台构建或诊断 QEMU 错误都很有用。 示例: - 从 x86 主机构建不需要参数: $ ./build package-docker buster-amd64 - 在 32 位 ARM 主机上构建 32 位 ARM 包: $ ./build --no-qemu package-docker buster-armhf - 在 AArch64 主机上构建 AMD64 包: $ ./build --use-qemu linux/arm64/v8 package-docker buster-amd64 # 构建系统 只需在顶层文件夹中调用 `./build` 或 `python build`,你会看到 所有可用的命令。`build.yml` 文件包含所有目标的配置 -- 它包含有关使用语法的文档。 包含 wkhtmltopdf(以及 Qt)的源文件夹总是 需要作为参数传递;版本号是根据 git 中的最新提交自动生成的。如果你正在重建带标签的发布版本, 可以选择指定一个 `--iteration`,它包含在文件名中, 这样如果打包脚本不同,就会生成不同的文件名。 请使用 `build list-targets` 查看所有可用目标。 ## Docker 对于构建,只需使用 `./build package-docker` 命令,它将在 `targets` 文件夹中生成一个包。如果你不指定 `--clean`, 它还将保留完整的构建文件夹。 ## Vagrant 基础 VM 镜像是动态拉取并配置的,因此在构建实际开始之前 可能需要大量的时间和带宽。 源代码通过 rsync 推送到 VM,目标包被 拉取到 `targets` 文件夹。 由于构建步骤可能因目标而异,因此对于每个 VM,需要定义一个 “plugin”,其中定义了 `prepare_build` 和 `package_build` 函数,并执行针对该目标的必要步骤。 对于构建,只需使用 `./build vagrant` 命令,它将启动 VM,通过 rsync 将代码同步进去,通过 conan 构建依赖库 并编译 Qt 和 wkhtmltopdf,打包并将包复制到输出文件夹。 # 移植 如果你能让发行版/操作系统支持带有 补丁 Qt 的 wkhtmltopdf,那是最好的,因为这将允许使用原生包管理工具。 如果做不到这一点,请提出一个问题以添加对不同目标的支持。 如果你的目标也需要对 Qt 进行补丁,请确保在 打开 PR 打包目标之前提交并合并它们。 ## Linux 如果 [fpm](https://fpm.readthedocs.io/) 直接支持,你可以构建原生发行版包。 如果 fpm 不支持你的发行版格式,请构建一个 tarball,然后通过手动解压来使用它。 * 如果你正在为 64 位 linux 构建,请找到合适的 docker 镜像 并在 `docker/` 文件夹中的自定义 Dockerfile 中 为其配备所需的工具/库。 * 如果你正在为其他架构构建,如果有 docker 镜像, 那么你可以通过 qemu 使用模拟直接使用它 -- 但请注意这会非常慢 -- 在最近的机器上构建 花费 8 小时以上的情况并不罕见。 * 如果你正在为其他架构构建并且有交叉编译工具链 以及依赖库(静态构建或从镜像中提取), 那么在 Dockerfile 中配置所有内容,然后 指定一个交叉编译前缀。 请查看现有定义并将它们作为制作 工作包的基础。如果你卡住了,请在相关问题 上进行讨论。 ## 非 Linux 这需要在 Vagrant Cloud 上有一个基础 box。查看现有 定义并将它们作为制作工作包的基础。如果你卡住了, 请在相关问题进行讨论。
标签:Docker, Hakrawler, HTML转PDF, PDF工具, Python, QEMU模拟, Vagrant, VirtualBox, wkhtmltopdf, 二进制发布, 安全防御评估, 容器化构建, 开源工具, 开源框架, 恶意代码分类, 持续集成, 数据集, 文档生成, 无后门, 构建系统, 特权提升, 网络安全研究, 自动化部署, 请求拦截, 跨平台编译, 身份验证强制, 软件打包, 逆向工具, 配置修复, 静态构建