GitHub Actions中setup-node指定Node版本未生效问题求助
问题场景
我使用一台预装Node.js 14.20.0的自托管GitHub Actions运行器,尝试通过actions/setup-node@v4将Node版本切换为18.18.2,配置如下:
- uses: actions/setup-node@v4 with: node-version: '18.18.2' - name: Perform npm working-directory: ${{ github.workspace }}/my-app run: | node --version npm i
任务执行无报错,但查看日志发现后续步骤仍在使用Node.js 14.20.0——setup-node日志显示已成功下载并安装18.18.2,但node --version输出为v14.20.0。
原因分析
从日志中shell: /usr/bin/bash -ileo pipefail {0}这一行可以看出,执行run步骤时使用了交互式shell(-i参数)。交互式shell会自动加载用户的bash配置文件(如~/.bashrc、~/.bash_profile),如果这些配置文件中硬编码了预装Node.js 14的路径,并将其放到PATH环境变量的最前端,就会覆盖setup-node设置的路径优先级,导致后续步骤仍调用旧版本Node。
解决方案
1. 改用非交互式shell执行步骤
GitHub Actions默认使用非交互式shell(bash -eo pipefail {0}),只需在run步骤中明确指定非交互式shell,避免加载用户配置文件:
- uses: actions/setup-node@v4 with: node-version: '18.18.2' - name: Perform npm working-directory: ${{ github.workspace }}/my-app shell: bash run: | node --version npm i
2. 调整自托管运行器的bash配置文件
修改运行器用户的~/.bashrc或~/.bash_profile,移除其中硬编码的Node.js路径配置,或者确保setup-node添加的路径优先级更高。例如,注释掉类似以下的行:
# export PATH="/path/to/preinstalled/node14/bin:$PATH"
3. 验证PATH环境变量顺序
在run步骤中添加echo $PATH,查看路径顺序确认问题:
- name: Perform npm working-directory: ${{ github.workspace }}/my-app run: | echo $PATH node --version npm i
如果预装Node的路径出现在setup-node下载的18.18.2路径之前,即可确认是PATH被配置文件覆盖,再针对性调整。
内容的提问来源于stack exchange,提问作者Lagot

