GitHub Actions 里用 container 跑测试,为什么挂载的 HTML 文件读不到?

南宫淑然 阅读 52

我在 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>
我来解答 赞 11 收藏
二维码
手机扫码查看
1 条解答
宇文世暄
你这问题我太熟悉了, GitHub Actions 的 container 模式下,checkout 的代码其实是在容器的 /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 里这么写就不会翻车:

const path = require('path');
const fs = require('fs');

const htmlPath = path.join(process.env.GITHUB_WORKSPACE || __dirname, 'public/index.html');
const html = fs.readFileSync(htmlPath, 'utf8');


别再猜路径了,直接打个 ls -lapwd 在 CI 里输出一下当前目录结构,一眼就看出问题在哪,我之前也栽过这坑,查了半小时才发现文件其实在 /github/workspace 里,而我测试脚本以为自己在 /app
点赞 5
2026-02-23 17:59