GitHub Actions中设置TMPDIR后创建临时目录遇EACCES权限错误
问题分析
你遇到的权限问题根源在于TMPDIR环境变量的作用域不对:你把它设置在了setup-node步骤的env里,这个变量只会在该步骤生效,后续执行测试的步骤并没有继承到这个变量,导致Node.js的tmpdir()依然返回系统默认的/tmp目录,而在GitHub Actions的Ubuntu runner环境中,直接通过mkdtempSync在/tmp下创建临时目录会触发权限限制。
解决方案
要让测试步骤能正确读取到TMPDIR,需要把环境变量配置在job级别或者测试步骤自身的env中:
方案1:配置在Job级别(推荐)
将环境变量放在job的顶层env中,这样该job下的所有步骤都能访问到:
name: Test on: push: branches: [ "main" ] pull_request: branches: [ "main" ] jobs: build: runs-on: ubuntu-latest env: TMPDIR: ${{ runner.temp }} # 移到job级别 strategy: matrix: node-version: [22.x] steps: - uses: actions/checkout@v4 - name: Use Node.js ${{ matrix.node-version }} uses: actions/setup-node@v4 with: node-version: ${{ matrix.node-version }} - run: node --test src/**.test.js
方案2:配置在测试步骤中
如果只需要测试步骤使用这个变量,可以直接给测试步骤添加env:
# ... 其他配置不变 ... - run: node --test src/**.test.js env: TMPDIR: ${{ runner.temp }}
验证方法
可以在测试步骤前添加一个打印环境变量的步骤,确认TMPDIR是否正确设置:
- run: echo "当前TMPDIR: $TMPDIR"
当变量生效后,Node.js的tmpdir()会返回${{ runner.temp }}对应的路径(通常是/home/runner/work/_temp/xxxxxx),这个目录是GitHub Actions为当前运行提供的专属临时目录,你拥有完全的读写权限,不会再出现EACCES错误。
内容的提问来源于stack exchange,提问作者Eric Fortis
相关产品推荐
相关产品推荐

