使用API在ECS集群中分批发布应用

本文介绍如何使用EDAS提供的Java SDK调用API在EDAS ECS集群中分批发布应用。

前提条件

在EDAS ECS环境中分批发布应用前,您必须提前完成以下准备工作:

  • 安装EDAS的Java SDK。更多信息,请参见Java SDK接入指南
  • 确定创建应用的地域,假设为cn-hangzhou

  • 创建微服务空间。具体操作,请参见创建命名空间

    如果已经存在命名空间,您可以调用ListUserDefineRegion接口查询用户自定义命名空间列表,获取目标命名空间的RegionId

  • 在ECS集群中创建应用,具体操作,请参见使用API创建应用(ECS)

    如果已经创建应用,您可以调用ListApplication接口查询应用列表,获取目标应用的AppId,假设为6bbc57a2-a017-4bec-b521-49a15bd3****

  • 已将应用部署包(JAR包或WAR包)上传至目标地址。本示例以OSS存储路径为例,假设为https:doc***.oss-cn-hangzhou.aliyuncs.com/sc-****-D-0.0.1-SNAPSHOT.jar

  • 如果需要发布HSF应用,则需要调用ListBuildPack接口查询容器版本列表,获取容器版本(ConfigId)参数,假设为57

分批发布应用

以下代码适用于在ECS环境分批发布应用。代码中未设置环境变量等高级参数,如您需了解更多API参数信息,请参见DeployApplication

说明

以下代码适用于分批发布Spring Cloud和Dubbo应用,如需发布HSF应用,则需要在代码中增加EDAS-Container信息:

//EDAS-Container构建包号,当发布HSF应用时,该参数必须指定。可以调用ListBuildPack接口获取,对应ConfigId参数。
request.setBuildPackId(57);
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.exceptions.ServerException;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.edas.model.v20170801.DeployApplicationRequest;
import com.aliyuncs.edas.model.v20170801.DeployApplicationResponse;

public class DeployApplication {

    public static void main(String[] args)  {
        // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
        // 此处以把AccessKey和AccessKeySecret保存在环境变量为例说明。您可以根据业务需要,保存到配置文件里。
        // 强烈建议不要把AccessKey和AccessKeySecret保存到代码里,会存在密钥泄漏风险。
        String aliyun_user_ak = System.getenv("ACCESS_KEY_ID");
        String aliyun_user_sk = System.getenv("ACCESS_KEY_SECRET");
        //需要部署应用的所在地域ID。
        String region_id = "cn-hangzhou";

        DefaultProfile defaultProfile = DefaultProfile.getProfile(region_id, aliyun_user_ak, aliyun_user_sk);
        DefaultAcsClient client = new DefaultAcsClient(defaultProfile);

        //创建API请求,并设置参数。
        DeployApplicationRequest request = new DeployApplicationRequest();
        //目标应用的AppId。
        request.setAppId("6bbc57a2-a017-4bec-b521-49a15bd3****");
        //应用描述信息。
        request.setDesc("分批发布应用");
        //部署类型,仅支持设置为url。
        request.setDeployType("url");
        //应用部署包(WAR或JAR)的URL地址,建议使用OSS存储的应用部署包路径。
        request.setWarUrl("https:doc***.oss-cn-hangzhou.aliyuncs.com/sc-****-D-0.0.1-SNAPSHOT.jar");
        //部署的应用部署包版本,最长64个字符,建议使用时间戳。
        request.setPackageVersion("1619094147");
        //部署分组ID。如果要部署到所有分组,参数设置为all。
        //如果需要部署到具体应用实例分组,可以调用ListDeployGroup接口获取GroupId。
        request.setGroupId("all");
        //每组发布批次,设置为大于1,代表分批发布。
        request.setBatch(2);
        //分批方式,0表示自动,1表示批次间需要手动确认。建议使用自动发布方式。
        request.setReleaseType((long) 0);
        //分批等待时间,单位分钟。默认为0,表示不等待;最大值为5。
        request.setBatchWaitTime(1);
        //应用组件ID。您单批发布Spring Cloud或Dubbo时,JAR包部署需要选择JDK版本,WAR包部署需要选择Apache Tomcat版本;单批发布HSF应用时无需设置该参数。
        //4代表Apache Tomcat 7.0.91,7代表Apache Tomcat 8.5.42,5代表OpenJDK 1.8.x,6代表OpenJDK 1.7.x。
        request.setComponentIds("5");

        try {
            DeployApplicationResponse response = client.getAcsResponse(request);
            System.out.println("Message=" + response.getMessage() + "\nChangeOrderId=" + response.getChangeOrderId());
        } catch (ServerException e) {
            e.printStackTrace();
        } catch (ClientException e) {
            e.printStackTrace();
        }
    }
}

