You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 10:34:58