手动运行deploy.sh正常,GitHub Actions执行时提示命令未找到
解决GitHub Actions执行部署脚本时pnpm/npm命令找不到的问题
问题原因
通过GitHub Actions的ssh-action连接服务器时,会启动非交互式非登录shell,这种shell不会自动加载用户的~/.bashrc、~/.profile等配置文件,导致pnpm、npm、pm2这类通过nvm或手动安装的工具路径未被加入PATH环境变量,因此脚本执行时找不到对应命令。而手动执行时是交互式shell,会自动加载这些配置,所以能正常运行。
解决方案
方案1:在SSH命令中预加载环境配置
修改GitHub Actions的main.yaml里的script命令,先加载用户的bash配置文件,再执行部署脚本:
script: "source ~/.bashrc && cd ~/gempad-Interface && bash .scripts/deploy.sh"
如果你的服务器默认shell是zsh,就替换为source ~/.zshrc。
方案2:在deploy.sh开头添加环境加载逻辑
直接在部署脚本的开头加入环境变量加载命令,确保后续命令能找到工具路径:
#!/bin/bash set -e # 加载用户环境配置,根据实际shell类型选择bashrc或zshrc source ~/.bashrc echo "Deployment started..." # 后续脚本内容保持不变
方案3:使用命令的绝对路径
在服务器上执行以下命令,获取pnpm和pm2的绝对路径:
which pnpm which pm2
将得到的路径替换deploy.sh里的对应命令,示例如下:
# 替换pnpm install /home/your-username/.nvm/versions/node/v18.17.0/bin/pnpm install # 替换pnpm run build /home/your-username/.nvm/versions/node/v18.17.0/bin/pnpm run build # 替换pm2 reload /home/your-username/.nvm/versions/node/v18.17.0/bin/pm2 reload gemlaunch-interface
额外提示
- 确认GitHub Actions连接服务器的用户和你手动执行脚本的用户一致,避免环境变量不一致的问题。
- 如果使用nvm管理Node.js版本,也可以在脚本开头加入
source ~/.nvm/nvm.sh来加载nvm环境。
内容的提问来源于stack exchange,提问作者Muhammad Anas
相关产品推荐
相关产品推荐

