如何通过Bash从setup.py或PKG-INFO获取版本并导出为环境变量用于GitHub Action
从setup.py或PKG-INFO提取版本号的Bash实现方案
适用于Bash环境下提取Python包版本号并导出为环境变量,可直接用于GitHub Action流水线场景。
方案实现
1. 从PKG-INFO提取(优先推荐)
PKG-INFO是Python打包生成的标准元数据文件,格式固定,提取准确率100%,用以下命令即可提取:
grep '^Version:' PKG-INFO | awk '{print $2}'
2. 从setup.py提取
稳妥方案(无格式依赖)
直接调用Python原生解析setup.py内容,不会受注释、字符串引号格式、跨行等场景影响,提取结果最准确:
python3 -c "import setuptools; with open('setup.py') as f: exec(f.read()); print(version)"
纯Bash正则备选方案
仅适用于setup.py中version参数固定为双引号包裹、无跨行、无同名注释的场景:
grep -Po '(?<=version=")[^"]+' setup.py
导出为环境变量的完整脚本
优先读取PKG-INFO,不存在则读取setup.py,自动导出环境变量:
if [ -f "PKG-INFO" ]; then PACKAGE_VERSION=$(grep '^Version:' PKG-INFO | awk '{print $2}') else PACKAGE_VERSION=$(python3 -c "import setuptools; with open('setup.py') as f: exec(f.read()); print(version)") fi # 导出为当前shell环境变量 export PACKAGE_VERSION # 打印验证 echo "PACKAGE_VERSION=${PACKAGE_VERSION}"
GitHub Action中使用示例
在GitHub Action流水线中需将提取到的版本号写入GITHUB_ENV或GITHUB_OUTPUT供后续步骤调用:
steps: - name: 检出代码 uses: actions/checkout@v4 - name: 提取包版本号 id: get_version run: | if [ -f "PKG-INFO" ]; then VERSION=$(grep '^Version:' PKG-INFO | awk '{print $2}') else VERSION=$(python3 -c "import setuptools; with open('setup.py') as f: exec(f.read()); print(version)") fi # 写入全局环境变量,所有后续步骤都可以直接读取 echo "PACKAGE_VERSION=$VERSION" >> $GITHUB_ENV # 写入当前步骤输出,可按需调用 echo "version=$VERSION" >> $GITHUB_OUTPUT - name: 验证版本号 run: | echo "全局环境变量读取:${{ env.PACKAGE_VERSION }}" echo "步骤输出读取:${{ steps.get_version.outputs.version }}"
注意事项
- Python解析setup.py的方案要求运行环境已安装Python和setuptools,GitHub Action默认Ubuntu运行环境已自带依赖,无需额外安装
- 若setup.py中的版本号是从外部文件(如独立的VERSION文件)导入,两种提取方案均可以正常拿到正确值
- 纯正则提取方案容错率低,仅建议确认setup.py格式完全匹配的场景下使用
内容的提问来源于stack exchange,提问作者ybonda
相关产品推荐
相关产品推荐

