GitLab CI 通过调用云平台 CLI 驱动 ASG 滚动更新,实现零无损平滑升级:先触发新实例部署与健康检查,再下线旧实例,失败自动回滚。

GitLab CI 本身不直接管理云平台的弹性伸缩组(ASG),但它可以作为自动化触发中枢,调用 AWS CLI 或阿里云 CLI 完成 ASG 的滚动更新、实例替换、配置变更等操作,实现接近“零无损、平滑升级”的效果。关键不在 GitLab CI 做什么,而在于它如何精准调度、校验和协同云平台原生能力。
核心逻辑:CI 驱动,云平台执行,健康检查兜底
GitLab CI 不替代 ASG 的滚动更新机制(如 AWS 的 Instance Refresh、阿里云 ESS 的伸缩活动),而是负责:
- 在代码变更或配置更新后,自动触发预定义的升级流程;
- 调用 CLI 执行 ASG 操作(例如启动新版本启动模板、发起 Instance Refresh、设置期望容量);
- 集成健康检查脚本,等待新实例就绪、旧实例退出服务后再推进下一步;
- 失败时自动回滚启动模板版本或恢复期望实例数,保障业务连续性。
AWS 环境下平滑升级 ASG 的典型 CI 步骤
以 AWS EC2 Auto Scaling Group 为例,使用 aws-cli 镜像执行滚动式更新:
用大白话操作当前项目的 Git/GitHub——配置 GitHub(装 gh CLI + 登录 + 建仓库)、备份、拉取下载、查询历史、回滚代码、管理分支。当用户用日常语言表达 git 意图时触发(例如"git备份一下""git下载项目""git拉下来""git看看我改了啥""git回退到上一个版本""git新建个分支搞新功能""git合并到主分支""git
- 在
.gitlab-ci.yml中指定镜像:image: amazon/aws-cli:latest; - 通过 CI 变量传入
AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY和AWS_DEFAULT_REGION(推荐用 OIDC 身份联邦更安全); - 先创建新版 Launch Template 版本(含新 AMI/新用户数据脚本),再调用:
aws autoscaling start-instance-refresh --auto-scaling-group-name my-asg --preferences MinHealthyPercentage=90,InstanceWarmup=120; - 后续 job 使用自定义脚本轮询
describe-instance-refreshes,确认状态为SUCCEEDED后才允许发布完成; - 若超时或失败,触发回滚 job:将 ASG 关联回上一版 Launch Template,并重置期望容量。
阿里云环境下对接 ESS 实现弹性升级
阿里云虽无完全等价的 “Instance Refresh”,但可通过组合伸缩规则 + 启动模板版本 + 自定义数据实现类似效果:
- 使用官方
aliyun/alibaba-cloud-cli镜像或带 aliyun-cli 的自定义镜像; - 在 CI 中调用
aliyun ess UpdateScalingGroup切换启动模板版本,并同步更新MinSize/MaxSize(可选); - 立即触发一次
ExecuteScalingRule或ScaleOut,让新模板实例加入; - 配合 ECS 实例自定义数据中的启动脚本,实现应用拉取、配置加载、就绪探针注册;
- CI 中调用 SLB/OpenAPI 接口验证新实例已注册且通过健康检查,再执行
RemoveInstances下线旧实例(确保流量已切走)。
关键保障:避免“有损”必须做好的三件事
平滑的前提是可控、可观、可退:
- 就绪探针强绑定:ECS/EC2 实例必须在应用真正可用后才向负载均衡注册,不能仅依赖系统启动完成;
-
伸缩活动串行化:禁用并行伸缩任务,确保每次只处理一个批次(如 AWS 设置
InstanceWarmup,阿里云控制伸缩任务间隔); - CI 流水线分阶段锁止:升级过程拆为 prepare → scale-out → verify → scale-in → cleanup,任一环节失败即中止,不自动跳过。
这套模式不依赖 GitLab Runner 特定执行器,Shell、Docker 或 Kubernetes Executor 均可承载;真正起作用的是 CLI 的精确控制力与云平台伸缩机制的原生可靠性。只要流程设计严谨,就能把“升级”变成一次受控的、可观测的、可回溯的常规运维动作。

