运行程序,返回的执行结果如下所示:

Message=success
ChangeOrderId=04c5638f-405e-41de-99b2-e0dccb2****

结果验证

您在分批发布应用后,可以调用GetChangeOrderInfo接口查看变更流程详情,获取分批发布应用的变更状态。具体API参数详情,请参见GetChangeOrderInfo

调用GetChangeOrderInfo接口查看变更流程详情,返回的执行结果如下:

{
  "Message": "success",
  "RequestId": "01FAA54A-43C0-4681-B985-33BA44D64340",
  "Code": 200,
  "changeOrderInfo": {
    "Status": 2,
    "Desc": "分批发布",
    "PipelineInfoList": {
      "PipelineInfo": [
        {
          ......
         "PipelineId": "4ff02b63-e14d-4124-86ff-22239f80****"
          ......
          "PipelineId": "6dbbfff8-bcf7-4300-aa59-ccb06909****"
           ......
          //此处未罗列全部执行结果,仅供参考。
}

请查看上述执行结果中的changeOrderInfo.Status参数值,通过该值判断分批发布应用的变更是否成功。changeOrderInfo.Status的取值如下:

  • 0:准备

  • 1:执行中

  • 2:执行成功

  • 3:执行失败

  • 6:终止

  • 8:手动分批发布模式下,等待手工确认执行下一批。

  • 9:自动分批发布模式下,等待下一批执行中。

  • 10:系统异常执行失败

手动确认下一批发布

如果您使用的是手动确认分批发布方式,则需要调用ContinuePipeline接口手动确认下一批发布。

  1. 调用GetChangeOrderInfo接口,获取分批发布应用变更的相关批次的流程ID(PipelineId)。

    调用GetChangeOrderInfo接口,返回结果如下:

    {
      "Message": "success",
      "RequestId": "01FAA54A-43C0-4681-B985-33BA44D64340",
      "Code": 200,
      "changeOrderInfo": {
        "Status": 8,
        "Desc": "分批发布应用",
        "PipelineInfoList": {
          "PipelineInfo": [
            {
               ......
               "PipelineId": "4ff02b63-e14d-4124-86ff-22239f80****"
               ......
               "PipelineId": "6dbbfff8-bcf7-4300-aa59-ccb06909****"
                ......
               //此处未罗列全部执行结果,仅供参考。
    }  
    说明

    如果您设置的是应用的ECS实例分2批发布+手动的分批发布方式,在调用GetChangeOrderInfo接口返回结果中会出现2个流程ID(PipelineId),第二次出现的流程ID(PipelineId)代表需要手动确认发布的批次。

    按此规律,如果是应用的ECS实例分3批发布+手动的分批发布方式,则会出现3个流程ID(PipelineId),第二次和第三次出现的流程ID(PipelineId)代表需要手动确认发布的批次。

  2. 调用ContinuePipeline接口,手动确认下一批发布。

    返回结果如下:

    {
      "Message": "success",
      "RequestId": "B8ECF6F7-672D-40E9-91DD-1C33F06D4FD8",
      "Code": 200
    }
    说明

    如果是需要手动确认多批的场景,请选择正确批次的流程ID(PipelineId)并重复执行此步骤。