如何使用 rc.d 脚本从 python 应用构建 FreeBSD pkg?

How to build FreeBSD pkg from python app with an rc.d script?

我有一个带有 setup.py 的 python 应用程序,可以通过 setuptools. I am then packaging it up in DEB and PKGNG using the excellent Effing package management. I've also made some quick tests with setuptools-pkg 安装它并且似乎也可以正常工作。

现在我需要将包含初始化脚本的包分发到 start/stop/manage 服务。我在源代码库中有我的初始化脚本,根据 what seems to be best practice,我没有在 setuptools 中对它们做任何事情,我在 os-specific 包装中处理它们:for debian-based我根据需要使用 --deb-init--deb-upstart--deb-systemd FPM 选项。

如何使用 FPM 或通过任何其他方式构建包含正确 rc.d 脚本的 FreeBSD 软件包?

我看到的所有示例都是在通过 ports collection 构建包时添加 rc.d 脚本,但这是一个内部应用程序,不会发布到 Ports 或皮皮。我希望能够在 FreeBSD 系统上查看 repos 目录,启动一个给我一个包的命令,将它分发到其他 FreeBSD 系统,使用 pkg 安装它并使用我的初始化脚本正确部署到 /usr/local/etc/rc.d/<myappname>。没有必要继续使用 FPM,只要它给我一个格式正确的包,任何东西都可以。

无论是否要发布,我都强烈建议创建您的包,就好像它是任何其他端口一样。

您可以通过这样做继承的优势之一是您还可以包括所有测试和自动化部署,开箱即用,为继续 integration/delivery 设置打下基础。

查看 poudriere。您确实可以使用您自己的设置维护一组自定义端口,并将它们轻松地分布在您的环境中:

pkg install -r your-poudriere yourpkg

如果这可能太多或可能不能很好地适应您的用例,您可以随时回退到 ansible, in where you could create a custom rc.d within a template of an ansible role

如果您只想构建和部署一些东西,比方说微服务,那么可能 pkg 不是最好的工具,也许您只需要一个可以在所有平台上工作的主管 (sysutils/immortal) 这样您就可以分发您的代码并为 starting/stoping 服务提供单一配方。

可能是执行此操作的正确方法™,我可能会创建自己的“端口”并使用它在中央主机上构建包。

在我最初提出问题时,我采用了不同的方法,为了完整起见,我在此报告。

我仍在使用 fpm -s python -t freebsd 构建应用程序包(即 myapp-1.0.0.txz),它基本上使用 Python 的 setuptools 基础设施来获取必要的信息,但我不不包含任何 rc.d 文件。

我还构建了第二个包,我将使用源目录类型(即fpm -s dir -t freebsd)调用myapp-init-1.0.0.txz并且我只包含init该包中的脚本。

两个包都分发到主机并安装,从而解决了我的分发问题。