跳转到: 导航, 搜索

Cinder/3rdParty-drivers-py3-update

使用哪个 Python 3?

在 Ussuri 虚拟中期会议(第二环节,2020 年 3 月 16 日),Cinder 团队同意新的第三方 CI 系统应该

  • 理想情况下,使用该周期中的所有 Python 运行时进行测试
  • 否则,至少使用该周期中的一个运行时进行测试


如果您选择 Python 3.6(当前允许的最低版本),请注意,您必须跟踪每个开发周期中的 OpenStack Python 运行时,因为最终 Python 3.6 将不再受支持。

当前的 Python 运行时由 OpenStack 技术委员会确定。请参阅 OpenStack 管理文档中的 已测试的运行时

Cinder 第三方 CI 更新到 Python 3.7

此页面的关键点是分享有关将第三方 CI 更新为运行 Python 3.7 的技巧。(请随意跳到那部分!)

背景

Python 2(也就是说,Python 2 本身,而不仅仅是 OpenStack 对 Python 2 的支持)于 2020 年 1 月 1 日终止生命周期。这意味着 OpenStack 的 Train 版本将是支持 Python 2 的最后一个版本。OpenStack 技术委员会宣布将在 U 开发周期的开始阶段(即 2019 年底)完全停止 Python 2 支持。

参考:2018-05-29 Python2 弃用时间表

这对 Cinder 第三方 CI 的意义

Walt 在 邮件列表 中解释说

Cinder 的各位,

Train 版本将是 OpenStack 支持 Python 2 的最后一个版本。Train 版本也将需要支持 Python 3.6 和 3.7。这意味着我们应该启用或切换我们所有的第三方 CI 运行到 Python 3,以确保我们的驱动程序及其所有必需的库在 Python 3.6/3.7 环境中正常运行。这将帮助驱动程序维护者发现驱动程序与 Python3 的任何不兼容性以及任何必需的库。在丹佛的 PTG 会议上,Cinder 团队同意我们希望驱动程序 CI 系统在 Train 的第二个里程碑之前开始使用 Python3,即 7 月 22-26 日 [1]。

我们还在致力于将驱动程序库需求添加到 OpenStack 全局需求项目中 [2] [3]。这项工作将为 Cinder 中的驱动程序库提供本地安装原语。此过程还需要驱动程序库在 python3.6/3.7 中运行。

Cinder 团队希望保持其在 Train 版本中高质量的驱动程序支持。通过在 CI 测试中启用 Python 3.6 和 Python 3.7,这将帮助每个人在 Train 和后续版本中发布带有所需支持的 Cinder。

Walt

[1] https://releases.openstack.org/train/schedule.html

[2] https://review.opendev.org/#/c/656724/

[3] https://review.opendev.org/#/c/657395/

Jay 随后发表了一篇 补充说明,指出 Cinder 团队希望在 Train 的第二个里程碑(7 月 22 日那周)之前看到驱动程序在 CI 环境中运行 Python 3。

由于 OpenStack 的 Train 版本应该支持 Python 3.6 和 Python 3.7,因此您的 CI 仅运行 3.7 是可以接受的,因为理论上在 3.7 中运行的任何内容也将在 3.6 中运行。

将您的 CI 转换为 Python 3 的技巧

请分享您的经验以帮助其他 CI 维护者。如果您无法编辑此 wiki 页面(由于 2017 年一场严重的垃圾邮件风暴而限制了权限),请将您的评论发布到 paste,并联系 jungleboyj、smcginnis 或 rosmaita 在 #openstack-cinder IRC 频道,我们将为您添加它们。

最新的运行时可能无法作为您正在使用的发行版的软件包提供,但这是可以接受的。较新版本可以从第三方软件包仓库(PPA 或其他 RPM 仓库)安装,或者通过直接安装 Python 运行时源代码 安装。另一个据报道效果良好的选项是使用 pyenv Python 版本管理器

基于 Ubuntu 的 CI

Chris M 报告说,如果您正在运行 Ubuntu 16.04,您可以非常容易地转换。(但他还报告说,他只在尝试了许多其他不起作用的东西之后才发现这有多么容易。特别是,他说“我最初的想法是将我的 CI 更新到 Ubuntu 18.04(Bionic Beaver)以获得对 Python 3.7 的原生支持,但 Ubuntu 云镜像中的内核在启动嵌套虚拟机时崩溃了,所以我回到了 16.04 并使用“deadsnakes” PPA 加载 Python 3.7 到 Xenial。”)

所以您可以从他所学到的东西中受益,Chris 成功地将他的 Ubuntu 16.04 CI 转换为运行 Python 3.7 通过执行以下操作

在 Ubuntu 16.04 上运行 stack.sh 之前的关键步骤

   add-apt-repository ppa:deadsnakes/ppa
   apt-get -q update
   apt-get install -y python3.7

