python tox,创建 rpm virtualenv,作为 ci 管道的一部分,不确定工作流程中的位置

python tox, creating rpm virtualenv, as part of ci pipeline, unsure about where in workflow

我正在研究 Python 应用程序如何也可以使用 CI 管道,但我不确定如何创建标准工作流程。

Jenkins 用于做初始仓库克隆,然后启动tox。基本上这是 maven and/or msbuild 获取依赖包并构建的地方....tox 通过 pip 完成的,所以这里一切都很好。

但现在对于令人困惑的部分,管道的最后一部分是创建和上传包。开发人员可能会将创建的包上传到本地 pip 存储库,但随后也可能会创建部署包。在这种情况下,它需要是一个包含应用程序 virtualenv 的 RPM。我已经使用 rpmvenev 手动制作了一个,但不管它是如何制作的,如何将这样的步骤添加到 tox 配置中?如果是 rpmvenv,它会创建自己的 virtualenv,可以说是一个自包含的命令。

我喜欢用 Unix 哲学来解决这个问题。有一个工具可以非常好地完成一件事,然后将其他工具组合在一起。 Tox 是专门为 运行 在一堆不同的 python 环境中进行测试而构建的,因此使用它为您构建 deb / rpm / 等我觉得有点滥用该工具。仅对 运行 所有测试使用 tox 可能更容易,然后根据结果在您的管道中有另一个步骤处理为刚刚测试的内容构建包。

Jenkins 2.x 在撰写本文时是相当新的,似乎在构建管道方面要好得多。 BuildBot 正在经历大量的开发,并且已经使得为此构建良好的管道变得相当容易。

我们在工作中所做的是

  • AWS 中的 Buildbot 从 Github 的 PR
  • 接收推送通知
  • 这将启动一个 docker 容器,该容器会引入当前代码和 运行s Tox(py.test、flake8,以及量角器和茉莉花测试)
  • 如果 tox 步骤恢复干净,启动另一个 docker 容器来构建 deb 包
  • 将该 deb 包推送到 S3 并让 Salt 处理告诉那些机器更新

该 deb 包也可以作为构建工件使用,类似于 Jenkins 1.x 所做的。一旦我们准备好进行暂存,我们只需将该包手动提升到暂存 debian 仓库。将其滚动到产品中也是如此。

我发现对这一切有用的工具:

  • Buildbot 因为它在 Python 中,因此我们更容易处理,但 Jenkins 也能正常工作。无论如何,这是整个管道的控制器
  • Docker 因为每个构建都应该与其他构建完全隔离
  • 通过光荣的测试运行无法处理所有这些细节
  • fpm 构建包。 RPM、DEB、tar.gz,随便什么。非常可配置且易于编写脚本。
  • Aptly 使管理 debian 存储库变得容易,特别是将它们推送到 S3。