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

为何GitLab CI命令运行在本地Runner而非远程SSH主机?

问题原因

你编写的CI脚本存在执行逻辑误区:当你单独执行 ssh -o StrictHostKeyChecking=no <user>@<ip> 这条命令时,默认会启动一个交互式SSH会话,但GitLab Runner的执行环境是非交互式的,因此这条命令执行后会立刻退出SSH会话,回到Runner所在的本地shell上下文。后续的ls等命令自然是在Runner本地执行,而非远程主机。

解决方案

你需要将需要在远程主机执行的命令,直接作为ssh命令的参数传递,或者通过Here Document的方式批量传递,常见的两种写法如下:

方式1:少量命令直接拼接

如果仅需执行少量简单命令,可以直接将命令放在SSH指令后,用引号包裹:

script:
  # 多条命令用&&或者;分隔,注意特殊字符需要转义
  - ssh -o StrictHostKeyChecking=no <user>@<ip> "ls && cd /target/deploy/path && sh ./start.sh"

方式2:多命令使用Here Document传递

如果需要执行多条复杂命令,推荐用Here Document的写法,避免转义混乱:

script:
  - ssh -o StrictHostKeyChecking=no <user>@<ip> << 'EOF'
    # 以下所有命令都将在远程主机执行
    ls
    cd /target/deploy/path
    # 你可以在此处添加任意部署命令,比如拉取镜像、重启服务等
    docker pull your-image:latest
    docker compose up -d
EOF

注意:如果将EOF用单引号包裹(即<< 'EOF'),命令中的变量会在远程主机解析;如果不加单引号,变量会在GitLab Runner本地先完成解析再传到远程,可根据你的实际需求选择。同时结束标记EOF不要加任何前缀缩进,否则会识别失败。

内容的提问来源于stack exchange,提问作者Archirk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 02:06:03