要添加到 local.conf 的行

   [[local|localrc]]
   USE_PYTHON3=True
   PYTHON3_VERSION=3.7
   :

使用 pyenv

另一种可能性是使用 pyenv 构建您想要的任何版本的 python。

与 virtualenv 不同,pyenv 不使用系统 python 作为基础——它从头开始构建 python。它为您提供了大量的可安装 python 选择,它具有支持选项卡补全的 CLI,允许用户设置他们的全局 python 版本,可以为每个项目设置本地 python(您在项目根目录中添加一个 .python-version),并且您可以设置多个本地 python(按优先级顺序)以供 tox 使用。

要安装它,您需要一些先决条件,因为您将编译自己的 Python 解释器。例如,对于 Ubuntu 16.04

 sudo apt-get install -y make build-essential libssl-dev zlib1g-dev libbz2-dev \
   libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev \
   xz-utils tk-dev libffi-dev liblzma-dev python-openssl git

对于 Fedora

 sudo dnf install zlib-devel bzip2 bzip2-devel readline-devel sqlite sqlite-devel \
   openssl-devel xz xz-devel libffi-devel python-devel python3-devel
 sudo dnf group install 'C Development Tools and Libraries'

这些大致是您需要的软件包。您不必自己搜索其他发行版的等效项:有一个方便的 wiki 页面可以参考

https://github.com/pyenv/pyenv/wiki/Common-build-problems

您将 pyenv 安装为普通用户。

简单的方法

 curl -L \
   https://raw.githubusercontent.com/pyenv/pyenv-installer/master/bin/pyenv-installer \
   | bash

(它将输出一些指示,以将一些内容添加到您的 .bash_profile,或者可能自动为您添加它们。)

稍微不那么简单但更透明的方法

 mkdir -p ~/.pyenv
 git clone git://github.com/pyenv/pyenv.git ~/.pyenv
 git clone git://github.com/pyenv/pyenv-which-ext.git ~/.pyenv/plugins/pyenv-which-ext
 git clone git://github.com/pyenv/pyenv-virtualenv.git ~/.pyenv/plugins/pyenv-virtualenv
 git clone git://github.com/pyenv/pyenv-doctor.git ~/.pyenv/plugins/pyenv-doctor

(还有其他插件,您可以在 github 上四处查看。而且您不需要全部这些,它们只是我经常使用的。)

然后将一些内容添加到您的 .bashrc 

 cat << 'EOF' >> ~/.bashrc
 # set up pyenv
 export PYENV_ROOT="$HOME/.pyenv"
 export PATH="$PYENV_ROOT/bin:$PATH"
 # enable shims and completions for pyenv
 if command -v pyenv 1>/dev/null 2>&1; then
   eval "$(pyenv init -)"
   eval "$(pyenv virtualenv-init -)"
 fi
 EOF

打开一个新的 shell。pyenv-doctor 插件检查您是否安装了所有依赖项。使用以下命令调用它

 $ pyenv doctor

一些有用的 pyenv 命令

 # list all available python versions
 $ pyenv install -l
 # install a version
 $ pyenv install <version>
 # list installed versions (virtualenvs show up here, too)
 $ pyenv versions
 # set global python for current user
 $ pyenv global <version>
 # create a virtualenv (using currently active python version)
 $ pyenv virtualenv <name>
 # create a virtualenv with a specific version of python
 $ pyenv virtualenv <version> <name>
 # activate/deactivate virtualenvs
 $ pyenv activate <name>
 $ pyenv deactivate
 # list virtualenvs
 $ pyenv virtualenvs
 # specify virtualenv or python version for a project
 # (do in root directory of the project)
 $ pyenv local <virtualenv or version>
 # view active python environment
 $ pyenv version
 # remove a python version or virtualenv
 $ pyenv uninstall <virtualenv or version>

当然还有 'pyenv help'。

还有一件事:如果您正在使用 pyenv 进行 openstack 开发,tox 需要能够找到多个 python 版本。一种好的方法是使用 pyenv 安装您想要的版本 py27、py35、py36、py37。然后在您的工作 openstack 仓库所在的目录中(例如,~/repos/openstack),您可以将刚刚构建的所有 python 设置为本地

 $ pyenv local 2.7.15 3.5.6 3.6.7 3.7.1

这将在该目录中创建一个 .python-version 文件,其中包含这些 python 列表(垂直排列,如果您喜欢手动创建文件)。顺序很重要:该目录或其子目录中的 'python' 将调用第一个列出的版本,'python3' 将调用第一个 3.x 列出的版本。Tox 使用 'python3.5'、'python3.6'、'python3.7' 获取它想要的特定 py3x;它将为每个这些版本获取 .python-version 文件中列出的特定版本。

一旦您知道可以使用 pyenv 构建 python,您可以将一个系统范围的 python 安装到 /usr/local(尽管您可能不想覆盖任何其他系统部分可能依赖的现有系统 python)。