Skip to Content
Building Os来自源存储库的自定义软件

来自源存储库的自定义软件

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 可以声明addremovereplace 意图:

{ "os": { "package_overrides": [ {"name": "nano", "action": "replace", "replacement": "neovim"}, {"name": "telnet", "action": "remove"} ] } }

覆盖并不能证明依赖解析尊重它。验证最终的包裹库存和缺席/存在断言。

附加存储库

os.extra_repos 是高级输入。不要添加未签名的 HTTP 存储库,如旧示例中所示。经批准的存储库集成需要 HTTPS 传输、固定签名密钥、签名实施、适合包管理器的发布元数据以及记录的所有权和更新策略。如果当前构建器无法表示这些信任控制,则不要使用存储库。

验收证据

对于每个自定义包,请保留:

  • 存储库 URL 和已解析的提交;
  • 来源和声明的许可证审查;
  • 构建环境和依赖快照;
  • 构建日志和生成的包名称/版本/架构;
  • 包摘要和存储库签名证据(如果适用);
  • 显示已安装软件包的最终图像清单;
  • 服务或可执行的冒烟测试;和
  • 删除和升级行为。

成功的源代码包阶段还不够。映像构建稍后可能无法使用该包,并且已安装的包仍然无法使用。

故障排除

  • 打包元数据被拒绝: 使用相同的发行版和架构在本地验证本机包。
  • 构建依赖项缺失: 使用该目标的已批准存储库中可用的依赖项;不要在维护者脚本中默默地获取任意二进制文件。
  • 图像中缺少软件包: 将生成的二进制软件包名称与标准化安装请求和最终清单进行比较。
  • **版本未更改:**更新本机版本元数据并确认新的源提交已解决。
  • **服务失败:**检查其单元、运行时依赖关系、权限和来宾日志;在重建之前添加行为级断言。