阿里云PayPal充值 阿里云服务器CI和CD工作流
你有没有过这种体验?凌晨两点,改完最后一行代码,兴冲冲点下「Merge to main」,结果——
→ GitLab CI 跑到一半卡死在 ssh: connect to host xxx.xxx.xxx.xxx port 22: Connection refused;
→ 好不容易连上了,又弹出 Permission denied (publickey),翻遍 ~/.ssh/config 发现密钥居然没加 agent;
→ 终于部署成功,浏览器一刷——502 Bad Gateway,Nginx 日志里躺着一行冰冷的 connect() failed (111: Connection refused) while connecting to upstream……
别急,这不是你的问题。这是阿里云 ECS 上搭 CI/CD 的「标准欢迎仪式」。
阿里云PayPal充值 一、先说清楚:CI 和 CD 在阿里云 ECS 上,到底是谁干啥?
别被术语吓住。咱们把它翻译成人话:
- CI(持续集成) ≈ 「自动验货员」:你一推代码,它就立刻拉下来、装依赖、跑测试、打个包,全程不喊你,但会给你发个钉钉消息:“✅ 测试全过,包已生成” 或 “❌ 第7个单元测试挂了,赶紧看!”
- CD(持续交付/部署) ≈ 「24小时快递小哥」:验货合格后,它不等人点头,自己抄起包、SSH 登服务器、停旧进程、换新文件、顺手 reload Nginx——整套动作比你泡面还快。
注意:这里我们不做 Kubernetes、不搞 ArgoCD,就用最朴实的 ECS + GitLab Runner + Shell 脚本 + Nginx 四件套。为什么?因为——
✅ 便宜(一台 2C4G 按量付费 ECS,月均不到 80 块)
✅ 可控(所有命令你敲过,所有日志你看过)
✅ 故障好查(报错直接贴终端,不用猜 Helm Chart 里哪层模板渲染错了)
二、实战四步走:从空 ECS 到自动上线
Step 1|初始化 ECS:不是装完系统就完事了
登录阿里云控制台,选 Ubuntu 22.04 LTS(别用 CentOS 7,它连 systemd 都懒得理你)。初始化后,别急着装 GitLab Runner,先做三件事:
- 关掉密码登录,只留密钥:
sudo sed -i 's/PasswordAuthentication yes/PasswordAuthentication no/g' /etc/ssh/sshd_config && sudo systemctl restart sshd - 建部署专用用户(别用 root!):
sudo adduser deploy --disabled-password --gecos "" && sudo usermod -aG sudo deploy - 配免密 SSH(关键!):
在本地机器执行ssh-copy-id deploy@你的ECS公网IP。如果失败?八成是 deploy 用户家目录权限太松——sudo chmod 700 /home/deploy/.ssh && sudo chmod 600 /home/deploy/.ssh/authorized_keys
这一步省不得。后面 GitLab Runner 用 deploy 用户 SSH 连自己,权限不对,Permission denied (publickey) 就跟你杠上了。
Step 2|装 GitLab Runner:别用 Docker,用二进制更稳
阿里云 ECS 默认没装 Docker,而 GitLab Runner 的 Docker Executor 在 ECS 上常因 cgroup v2 兼容性翻车。咱直奔二进制:
wget -O /tmp/gitlab-runner.deb https://gitlab-runner-downloads.s3.amazonaws.com/latest/deb/gitlab-runner_amd64.deb
sudo dpkg -i /tmp/gitlab-runner.deb
sudo gitlab-runner register \
--non-interactive \
--url "https://gitlab.com/" \
--registration-token "your-token-here" \
--executor "shell" \
--description "aliyun-ecs-prod" \
--tag-list "deploy,aliyun" \
--run-untagged="false" \
--locked="false" \
--access-level="not_protected"
重点:选 shell executor,不是 docker。注册完,手动启动:sudo gitlab-runner start,再 sudo gitlab-runner status 确认绿色运行中。
Step 3|写 .gitlab-ci.yml:拒绝魔法,只信变量和 echo
项目根目录新建 .gitlab-ci.yml,内容极简:
stages:
- build
- deploy
build-job:
stage: build
script:
- echo "📦 正在打包前端..."
- npm ci
- npm run build
- echo "✅ 构建完成,输出在 dist/ 目录"
artifacts:
- dist/**/*
only:
- main
deploy-job:
stage: deploy
script:
- echo "🚀 开始部署到阿里云 ECS..."
- export DEPLOY_HOST="你的ECS公网IP"
- export DEPLOY_USER="deploy"
- ssh $DEPLOY_USER@$DEPLOY_HOST "mkdir -p /var/www/myapp"
- scp -r dist/* $DEPLOY_USER@$DEPLOY_HOST:/var/www/myapp/
- ssh $DEPLOY_USER@$DEPLOY_HOST "sudo systemctl reload nginx"
only:
- main
needs: ["build-job"]
⚠️ 注意:
• scp 前确保 deploy 用户能 sudo systemctl reload nginx —— 编辑 sudo visudo,加一行:deploy ALL=(ALL) NOPASSWD: /bin/systemctl reload nginx
• Nginx 配置里 root /var/www/myapp; 别写错路径,否则 403 闪亮登场。
Step 4|兜底防护:日志、回滚、快照,一个都不能少
上线不是终点,是监控起点。加三道保险:
- 部署日志存档:在 deploy-job 的 script 末尾加:
ssh $DEPLOY_USER@$DEPLOY_HOST "date >> /var/log/myapp-deploy.log && echo 'Deployed commit: $CI_COMMIT_SHORT_SHA' >> /var/log/myapp-deploy.log" - 一键回滚脚本(放在 ECS 的
/opt/scripts/rollback.sh):#!/bin/bash
cd /var/www/
if [ -d "myapp.prev" ]; then
rm -rf myapp.bak
mv myapp myapp.bak
mv myapp.prev myapp
sudo systemctl reload nginx
echo "✅ 已回滚到上一版"
else
echo "⚠️ 无上一版本可回滚"
fi
赋予执行权:chmod +x /opt/scripts/rollback.sh - 阿里云快照策略:控制台 → 云盘 → 设置自动快照策略 → 每天凌晨2点,保留7天。真炸了,3分钟挂载快照卷,秒级复活。
三、那些年,我们共同 debug 过的报错
Q:CI 里 scp 报错 bash: line 123: scp: command not found?
A:GitLab Runner 的 shell executor 默认用 /bin/sh,而 scp 在 /usr/bin/scp。解决方案:在 .gitlab-ci.yml 的 script 前加 export PATH="/usr/bin:$PATH"。
Q:Nginx reload 后还是 502?
A:先 sudo nginx -t 检查配置语法;再 sudo ss -tuln | grep :80 看端口是否被占用;最后 sudo tail -f /var/log/nginx/error.log,大概率是 connect() failed to unix:/run/php/php8.1-fpm.sock——PHP-FPM 没启,或 sock 路径对不上。
Q:Runner 注册后一直显示 pending?
A:检查 ECS 安全组——必须放行 tcp:22(SSH)、tcp:443(GitLab API)。别信“全部放行”,最小权限才是安全感。
结尾:CI/CD 不是银弹,而是习惯
搭完这套流程,你收获的不只是自动部署——
是每次 merge 前那句「我先跑下 CI」的肌肉记忆;
是深夜线上告警时,第一反应不是重启服务器,而是 git log -n 5 查最近提交;
是看到 Permission denied 不再头皮发麻,而是淡定打开 ssh -vvv 看握手细节。
技术没有玄学。所有「高大上」的工作流,拆开都是几条命令、几个权限、一次快照。阿里云 ECS 不是玩具,它是你代码真正落脚的土壤。而 CI/CD,就是给这片土壤装上的自动灌溉系统——不求惊艳,但求踏实、可控、出了事,你自己能拎着扳手下去修。
现在,去删掉你本地那个「待部署」文件夹吧。真正的部署,早该交给机器了。

如果需要更深入咨询了解可以联系全球代理上TG: @cloudcup 他们在云平台领域有更专业的知识和建议,他们有国际阿里云,国际腾讯云,国际华为云,aws亚马逊,谷歌云一级代理的渠道,微软云开户充值。oss防风控上传加密系统。客服1V1服务,支持免实名、免备案、免绑卡。开通即享专属VIP优惠、充值秒到账、官网下单享双重售后支持。