如何在Azure DevOps的Python CI流水线中实现依赖缓存?
Azure DevOps Pipelines pip缓存失效排查修复方案
1. 确认缓存key的配置逻辑
- 缓存key必须包含能识别依赖变化的标识,最常用的是
requirements.txt/pyproject.toml/poetry.lock这类依赖声明文件的哈希值,同时要关联操作系统、Python版本,避免不同环境的缓存冲突,示例正确的配置:
variables: PIP_CACHE_DIR: $(Pipeline.Workspace)/.pip steps: - task: Cache@2 inputs: key: 'pip | "$(Agent.OS)" | requirements.txt' restoreKeys: | pip | "$(Agent.OS)" pip path: $(PIP_CACHE_DIR) displayName: 缓存pip依赖
- 注意:如果依赖声明文件放在子目录下,key里要写对文件路径,不要直接写根目录的文件名,否则哈希值计算逻辑错误会导致缓存永远匹配失败。
2. 确认pip安装命令的缓存目录配置
- 必须显式指定pip安装时读取的缓存目录和你在Cache任务里配置的
path一致,不要用系统默认路径,否则就算缓存恢复成功,pip也读不到缓存内容,依然会重新下载依赖:
- script: | pip install --cache-dir $(PIP_CACHE_DIR) -r requirements.txt displayName: 安装Python依赖
- 如果是用poetry/pipenv等包管理工具,也要对应修改其缓存目录的环境变量,和Cache任务的path对齐。
3. 确认缓存命中逻辑
- 流水线运行时可以查看Cache任务的日志:如果显示
Cache restored from key: xxx说明缓存命中,如果显示No cached version found for key说明key不匹配,需要回查key的配置是否和依赖文件、环境变量匹配。 - 不要在缓存任务之前执行删除缓存目录、强制升级pip之类的操作,会破坏恢复的缓存内容。
- 如果是自托管代理,确认代理的工作目录没有被每次运行前清空,否则恢复的缓存文件会被直接删除。
内容的提问来源于stack exchange,提问作者sh0rtcircuit
相关产品推荐
相关产品推荐

