Github Action gradle缓存异常恢复 hash变更后未按预期失效问题
问题原因解答
1. 哈希变更后缓存仍被恢复的原因
你配置的actions/cache存在restore-keys规则,该规则的作用是当精确的key未命中时,会按前缀模糊匹配历史缓存:
- 你设置的
restore-keys为${{ runner.os }}-gradle-,只要是同操作系统下前缀匹配的gradle历史缓存,都会被恢复到当前构建环境中 - 你看到的下载日志就是模糊匹配命中旧缓存的结果,即使精确的带文件哈希的
key没有命中,旧缓存依然会被拉取。唯一的区别是如果精确key不匹配,本次构建结束后不会更新该缓存条目。
2. Gradle构建缓存未失效的原因
你恢复的旧缓存中包含了Gradle本地构建缓存(~/.gradle/caches下的任务状态缓存),Gradle任务是否重跑取决于任务输入输出的哈希校验结果,出现未重跑的情况通常有两个原因:
- 你新增的校验逻辑所属的任务,没有正确声明输入项:比如测试用例检查逻辑如果没有将项目测试源目录、校验规则参数等声明为任务输入,Gradle会认为该任务输入无变更,直接复用历史缓存的UP-TO-DATE状态,不会重新执行。
- buildSrc目录下的代码变更未被纳入任务输入追踪:如果你的插件逻辑放在buildSrc中,低版本Gradle不会自动将buildSrc的代码变更关联到所有应用该插件的任务输入上,导致任务感知不到逻辑变更,直接复用缓存。
解决建议
- 如果你不需要模糊匹配旧缓存,可以直接删除
restore-keys配置项,这样只有文件哈希完全匹配的精确缓存才会被恢复。 - 检查校验任务的输入输出声明,确保所有影响任务执行结果的变量、文件都被声明为任务输入,所有生成的产物被声明为任务输出,Gradle就能自动感知变更重跑任务。
- 若需要在buildSrc变更后强制全量重跑任务,可以在Gradle构建命令中添加
--rerun-tasks参数。
内容的提问来源于stack exchange,提问作者xenoterracide
相关产品推荐
相关产品推荐

