如何简化GitLab CI Runner向外部服务器执行多SSH命令?
简化GitLab CI中多SSH命令的执行方案
当然有更简便的实现方式,不用每条命令都重复写ssh 1.2.3.4,给你几种实用方案:
方案一:合并命令为单个SSH调用
把所有要执行的命令用&&(前序命令成功才执行后续)或;(不管前序结果都执行)连接,一次性通过SSH发送到远程执行。如果命令较多,用反斜杠换行保持可读性:
stage: deploy script: - ssh 1.2.3.4 "docker login -u foo -p bar example.com \ && docker pull my_image \ && docker run -d -p 80:80 my_image \ && echo '部署完成'"
方案二:使用SSH Here Document(推荐)
这种方式可以像写本地脚本一样编写远程命令,可读性极强,还能方便添加注释:
stage: deploy script: - ssh 1.2.3.4 << 'EOF' # 登录镜像仓库 docker login -u foo -p bar example.com # 拉取最新镜像 docker pull my_image # 启动容器 docker run -d -p 80:80 my_image # 更多自定义命令 echo "部署完成" EOF
注意:
'EOF'加单引号是为了避免GitLab CI的本地变量被提前解析,如果需要在远程执行时使用远程服务器的环境变量,可以去掉单引号。
方案三:使用独立部署脚本
把所有部署命令写到一个单独的脚本文件中,通过SSH执行脚本内容,适合复杂的部署流程:
- 项目根目录创建
deploy.sh脚本:
#!/bin/bash set -e # 命令失败则终止脚本 docker login -u foo -p bar example.com docker pull my_image docker run -d -p 80:80 my_image echo "部署完成"
- 在
.gitlab-ci.yml中调用:
stage: deploy script: - chmod +x deploy.sh - ssh 1.2.3.4 "$(cat deploy.sh)"
或者先把脚本传到远程再执行(适合超大脚本):
stage: deploy script: - scp deploy.sh 1.2.3.4:/tmp/deploy.sh - ssh 1.2.3.4 "chmod +x /tmp/deploy.sh && /tmp/deploy.sh && rm /tmp/deploy.sh"
内容的提问来源于stack exchange,提问作者IMB
相关产品推荐
相关产品推荐

