复用GitHub Action工作流时actions/setup-python因找不到requirements.txt报错
解决复用工作流中setup-python缓存报错的方案
核心问题是actions/setup-python@v4默认以当前工作目录的requirements.txt生成缓存键,但复用工作流时,当前检出的是仓库B的代码,而依赖定义文件在仓库A里,导致缓存逻辑找不到对应文件触发错误。可以通过以下两种方式解决:
方法一:显式指定缓存键,关联仓库A的依赖文件
在仓库A的复用工作流中,先检出自身代码获取依赖文件,再给setup-python配置自定义的缓存依赖路径,跳过默认的当前目录检测逻辑:
# 仓库A的复用工作流示例 jobs: reusable-job: runs-on: ubuntu-latest steps: - name: 检出仓库A代码(获取依赖文件与脚本) uses: actions/checkout@v4 with: repository: 用户名/仓库A path: repo-a - name: 设置Python环境并配置缓存 uses: actions/setup-python@v4 with: python-version: '3.10' cache: 'pip' # 指定仓库A中依赖文件的路径,用于生成缓存键 cache-dependency-path: 'repo-a/requirements.txt' - name: 安装依赖 run: pip install -r repo-a/requirements.txt - name: 执行脚本 run: repo-a/myscript
这种配置下,缓存键会基于仓库A的requirements.txt生成,同时直接从A的目录读取依赖文件执行安装,既满足缓存需求,也避免了找不到文件的问题。
方法二:禁用setup-python自动缓存,手动实现pip缓存
如果不想依赖setup-python的内置缓存逻辑,可以直接用actions/cache手动管理pip缓存,完全控制依赖文件的路径:
# 仓库A的复用工作流示例 jobs: reusable-job: runs-on: ubuntu-latest steps: - name: 检出仓库A代码 uses: actions/checkout@v4 with: repository: 用户名/仓库A path: repo-a - name: 设置Python环境(不启用内置缓存) uses: actions/setup-python@v4 with: python-version: '3.10' - name: 缓存pip依赖 uses: actions/cache@v3 with: path: ~/.cache/pip key: ${{ runner.os }}-pip-${{ hashFiles('repo-a/requirements.txt') }} restore-keys: ${{ runner.os }}-pip- - name: 安装依赖 run: pip install -r repo-a/requirements.txt - name: 执行脚本 run: repo-a/myscript
这种方式灵活性更高,直接基于仓库A的依赖文件生成缓存键,彻底规避setup-python默认逻辑带来的冲突。
额外注意点
- 两种方案都需要先检出仓库A的代码,因为依赖文件和执行脚本都存储在A中,仓库B仅负责触发复用工作流,无需包含A的文件。
- 若仓库A为私有仓库,需给
actions/checkout配置token参数,使用拥有A仓库读取权限的个人访问令牌(PAT)。
内容的提问来源于stack exchange,提问作者Konrad Höffner
相关产品推荐
相关产品推荐

