GitLab CI/CD流水线测试成功后未触发Deploy阶段问题
问题排查与修复方案
核心问题分析
测试阶段成功后Deploy停滞1小时后跳过,大概率是GitLab Runner执行环境缺少SSH工具,或者SSH连接服务器失败导致卡住,另外部署脚本本身也存在冗余和风险点。
分步修复
1. 给Deploy阶段添加SSH依赖
你用的docker:24.0.5镜像默认没有安装ssh客户端,执行ssh-agent、ssh-add这些命令会报错或卡住。需要在deploy的before_script里安装ssh工具:
deploy: stage: deploy before_script: - apk add --no-cache openssh-client # Alpine镜像用apk安装ssh工具 script: - eval $(ssh-agent -s) - echo "$SSH_PRIVATE_KEY" > /tmp/deploy_key - chmod 600 /tmp/deploy_key - ssh-add /tmp/deploy_key - ssh -o StrictHostKeyChecking=no root@serverIP 'bash -s' < deploy.sh only: - master
2. 修复deploy.sh的冗余与风险
你的deploy脚本里有没必要的操作,还没处理旧容器端口冲突问题:
# 先停止并删除旧容器(如果存在,|| true避免容器不存在时报错中断) docker stop cicd-app || true docker rm cicd-app || true # 拉取最新镜像(不需要再build,除非你要在服务器重新构建) docker pull golamrabbani3580/cicd:v1 # 用新镜像启动容器,指定容器名方便后续管理 docker run -d --name cicd-app -p 3000:3000 golamrabbani3580/cicd:v1
原脚本里的
docker build -t cicd:v1 .完全多余:你已经从Docker Hub拉取了镜像,build会尝试用本地Dockerfile重新构建,若服务器上没有Dockerfile会直接失败。
3. 确认分支匹配
检查当前提交的分支是不是master,因为你设置了only: master,如果是其他分支,Deploy阶段会直接跳过(这个可能性较低,但也要确认)。
4. 调试SSH连接
如果还是卡住,可以在deploy脚本里加调试输出,定位连接问题:
script: - apk add --no-cache openssh-client - eval $(ssh-agent -s) - echo "$SSH_PRIVATE_KEY" > /tmp/deploy_key - chmod 600 /tmp/deploy_key - ssh-add /tmp/deploy_key - ssh -v -o StrictHostKeyChecking=no root@serverIP 'echo "SSH连接成功"' # 先测试基础连接 - ssh -o StrictHostKeyChecking=no root@serverIP 'bash -s' < deploy.sh
-v会输出SSH连接的详细日志,能帮你快速定位是密钥错误、服务器IP无法访问还是权限问题。
内容的提问来源于stack exchange,提问作者Rabbani_
相关产品推荐
相关产品推荐

