Heroku CI测试应用删除/spec目录问题排查求助
我来帮你梳理下Heroku CI构建时spec目录失踪的几个高频原因,都是实际排查中碰到过的典型情况:
.gitignore误包含spec目录
这是最容易踩的坑!如果你的.gitignore文件里写了/spec或者spec/,Git会直接忽略这个目录,不会把它推送到Heroku的CI环境里。毕竟Heroku CI是基于你提交的Git仓库内容构建的,未被Git追踪的文件/目录自然不会出现在构建环境中。你可以本地执行git check-ignore spec/命令,确认该目录是否被忽略;或者直接打开.gitignore文件检查有没有相关规则。自定义Buildpack的清理逻辑
如果你使用了第三方或自行编写的Buildpack,部分Buildpack会在构建过程中清理测试相关目录来压缩镜像体积。比如某些非官方Ruby Buildpack可能默认移除spec目录(官方Ruby Buildpack一般不会这么做)。你可以查看Buildpack的配置或脚本,看看有没有包含删除spec目录的命令,比如rm -rf spec;也可以尝试切换回官方Ruby Buildpack测试。app.json配置的构建脚本误删目录
若项目通过app.json配置CI流程,可能在构建或测试阶段的脚本里不小心执行了删除spec的操作。比如在scripts字段的build或test环节,有没有添加rm -rf spec这类命令?建议仔细检查app.json的配置内容,或者查看Heroku CI的构建日志,定位是否有执行删除操作的步骤。推送分支未包含spec目录
有可能你本地开发分支有spec目录,但推送到Heroku的分支(比如生产分支)并未合并包含spec的代码。比如你可能在开发分支维护测试代码,但推送的是一个精简的生产分支,该分支里没有spec目录。可以用git diff <推送分支名> <开发分支名> -- spec命令,对比两个分支中spec目录的差异。Heroku CI缓存异常
虽然概率较低,但CI缓存偶尔会出现异常,导致构建环境中的目录丢失。你可以尝试清理CI缓存:执行heroku ci:purge-cache --pipeline myapp,然后重新触发构建,看看spec目录是否恢复。依赖或Ruby版本的间接影响
极少数情况下,某些依赖包或特定Ruby版本的冲突可能间接导致spec目录被误删,但这个可能性极低。建议先排除前面几个常见原因后,再尝试调整Ruby版本或排查Gemfile中的依赖,比如移除可疑的gem后测试构建。
内容的提问来源于stack exchange,提问作者Nick Res

