GitHub Actions 里用 container 跑测试,为什么挂载的 HTML 文件读不到?
我在 GitHub Actions 的 workflow 里用 container 配置了一个 Node.js 环境跑前端测试,本地能正常读取 public/index.html,但 CI 上一直报文件不存在。是不是容器路径没对上?
我试过把 working-directory 改成 /app,也确认了 checkout 步骤在 container 外面执行了,但还是不行。下面是项目里被测试的 HTML 文件结构:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>Test Page</title>
</head>
<body>
<div id="root"></div>
<script src="./main.js"></script>
</body>
</html>
/github/workspace目录里,而不是你想象的/app或者当前 working-directory。你本地跑测试的时候,文件路径是相对于项目根目录的,但 CI 容器里你可能没注意当前工作目录到底在哪。先确认两件事:
第一,你的 workflow 里有没有显式设置
working-directory?如果设置了,比如设成/app,那测试脚本里的相对路径(比如./main.js或读取public/index.html)就会从/app下找,但实际文件在/github/workspace/public/index.html,自然就找不到了。第二,你测试代码里读 HTML 文件是怎么写的?如果是用 Node.js 的
fs.readFileSync('public/index.html')这种绝对路径没带前缀的,那它默认是从当前工作目录开始找的,不是从项目根目录。解决方案很简单:
要么你把
working-directory去掉,或者显式设成.(表示当前 workspace 根目录),让测试脚本的相对路径能对上;要么你在测试代码里用绝对路径,比如
path.join(__dirname, '../../public/index.html'),或者用process.env.GITHUB_WORKSPACE拼路径,这个环境变量在容器里就是/github/workspace,最靠谱。举个例子,JS 里这么写就不会翻车:
别再猜路径了,直接打个
ls -la或pwd在 CI 里输出一下当前目录结构,一眼就看出问题在哪,我之前也栽过这坑,查了半小时才发现文件其实在/github/workspace里,而我测试脚本以为自己在/app。