Bitbucket Pipeline多行Bash脚本无法终止求助
问题排查与修复方案
核心问题分析
-tt参数会强制为SSH会话分配伪终端,远程命令执行完毕后,终端会处于等待用户输入的状态,无法自动关闭会话,导致Bitbucket Pipeline持续运行卡住。- 移除
-tt后找不到npm/pm2,是因为默认非交互式shell不会加载用户的环境配置文件(如~/.bashrc、~/.profile),导致命令所在路径未被加入系统PATH。
修复后的脚本
after-script: - |- ssh -t -p 222 user@example.com "bash -l -c 'cd public_html/staging && npm i && pm2 delete my-app || true && VITE_BASE_URL=$VITE_BASE_URL pm2 -f start build/index.js --update-env --name my-app'"
关键修改点
- 用
-t替代-tt:仅分配一次伪终端,命令执行完成后会自动退出SSH会话,避免流水线卡住。 - 使用
bash -l -c:-l让bash以登录shell模式启动,自动加载用户的环境配置,确保npm/pm2的路径被正确识别。 - 单引号包裹远程命令:避免本地shell提前解析
$VITE_BASE_URL等变量,确保变量能正确传递到远程环境中。 - 替换
|| :为|| true:语义更清晰,保证pm2 delete执行失败时,后续重启命令仍能正常运行。
备选方案(保留HEREDOC写法)
如果偏好HEREDOC格式,可通过添加强制退出命令并加载环境配置解决:
after-script: - |- ssh -t -p 222 user@example.com bash -l << EOF cd public_html/staging && npm i && pm2 delete my-app || true && VITE_BASE_URL=$VITE_BASE_URL pm2 -f start build/index.js --update-env --name my-app exit EOF
这里通过bash -l加载环境变量,exit命令强制远程shell执行完后退出,-t确保伪终端正常工作且不会持续等待输入。
内容的提问来源于stack exchange,提问作者pgalle
相关产品推荐
相关产品推荐

