能否使用GitHub Actions向多云多VM批量部署应用?
GitHub Actions 跨Azure/AWS多VM批量部署实现方案
GitHub Actions 没有直接命名为「部署组」的原生功能,但完全可以覆盖Azure DevOps部署组的多节点批量发布能力,以下是经过生产验证的几种实现思路,你可以根据自己的运维习惯选择:
方案1:自托管Runner组(最贴近Azure DevOps部署组使用习惯)
这个方案的逻辑和Azure DevOps部署组几乎一致,不需要额外调整原有部署脚本逻辑:
- 先把所有Azure、AWS上的目标VM注册为GitHub仓库/组织级的自托管Runner,给Runner统一打自定义标签,比如按环境打
deploy-env:prod,按云厂商打cloud:azure/cloud:aws,按可用区打az:east-1这类标签做节点分组 - 在工作流里通过标签匹配目标节点组,结合
strategy配置控制并发度、失败策略,实现滚动部署、分批发布,最小化发布对业务的影响 - 示例工作流配置:
name: 多VM批量部署 on: push: branches: [ main ] jobs: deploy: runs-on: [self-hosted, 'deploy-env:prod'] # 匹配所有打了对应标签的目标节点 environment: production # 可绑定GitHub环境,配置部署前人工审批 strategy: max-parallel: 2 # 每次同时部署2台,避免全量节点同时重启导致服务不可用 fail-fast: false # 单个节点部署失败不中断其余节点的部署流程 steps: - uses: actions/checkout@v4 - name: 拉取构建制品 run: wget ${{ secrets.ARTIFACT_INTERNAL_URL }} -O /opt/app/release.tar.gz - name: 停止旧服务 run: sudo systemctl stop my-app - name: 更新版本并重启 run: | tar -zxf /opt/app/release.tar.gz -C /opt/app/ sudo systemctl start my-app - name: 本地健康检查 run: curl -f http://localhost:8080/health
- 这个方案的优势是不需要给VM开放公网SSH/WinRM端口,所有通信都是VM主动向GitHub发起到443端口的出站连接,安全组配置更简单,每个节点的部署日志可以直接在GitHub工作流页面查看。
方案2:对接云厂商原生批量运维能力(适合大规模VM集群)
如果不想在业务VM上额外维护Runner代理,可以直接对接云厂商自带的无代理批量管理能力:
- AWS侧:所有EC2实例默认预装SSM Agent,只需要给VM绑定对应权限的IAM角色,在GitHub Actions里通过AWS官方认证Action配置好临时凭证后,直接调用SSM Run Command接口,就能按标签、资源组筛选目标EC2批量执行部署脚本,原生支持分批部署、错误阈值控制、自动回滚配置
- Azure侧:通过Azure官方登录Action完成服务主体认证后,调用Azure CLI的
az vm run-command invoke命令,即可按标签、资源组筛选目标Azure VM批量下发部署命令,可直接复用Azure原有VM权限、运维审计体系 - 这个方案不需要在VM上装额外代理,适合VM规模较大、已经在使用云厂商原生运维工具的场景。
方案3:轻量SSH批量部署(适合小规模测试场景)
如果VM数量在10台以内、测试环境临时部署,可以把VM的SSH连接信息存到GitHub Secrets里,用并行SSH工具批量连接目标节点执行部署脚本。注意这个方案不要把SSH 22端口直接暴露在公网,优先通过跳板机连接,且尽量用短期临时密钥,不要用长期固定的私钥凭证,避免安全风险。
实用提示:建议搭配GitHub Environments功能做环境隔离,不同环境的节点标签、审批规则、环境变量单独配置,所有部署操作、节点状态都有全链路审计,整体使用体验和Azure DevOps部署组基本对齐。
内容的提问来源于stack exchange,提问作者Sarmad
相关产品推荐
相关产品推荐

