如何在GitHub Actions工作流的任务间共享Python环境配置
修复GitHub Actions工作流release任务的版本控制检测错误
原工作流的release任务运行时出现CRITICAL: No version control system detected错误,核心原因有两点:
- release任务未检出Git仓库代码,zest.releaser无法识别版本控制系统
- 未复用build任务的Python环境与依赖缓存,导致重复安装且环境不一致
具体修改方案
- 添加Git代码检出步骤:在release任务中执行
actions/checkout,保留默认Git凭证(允许zest.releaser推送新版本标签到仓库) - 统一Python环境配置:release任务使用与build任务完全一致的Python版本,确保环境兼容性
- 缓存pip依赖:在build和release任务中加入缓存步骤,复用已安装的依赖包(如
build、zest.releaser),提升运行效率 - 调整步骤顺序:release任务需先完成代码检出、环境配置、缓存恢复,再执行依赖安装与发布操作
修改后的完整工作流
name: build, test, release on: push jobs: build: name: build runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 with: persist-credentials: false - name: set up py uses: actions/setup-python@v5 with: python-version: "3.x" - name: Cache pip dependencies uses: actions/cache@v4 with: path: ~/.cache/pip key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements*.txt', 'pyproject.toml') }} restore-keys: | ${{ runner.os }}-pip- - name: Test run: | pip install '.[test-deps]' pytest - name: install build run: pip install build - name: build dist run: python -m build - name: store dist uses: actions/upload-artifact@v4 with: name: python-package-distributions path: dist/ release: name: Version & tag the release if: ${{ github.ref == 'refs/heads/main' }} needs: build runs-on: ubuntu-latest steps: - name: Checkout code with Git credentials uses: actions/checkout@v4 # 保留默认凭证,支持zest.releaser推送标签 - name: set up py uses: actions/setup-python@v5 with: python-version: "3.x" - name: Restore pip dependencies cache uses: actions/cache@v4 with: path: ~/.cache/pip key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements*.txt', 'pyproject.toml') }} restore-keys: | ${{ runner.os }}-pip- - name: download dist uses: actions/download-artifact@v4 with: name: python-package-distributions path: dist/ - name: install zest.releaser and run release run: | pip install zest.releaser fullrelease
补充说明
- 缓存键基于
requirements*.txt和pyproject.toml的哈希值生成,仅当依赖配置变更时才会重新缓存 - release任务的
checkout步骤保留默认凭证,确保zest.releaser能自动推送新版本标签到GitHub仓库 - 两个任务共享相同的缓存键,实现build任务依赖的复用,减少重复安装耗时
内容的提问来源于stack exchange,提问作者basher




