将生产中的所有 python 包升级到最新版本是一个好习惯吗?

Is it a good practice to upgrade all python packages in production to their latest versions?

我是 运行 一个相当复杂的 Django 应用程序,大约一年了。它在 requirements.txt

中有大约 50 个包

每当我需要一个新的包时,我用pip安装它,然后用固定版本手动添加到requirements.txt文件中:

SomeNewModule==1.2.3

这意味着我的大部分包裹在一年后就已经过时了。当我特别需要一个新功能时,我已经手动更新了其中的几个。

我开始认为我可能遗漏了一些安全补丁,但由于向后不兼容,我不愿意盲目地全部更新它们。

有这方面的标准最佳实践吗?

不要在生产中更新包,你可以阻止事情,如果你有一个包在数据库中有表,你更新它你可以阻止你的数据库。例如,我使用 python 社交身份验证,我想将它升级到最新版本,为此,我需要它升级版本 x,运行 迁移,然后升级到最新版本并迁移. 升级开发环境中的包,测试它。如果您有预生产,请在开发中测试后在那里进行。

业内最稳健的做法之一是确保您的代码经过良好的单元测试、属性 测试和回归测试。一旦您获得了良好的覆盖率并且测试是绿色的,就开始升级您的依赖项。如果你有雄心壮志,你可能想一次做一个,或者你可以全力以赴试试你的运气。如果在升级后您的测试仍然是绿色的并且您可以手动完成所有工作流程,那么您很可能没有问题!然后可以利用您花时间进行的那些测试,以进行任何较小的增量升级。

首先,介绍一下我的背景。我是一名安全测试工程师,主要从事 Python,据说我的大部分工作都是测试代码,我通常从事的产品不随 Python 运行框,所以我无法直接回答有关特定 Python 软件包的问题。我可以给你一些经验法则,关于大多数公司在一般意义上面对此类问题时的做法。

确定是否需要更新:

  1. 运行 安全扫描器(如 Nessus)。如果您的应用程序堆栈或主机有任何明显的版本问题,Nessus 会给您一些应该立即修复的想法

  2. 检查所有软件包的发行说明,看看是否有任何内容确实需要更新。格外注意任何打开套接字的包。如果没有安全修复程序,可能不值得您花时间进行更新。在某些情况下,即使包中存在安全问题,也可能是您没有使用的东西,因此请注意问题描述。如果您现在在生产中有一个应用程序,通常目标是尽可能少地更改以限制需要完成的代码更新和测试量。

如果您发现需要更新才能开始解决依赖关系:

  1. 最简单的方法可能是设置测试环境并开始安装您需要的更新版本。再次尝试在测试环境中安装代码时尽可能进行一些更改。在 Python 中,大部分安全性都依赖于 C 库,在您的测试环境中,确保也有相同的较低级别的系统库...

  2. 创建需要进行的更改列表,并开始为需要替换的代码部分设计测试计划。

设置好开发环境后,测试测试测试。您可能需要重新运行您的安全扫描器并确保运行所有新代码。

版本控制 python 模块(以及许多其他软件)的通用模式是 major.minor.patch 在初始版本之后,补丁版本不会更改 api,次要版本可能会以向后兼容的方式更改 api,而主要版本通常不向后兼容

因此,如果您有 module==x.y.z a 相对安全的要求规范,则为:

module>=x.y.z,<x.y+1.0

请注意,虽然这通常没问题,但它是基于常见做法,并不能保证一定有效,并且它更有可能在 "organized" 个模块中稳定

你完全正确。会有向后不兼容的问题。不要盲目更新包到最新。您很可能会遇到 package/module/class/variable/key undefined/notFound 个问题。特别是你有一个复杂的系统。即使你使用 pip install --upgrade somepackage

这是我的真实经历。

视情况而定。大多数时候,为次要版本更改(例如:2.45.1 -> 2.56.1)更新包不太可能破坏您的系统。但是,仍然建议 运行 进行广泛的回归测试。但是,绝对应该避免主要版本更改(例如 2.45.1 到 3.13.0),因为它们中的大多数几乎没有向后兼容性。这方面的一个例子是 selenium web 驱动程序,与 2.56 版相比,它在 3.0 版中不能 运行 没有 geckodriver。无论如何,应该对新旧代码进行广泛的单元和回归测试,以确保没有意外的变化,尤其是在极端情况下。

考虑到您提到过您只使用一个 python pip,我可以说这将是未来程序的一个问题,因为您可能需要使用相同的不同版本不同项目的包。

避免此类问题的可接受做法是为每个项目使用虚拟环境。只需在项目根目录中创建一个 makefile 并使用: virtualenv --python=${PYTHON} 环境 env/bin/pip 安装 --upgrade pip env/bin/pip --upgrade setuptools wheel pip-tools

然后 env/bin/pip 从您的 requirements.txt 文件安装要求。