如何在GitHub Actions中安装指定版本Python 3.6.5以运行pytest
GitHub Actions 安装 Python 3.6.5 运行 pytest 测试实现方案
实现逻辑
GitHub Actions 内置的 Python 3.6 系列版本覆盖范围为3.6.7到3.6.12,和需求的3.6.5版本存在偏差时,可通过编译安装指定版本Python的方式满足依赖兼容性要求,不需要依赖平台预装的Python环境。
分步操作流程
- 安装Python编译所需的系统依赖:编译自定义Python版本需要提前配齐关联的系统开发库,否则会触发编译失败、HTTPS连接异常等问题,对应执行的系统命令为:
sudo apt-get update && sudo apt-get install -y 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 python3-openssl - 初始化pyenv版本管理环境:pyenv内置了全量历史版本Python的安装源,可直接拉取3.6.5版本源码完成离线编译安装,不需要手动下载源码包做额外配置。
- 安装并激活Python 3.6.5:通过pyenv完成3.6.5版本的编译安装后,将该版本设置为全局默认版本,执行
python --version校验,输出为Python 3.6.5即代表安装成功。 - 安装适配Python 3.6的pip版本:注意Python 3.6 最高兼容的pip版本为21.3.1,更高版本的pip已经移除了对Python 3.6的支持,直接升级最新版pip会触发兼容性报错,需指定安装
pip==21.3.1。 - 安装项目依赖并执行pytest:按照原有流程安装
apache-beam[gcp]==2.19、google-cloud-pubsub==1.2.0依赖,完成后即可直接运行pytest测试用例。
可直接复用的工作流配置
jobs: pytest-test: runs-on: ubuntu-latest steps: - name: 拉取项目代码 uses: actions/checkout@v4 - name: 安装Python编译依赖包 run: | sudo apt-get update sudo apt-get install -y \ 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 python3-openssl - name: 初始化pyenv环境 run: | git clone https://github.com/pyenv/pyenv.git ~/.pyenv echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc echo 'eval "$(pyenv init -)"' >> ~/.bashrc source ~/.bashrc - name: 编译安装Python 3.6.5 run: | source ~/.bashrc pyenv install 3.6.5 pyenv global 3.6.5 python --version - name: 安装项目依赖并执行测试 run: | source ~/.bashrc python -m pip install --upgrade pip==21.3.1 pip install apache-beam[gcp]==2.19 google-cloud-pubsub==1.2.0 pytest pytest
常见踩坑提示
- 不要直接使用GitHub预装的3.6.7及以上版本Python运行测试,该版本下apache-beam 2.19 与protobuf、grpcio的依赖匹配会出现二进制编译错误,无法正常导入模块。
- 安装依赖时需确认当前pip路径关联的是3.6.5版本,避免依赖被安装到系统自带的Python环境中,导致测试运行时找不到对应库。
- 若编译3.6.5时出现libssl相关报错,需确认安装的libssl-dev为1.1.1系列版本,过高版本的OpenSSL会导致Python编译后的HTTPS功能失效,无法正常从PyPI拉取依赖包。
内容的提问来源于stack exchange,提问作者Em Ae
相关产品推荐
相关产品推荐

