为何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
相关产品推荐
相关产品推荐

