为开发和生产环境管理软件依赖关系的最佳实践

Best practice to take manage software dependencies for the development and prod environments

对于使用 golang、python 并在 ubuntu linux 上运行的项目,我正在寻找管理软件依赖项的最佳方法。对于 Go,我们使用 go modules,对于 python pip 和 anaconda。该项目的许多部分也 docker 化(数据库、mlflow 服务器等)。

我想要一个自动安装所有要求的系统:

并且在任何时候当依赖项有新的添加时,系统应该执行所需的更新。比如我们更新go版本或者添加helm,避免开发者在运行项目时遇到错误。

我正在考虑甚至在 Docker 容器内开发,它安装了所有依赖项。但似乎 GoLang 与 docker 容器内部开发的集成并不是开箱即用的体验。另外,我不想对团队过于专横。所以,理想情况下,应该有一个工具可以在本地机器上安装所有东西。而且,如果我们中的一些人确实决定在容器内部开发,我可以在 docker 内部使用相同的工具。

有很多工具和方法可以完成您所说的事情,所以没有一个答案。在较高级别,您需要选择要如何分发更新:

  1. OS 图像 - 使用像 Hashicorp 的加壳器这样的工具来创建具有所有先决条件的自定义 OS 图像。
  2. Container - 使用像 docker 这样的工具来创建包含所有依赖项的容器。
  3. 包级别 - 使用像 ansible 或 chef 或 salt 这样的工具来安装你需要的依赖项。

大多数人最终会结合使用上述方法。

无论如何,如果我处在你的位置,我会从 ansible 开始,然后从那里开始。这是一个很好的工具,您可以根据需要迭代更复杂的东西。

ansible playbook 是一个 yaml 文件。例如:

- hosts: localhost
  tasks:
      - name: install required packages
        apt:
           pkg:
           - golang
           - python3
           - docker
           - docker-compose
           - unattended-upgrades
           update_cache: yes

像这样执行:

ansible-playbook playbook.yml

将其签入源代码管理并分发给您的开发人员等