GitLab CI/CD SSH连接EC2实例后命令未执行求助
解决GitLab CI/CD SSH连接后命令未执行的问题
你的问题出在SSH命令的执行方式上:当前脚本里的ssh命令是交互式登录到EC2实例,执行后会停留在远程主机的shell会话中,CI/CD Runner会一直等待这个会话结束(但你没有手动退出),导致后续的pwd、ls命令根本没机会执行(而且这两个命令原本是要在远程主机跑的,但写法上是在本地Runner执行,位置也错了)。
修复方案
你需要让SSH直接在远程主机执行指定命令,执行完成后自动退出会话,而不是进入交互式模式。有两种常用写法:
写法1:直接在SSH命令后追加要执行的命令
适合少量单条/串联命令:
image: buildtime_base_v2:3.25.1 stages: - test test: stage: test script: - | echo "$SSH_KEY_VARIABLE" > ssh_key.pem chmod 600 ssh_key.pem # 把要执行的远程命令放在ssh命令末尾,用引号包裹 ssh -i "ssh_key.pem" -o StrictHostKeyChecking=no centos@<ip> "pwd && ls -l /etc/gitlab"
写法2:使用Here Document执行多条命令
适合需要执行多个独立命令的场景:
image: buildtime_base_v2:3.25.1 stages: - test test: stage: test script: - | echo "$SSH_KEY_VARIABLE" > ssh_key.pem chmod 600 ssh_key.pem # 通过Here Document传递多行命令到远程主机执行 ssh -i "ssh_key.pem" -o StrictHostKeyChecking=no centos@<ip> << 'EOF' pwd ls -l /etc/gitlab # 在这里添加你需要执行的rake命令 EOF
关键说明
- 去掉了
-t -t参数:这个参数是强制分配伪终端,用于交互式会话,非交互式执行命令时不需要,反而可能导致不必要的卡顿。 - 所有需要在远程主机执行的命令,都要放在SSH命令的范围内(要么末尾引号里,要么Here Document块内),这样才会在EC2实例上运行,而不是在本地CI Runner上。
内容的提问来源于stack exchange,提问作者gangadhar r
相关产品推荐
相关产品推荐

