来自源存储库的自定义软件
OpenFactory 配方可以引用 Git 存储库作为支持的映像生成器上的自定义包输入。这是供应链敏感的路径:存储库、已解决的修订版、打包说明、构建依赖项和生成的包都需要审查。
支持是针对特定目标的。某些构建器会拒绝源包构建,包括当前的 Raspberry Pi 和 Proxmox 路径。在承诺生产包之前,请确认标准化配方和构建计划中的可用性。
配方形状
自定义包条目位于 os.custom_packages 下:
{
"os": {
"custom_packages": [
{
"name": "my-agent",
"git_url": "https://github.com/example/my-agent.git",
"branch": "release-1.x"
}
]
}
}该模式接受分支名称,而不是不可变的提交字段。对于受控版本,记录构建解决的确切提交,并使该提交成为保留来源的一部分。单独的移动分支不是可复制的输入。
准备存储库
当前包路径需要适合目标的本机打包元数据。常见的示例是 Debian debian/ 目录或 RPM 规范。确切的构建器行为和支持的目标版本可能会发生变化,因此请在已部署环境中验证最小包,而不是依赖静态兼容性表。
对于 Debian 打包,至少检查:
debian/control用于源/二进制身份和依赖项;debian/changelog为封装版本;debian/rules和其他可执行维护者脚本;- 安装清单和系统单元;和
- 许可和捆绑的第三方材料。
对于 RPM 打包,请查看规范的来源、构建要求、脚本、文件列表和许可证元数据。
永远不要假设存储库所有权使其构建脚本安全。包构建在构建基础设施的隔离边界内执行不受信任的源和打包逻辑。
其他包控件
原生包
对所选发行版或显式配置的存储库已提供的软件包使用os.packages:
{
"os": {
"packages": ["curl", "jq"]
}
}包覆盖
os.package_overrides 可以声明add、remove 或replace 意图:
{
"os": {
"package_overrides": [
{"name": "nano", "action": "replace", "replacement": "neovim"},
{"name": "telnet", "action": "remove"}
]
}
}覆盖并不能证明依赖解析尊重它。验证最终的包裹库存和缺席/存在断言。
附加存储库
os.extra_repos 是高级输入。不要添加未签名的 HTTP 存储库,如旧示例中所示。经批准的存储库集成需要 HTTPS 传输、固定签名密钥、签名实施、适合包管理器的发布元数据以及记录的所有权和更新策略。如果当前构建器无法表示这些信任控制,则不要使用存储库。
验收证据
对于每个自定义包,请保留:
- 存储库 URL 和已解析的提交;
- 来源和声明的许可证审查;
- 构建环境和依赖快照;
- 构建日志和生成的包名称/版本/架构;
- 包摘要和存储库签名证据(如果适用);
- 显示已安装软件包的最终图像清单;
- 服务或可执行的冒烟测试;和
- 删除和升级行为。
成功的源代码包阶段还不够。映像构建稍后可能无法使用该包,并且已安装的包仍然无法使用。
故障排除
- 打包元数据被拒绝: 使用相同的发行版和架构在本地验证本机包。
- 构建依赖项缺失: 使用该目标的已批准存储库中可用的依赖项;不要在维护者脚本中默默地获取任意二进制文件。
- 图像中缺少软件包: 将生成的二进制软件包名称与标准化安装请求和最终清单进行比较。
- **版本未更改:**更新本机版本元数据并确认新的源提交已解决。
- **服务失败:**检查其单元、运行时依赖关系、权限和来宾日志;在重建之前添加行为级断言。