You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PR中GitHub Actions缓存无法访问dev分支已有缓存的问题

问题原因分析
  1. 依赖文件路径不匹配:你的PR工作流和合并后置工作流中,指定的依赖文件路径不一致:

    • PR工作流安装的是./back-end/requirements.txt
    • 合并后置工作流安装的是./back-end/clientdek/requirements.txt
      这导致hashFiles('**/requirements.txt')在两个工作流中计算的哈希值不同(因为匹配到的文件集合不一样),最终生成的缓存Key不一致,PR工作流自然无法命中dev分支创建的缓存。
  2. PR工作流的缓存访问规则:GitHub Actions中,PR工作流默认只能读取**基准分支(dev)**的缓存,但前提是缓存Key完全匹配。即使你确认dev分支存在对应Key的缓存,只要PR工作流生成的Key和dev分支的不一致,就无法命中。

解决方案

方案1:统一依赖文件路径,保证缓存Key一致

修改两个工作流中的依赖文件路径,确保指向同一个requirements.txt:

  • 如果你实际需要的是./back-end/requirements.txt,则修改合并后置工作流的安装命令:
    - name: Installing dependencies if the cache doesn't hit
      if: ${{ steps.cache-pip.outputs.cache-hit != 'true' }}
      run: pip install -r ./back-end/requirements.txt
    
  • 反之,如果需要的是./back-end/clientdek/requirements.txt,则修改PR工作流的安装命令:
    - name: Install dependencies
      run: |
        python -m pip install --upgrade pip
        pip install -r ./back-end/clientdek/requirements.txt
        pip install pylint
    

同时,建议将hashFiles的路径改为精确匹配,避免匹配到多个requirements.txt导致哈希值异常:

key: ${{ runner.os }}-pip-${{ hashFiles('./back-end/requirements.txt') }}

方案2:显式指定PR工作流读取基准分支缓存的规则

如果你的PR分支可能修改requirements.txt,但希望在未修改时命中dev分支的缓存,可以调整restore-keys,优先匹配基准分支的缓存Key:
在PR工作流的缓存步骤中,添加基于基准分支的restore key:

- name: Cache pip packages
  id: cache-pip
  uses: actions/cache@v3
  with:
    path: ~/.cache/pip
    key: ${{ runner.os }}-pip-${{ hashFiles('./back-end/requirements.txt') }}
    restore-keys: |
      ${{ runner.os }}-pip-${{ github.base_ref }}-
      ${{ runner.os }}-pip-

这里github.base_ref是PR的基准分支(即dev),确保PR工作流在自身Key不匹配时,尝试读取dev分支生成的缓存。

方案3:确认PR工作流的缓存读取权限

如果你的仓库是私有仓库,且PR来自fork分支,需要在仓库设置中开启相关权限:

  1. 进入仓库的Settings > Actions > General
  2. 在Workflow permissions部分,勾选Read and write permissions
  3. 同时在Fork pull request workflows from outside collaborators部分,选择Send write tokens to workflows from fork pull requests
验证步骤

修改完成后,按以下步骤验证:

  1. 向dev分支提交一个无requirements.txt修改的PR
  2. 查看PR工作流中Checking existence of pip cache步骤的输出,确认cache-hit为true
  3. 如果仍未命中,检查两个工作流生成的缓存Key是否完全一致(可以在工作流日志中打印Key值:echo "Cache key: ${{ runner.os }}-pip-${{ hashFiles('./back-end/requirements.txt') }}")

内容的提问来源于stack exchange,提问作者KrabbyPatty

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 13:48:17