应用发布

更新时间:
复制为 MD 格式

当需要在伸缩组中的ECS实例上持续部署业务应用(Continuous Deployment)时,可以使用弹性伸缩集成的应用发布功能。它能帮助您自动化发布应用,并结合弹性伸缩生命周期挂钩实现应用的自动发布和优雅下线。

概述

弹性伸缩(ESS)的应用发布功能将应用源文件和启动/停止脚本封装为部署物,并通过标准化的发布流程将其部署到伸缩组实例中。

支持的部署物类型

根据应用源文件的存储位置,可以选择不同的部署物类型:

类型

说明

适用场景

OSS文件

应用文件(如JAR/ZIP包)存储在OSS中。发布时自动下载并执行脚本。

传统应用部署,如Java应用。

ECS镜像

应用预装在ECS镜像中。发布时直接替换实例系统盘。

需要快速启动或环境复杂的应用。

Docker镜像

应用镜像存储在容器镜像服务ACR中。发布时自动拉取并启动容器。

容器化应用部署。

仅执行命令

不指定源文件,仅执行Shell脚本。

灵活的脚本化部署,或使用第三方源。

发布能力

  • 发布模式:支持全量发布(所有实例)和灰度发布(手动选择部分实例验证)。

  • 分批控制:支持设置发布批次,并可配置批次间暂停,降低发布风险。

  • 弹性集成

    • 扩容自动发布:新扩容的实例会自动部署最新版本的应用,确保版本一致性。

    • 缩容优雅下线:缩容前先执行停止脚本,确保业务处理完毕后再释放实例。

使用限制

  • 实例系统:仅支持 Linux 系统的 ECS 实例。

  • 脚本语言:启动和停止脚本仅支持 Shell 脚本。

  • 部署流程:遵循先停后启原则,每次部署都会先执行停止脚本,确保上一次部署的应用版本被正常停止,再执行启动脚本。

  • 数据风险:使用ECS镜像类型部署时,会替换实例的系统盘,请务必提前备份重要数据。

创建部署物

  1. 登录弹性伸缩控制台

  2. 在左侧导航栏中,单击伸缩组管理
  3. 在顶部菜单栏处,选择地域。
  4. 单击伸缩组ID进入伸缩组详情页,单击应用发布 > 部署物 > 创建部署物

  5. 根据应用场景选择合适的部署物类型进行配置。

    OSS文件

    适用于将应用包(如 JAR、WAR、ZIP)存储在 OSS 的场景。发布时,系统会自动下载文件到指定工作目录,然后先执行应用停止脚本停止上一版本的应用(如有),再执行应用启动脚本启动当前应用。

    • 配置项

      • OSS信息:选择OSS地域OSS Bucket,并在OSS文件配置项填写文件在Bucket中的路径(如 apps/sample-spring-1.0-SNAPSHOT.jar)。

      • 内网下载:如果 ECS 实例与OSS在同一地域,建议开启此选项以提升下载速度。

    • 启动/停止脚本示例

      应用启动脚本

      start_application() {
        set -e
        yum install -y maven-3.5.4
        java -jar ./sample-spring-1.0-SNAPSHOT.jar &
      }
      
      start_application

      应用停止脚本

      重要

      如不需要停止应用相关操作,可将停止脚本置空,部署时会跳过。

      ### Stop the application (if any)
      stop_application() {
        PID=$(ps -ef | grep "sample-spring-1.0-SNAPSHOT.jar" | grep -v "grep" | awk '{print $2}')
        if [ -n "$PID" ]; then
          kill -9 $PID
        fi
      }
      
      stop_application

    ECS镜像

    适用于应用环境复杂或启动时间要求极高的场景。发布时,系统会将伸缩组内实例的系统盘替换为指定的镜像。

    选择ECS镜像部署物时,需单击新增按钮后,选择伸缩组所在地域下的镜像。

    • 配置项

      • 地域:选择与伸缩组相同的地域。

      • 镜像ID:选择与伸缩组所在地域一致的自定义镜像(包含已部署好的应用)。

    重要

    ECS镜像部署物不支持配置应用启动/停止脚本,如需应用自动启动,请配置应用的开机自启动手动配置生命周期挂钩实现。

    Docker镜像

    适用于容器化应用。发布时,系统会自动从 ACR 拉取镜像,然后先执行应用停止脚本停止上一版本的容器(如有),再执行应用启动脚本启动当前容器。

    重要

    仅支持选择容器镜像服务ACR企业版中的Docker镜像,对于个人版ACR或第三方镜像仓库,通过仅执行命令部署物进行部署。

    • 配置项

      • Docker镜像信息:设置容器镜像服务地域容器镜像服务实例ID命名空间仓库名称镜像版本等信息。

      • 内网拉取:如果要使用内网链接拉取镜像,请确保您的镜像仓库和ECS实例在同一个VPC内,具体请参考配置专有网络的访问控制

    • 启动/停止脚本

      应用启动脚本

      重要
      • 请确保待发布机器上已安装Docker。

      • 发布时,Docker镜像会在脚本执行前被自动拉取到ECS实例上,脚本中无需做拉取镜像相关操作。

      ### 发布时,Docker镜像会被自动拉取到ECS上,可直接进行容器启动操作。
      ### 启动当前版本的容器
      ### 使用时,需将<image_name>替换为实际镜像地址
      start_application() {
        image_name="<image_name>"
        container_name="my-container"
        docker run -d -p 8080:8080 --name ${container_name} ${image_name}
      }
      
      start_application

      应用停止脚本

      重要

      如果不需要停止应用相关操作,可将停止脚本置空,部署时会跳过。

      stop_application() {
        # 通过容器名查询容器是否存在,如存在则删除容器
        container_name="my-container"
        container_id=$(docker ps -aq -f name=${container_name}) 
        if [ -n "$container_id" ]; then
          docker rm -f $container_id
        fi
      }
      
      stop_application

    仅执行命令

    适用于无需特定源文件,仅通过 Shell 脚本进行部署的场景(如从第三方源下载代码)。发布时,系统会先执行应用停止脚本停止上一版本的应用(如有),再执行应用启动脚本启动当前应用。

    • 配置项:无需配置部署物源,仅需指定工作目录

    • 启动/停止脚本示例(以拉取公共镜像为例):

      应用启动脚本

      ### 启动当前版本的应用           
      start_application() {
         repo="<repo>"
         image="<image>"
         container_name="my-container"
         docker login --username=${username} --password=${password} $repo
         docker pull $image
         docker run -d -p 8080:8080 --name $container_name $image
      }
      
      start_application

      应用停止脚本

      重要

      如果不需要停止应用相关操作,可将停止脚本置空,部署时会跳过。

      ### 停止容器(如果有)
      ### Stop the container (if any)
      
      stop_application() {
        # 通过容器名查询容器是否存在,如存在则删除容器
        # Query whether the container exists by the container name, and delete the container if it exists
        container_name="my-container"
        container_id=$(docker ps -aq -f name=${container_name}) 
        if [ -n "$container_id" ]; then
          docker rm -f $container_id
        fi
      }
      
      stop_application
  6. 完成配置后,单击创建并发布仅创建

    单击创建并发布后,会继续进入部署物发布配置。

