云Live-AWS 云Live-AWS 立即咨询
返回列表

阿里云PayPal充值 阿里云服务器CI和CD工作流

阿里云国际 / 2026-04-17 13:54:09

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

你有没有过这种体验?凌晨两点,改完最后一行代码,兴冲冲点下「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,先做三件事:

  1. 关掉密码登录,只留密钥
    sudo sed -i 's/PasswordAuthentication yes/PasswordAuthentication no/g' /etc/ssh/sshd_config && sudo systemctl restart sshd
  2. 建部署专用用户(别用 root!)
    sudo adduser deploy --disabled-password --gecos "" && sudo usermod -aG sudo deploy
  3. 配免密 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优惠、充值秒到账、官网下单享双重售后支持。
Telegram售前客服
客服ID
@cloudcup
联系
Telegram售后客服
客服ID
@yanhuacloud
联系