部署物发布

  1. 应用发布页签下,选择部署物发布 > 发布

  2. 选择要发布的部署物ID

  3. 配置发布策略:

    • 发布模式

      • 全量发布:发布到组内所有实例。

      • 灰度发布:手动选择特定实例,进行发布。

    • 分批策略:设置执行批次(如分2批),并选择分批模式(不暂停/第一批暂停/每批暂停)。

    • 弹性场景:建议保持默认开启扩容时自动发布缩容时优雅下线

      • 扩容时自动发布:开启后,在扩容出的ECS机器上将自动发布应用。在发布过程中,会自动配置一个扩容的生命周期挂钩

      • 缩容时优雅下线:开启后,在缩容的ECS机器上执行部署物应用停止脚本后再完成缩容。在发布过程中,会自动配置一个缩容的生命周期挂钩

  4. 单击确定开始发布。可在列表中单击详细查看执行状态和输出日志。

应用于生产环境

为了保障生产环境的稳定性,建议遵循以下最佳实践:

  • 降低发布风险

    • 优先使用灰度发布在少量实例上验证新版本。

    • 全量发布时,建议开启分批发布并选择第一批暂停。待第一批实例发布成功并验证无误后,再继续后续批次。

  • 保障业务连续性:可开启缩容时优雅下线,并在部署物中编写完善的停止脚本(如等待请求处理完毕、关闭连接),避免缩容导致业务中断。

  • 确保版本一致性:可开启扩容时自动发布,防止伸缩组自动扩容出的新实例运行旧版本应用。

常见问题

  • 应用发布功能支持 Windows 实例吗?

    不支持。目前仅支持 Linux 系统的 ECS 实例。

  • 发布过程中,伸缩组还会触发扩缩容吗?

    会。应用发布过程不会阻断伸缩活动。

  • 如何查看应用发布的日志和结果?

    发布任务开始后,您可以在部署物发布列表中点击执行ID,查看每台实例的执行状态和详细的脚本输出日志。

  • 如果部署失败了,会对现有实例有什么影响?

    如果脚本执行失败,该实例的发布状态会显示为失败。对于分批发布且开启了每批暂停第一批暂停的场景,后续批次将不会继续执行,从而控制影响范围。建议在发布前先通过灰度发布在少量实例上验证。

  • 应用启动/停止脚本的执行目录在哪里?

    脚本会在创建部署物时指定的工作目录执行。