通过Maven插件自动部署应用

您可以通过Maven的toolkit-maven-plugin插件完成SAE应用的自动化部署。本文介绍通过Maven自动化部署应用的典型场景、操作步骤、配置参数以及如何部署多模块工程。

前提条件

背景信息

toolkit-maven-plugin是一个开源工具,能够帮助您构建一个完整的生命周期框架,完成项目的基础工具建设。功能特性如下:

  • 可扩展,能够轻松编写Java或脚本语言。

  • 能够将任意数量的项目构建到预定义的输出类型中,例如JAR、WAR或基于项目元数据的分发,在大多数情况下无需执行任何脚本。

  • 无需额外的配置,就可以与源代码管理系统(例如Subversion或Git)集成,并可以基于某个标签管理项目的发布。

典型场景示例

本地构建WAR或FatJAR包并部署应用

例如,您在华北2(北京)地域下有WAR类型的应用,期望在本地使用WAR包部署应用。文件打包和部署配置如下。

  • 打包文件

    apiVersion: V1
    kind: AppPackage
    spec:
      packageType: War                                    
  • 部署文件

    apiVersion: V1
    kind: AppDeployment
    spec:
      type: serverless
      target:
        appId:        # 部署应用的ID。如果配置了该参数则无需配置namespaceId和appName。
        namespaceId:  # 应用所属命名空间ID。如果您不清楚应用ID,可使用应用所属命名空间及应用名称部署。
        appName:      # 应用名称。如果您不清楚应用ID,可使用应用名称及命名空间部署。                                      

使用已有镜像地址部署镜像类型应用

例如,您在华北2(北京)地域下有一个镜像类型应用,期望使用已有的镜像部署应用。文件打包和部署配置如下。

  • 打包文件

    apiVersion: V1
    kind: AppPackage
    spec:
      packageType: Image
      imageUrl: registry.cn-beijing.aliyuncs.com/test/gateway:latest  # 镜像地址。
      acrInstanceId: # ACR EE实例ID。如果需要使用ACR EE,则填写该参数。
  • 部署文件

    apiVersion: V1
    kind: AppDeployment
    spec:
      type: serverless
      target:
        appId:        # 部署应用的ID。如果配置了该参数则无需配置namespaceId和appName。
        namespaceId:  # 应用所属命名空间ID。如果您不清楚应用ID,可使用应用所属命名空间及应用名称部署。
        appName:      # 应用名称。如果您不清楚应用ID,可使用应用名称及命名空间部署。                                  

本地构建镜像上传至仓库并部署应用

例如,您在华北2(北京)地域下有镜像类型应用,期望在本地编译并构建为镜像,然后上传到阿里云镜像仓库部署应用。文件打包和部署配置如下。

  • 打包文件

    apiVersion: V1
    kind: AppPackage
    spec:
      packageType: Image
      build:
        docker:
           dockerfile: Dockerfile # 指定Dockerfile。
           imageRepoAddress:      # 镜像仓库地址。
           imageTag:              # 镜像Tag。
           imageRepoUser:         # 镜像仓库用户名。
           imageRepoPassword:     # 镜像仓库密码。
      acrInstanceId:              # ACR EE实例ID。如果需要使用ACR EE,则填写该参数。
  • 部署文件

    apiVersion: V1
    kind: AppDeployment
    spec:
      type: serverless
      target:
        appId:        # 部署应用的ID。如果配置了该参数则无需配置namespaceId和appName。
        namespaceId:  # 应用所属命名空间ID。如果您不清楚应用ID,可使用应用所属命名空间及应用名称部署。
        appName:      # 应用名称。如果您不清楚应用ID,可使用应用名称及命名空间部署。                                      

部署应用

本示例介绍如何通过添加插件依赖并部署配置信息,将本地环境的工程部署到SAE上。

  1. 在打包工程的pom.xml文件中添加插件依赖。

    说明

    建议您使用最新1.1.8版本的toolkit-maven-plugin。

    <build>
        <plugins>
            <plugin>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>toolkit-maven-plugin</artifactId>
                <version>1.1.8</version>
            </plugin>
        </plugins>
    </build>                            
  2. 配置插件信息。

    配置插件信息主要包括配置账号、打包和部署信息。更多信息,请参见更多配置项

    1. 配置账号信息。

      在打包工程的根目录下创建文件格式为YAML的账号配置文件,命名为toolkit_profile.yaml并输入以下信息。

      regionId:        # 应用所在地域。
      accessKeyId:     # 访问阿里云资源的AccessKey ID,建议您使用RAM用户的AccessKey ID降低安全风险。
      accessKeySecret: # 访问阿里云资源的AccessKey Secret,建议您使用RAM用户的AccessKey Secret降低安全风险。                                    
    2. 配置打包信息。

      在打包工程的根目录下创建文件格式为YAML的打包配置文件。如果打包工程为Maven的子模块,则需要在子模块的目录下创建该文件,并命名为toolkit_package.yaml,输入以下信息。

      apiVersion: V1
      kind: AppPackage
      spec:
       packageType:   # 应用部署包类型,支持War、FatJar、Image、url。您只有在该处配置了URL,packageUrl才能生效。
       packageUrl:    # 部署包地址,War、FatJar类型应用可配置。不填则使用当前Maven构建的包部署。
       imageUrl:      # 如果部署包类型为Image,可配置此字段。Image类型也可以在本地构建Docker镜像部署。
       acrInstanceId: # ACR EE实例ID。如果需要使用ACR EE,则填写该参数。
    3. 配置部署信息。

      在打包工程的根目录下创建文件格式为YAML的部署文件,命名为toolkit_deploy.yaml,并输入以下信息。

      apiVersion: V1
      kind: AppDeployment
      spec:
       type: serverless
       target:
         appId:        # 部署应用的ID。如果配置了该参数则无需配置namespaceId和appName。
         namespaceId:  # 应用所属命名空间ID。如果您不清楚应用ID,可使用应用所属命名空间及应用名称部署。
         appName:      # 应用名称。如果您不清楚应用ID,可使用应用名称及命名空间部署。                                   
  3. 进入pom.xml所在的目录,执行以下命令构建部署工程。

    重要

    如果部署的是Maven子模块,需要进入子模块pom.xml文件所在的目录执行部署工程。

    mvn clean package toolkit:deploy -Dtoolkit_profile=toolkit_profile.yaml -Dtoolkit_package=toolkit_package.yaml -Dtoolkit_deploy=toolkit_deploy.yaml                           

    命令参数说明如下。

    参数

    说明

    toolkit:deploy

    打包完成后,部署应用。

    -Dtoolkit_profile

    指定账号配置文件。如果账号文件与pom.xml在同一个目录下,且名称为.toolkit_profile.yaml,可不填写该参数,插件会自动获取。

    重要

    插件自动获取的.toolkit_profile.yaml文件名最前面包含英文句号。

    -Dtoolkit_package

    指定打包文件。如果打包文件与pom.xml在同一个目录下,且名称为.toolkit_package.yaml,可不填写该参数,插件会自动获取。

    重要

    插件自动获取的.toolkit_package.yaml文件名最前面包含英文句号。

    -Dtoolkit_deploy

    指定部署文件。如果部署文件与pom.xml在同一个目录下,且名称为.toolkit_deploy.yaml,可不填写该参数,插件会自动获取。

    重要

    插件自动获取的.toolkit_deploy.yaml文件名最前面包含英文句号。

    -Ddeploy_version

    指定部署的版本号,优先级高于toolkit_deploy.yaml文件中的Version配置。

    说明

    该参数仅支持1.1.2及以上版本的toolkit-maven-plugin插件。

    执行该打包命令后,系统显示如下结果,当返回信息中显示BUILD SUCCESS表示部署成功。page_deploy_maven_plugin_version_1.1.8

部署多模块工程

模块工程是常见的项目组织形式,toolkit-maven-plugin插件支持以下两种方式来部署多模块工程。

在父工程中执行打包及部署命令

此方式支持1.0.3及以上版本的toolkit-maven-plugin。

在父工程中执行toolkit:deploy命令时,增加-Ddeploy_artifacts参数来指定需要部署的子模块Artifact ID。如果希望部署多个子模块,请以英文半角逗号(,)分隔。

例如,一个CarShop工程存在以下示例的子模块:

carshop
   itemcenter-api
   itemcenter
   detail

如果想同时部署itemcenter和detail子模块,您可以在carshop目录下,执行以下命令:

mvn clean package toolkit:deploy -Ddeploy_artifacts=itemcenter,detail

默认情况下,此插件会根据itemcenter和detail模块下的.edas_config.yaml文件来分别部署对应的应用。您也可以通过增加-Dedas_config参数来指定配置文件。

在子模块中执行打包及部署命令

此方式支持所有版本的toolkit-maven-plugin。

首先,在父工程中执行install命令,将子模块依赖安装到本地的Maven仓库。然后,进入需要部署的子模块目录下执行toolkit:deploy命令。

更多配置项

  • 展开查看打包参数。

    打包文件支持的参数如下所示。

    apiVersion: V1
    kind: AppPackage
    spec:
      packageType:   # 应用部署包类型,支持War、FatJar、Image、url。您只有在该处配置了URL,packageUrl才能生效。
      imageUrl:      # 镜像地址,Image包类型应用可设置。如果设置了spec.build.docker,使用本地构建的镜像部署,无需设置该参数。
      acrInstanceId: # ACR EE实例ID。如果需要使用ACR EE,则填写该参数。
      packageUrl:    # 部署包地址,War、FatJar类型应用可填入。
      build:
        docker:
           dockerfile:        # Docker镜像构建文件。如果您希望在本地构建镜像部署,需要填入此字段,例如:Dockerfile。
           imageRepoAddress:  # 阿里云镜像仓库地址。如果您希望在本地构建镜像部署,需要填入此字段,例如:registry.cn-beijing.aliyuncs.com/edas_demo/demo。
           imageTag:          # 镜像Tag。如果您希望在本地构建镜像部署,需要填入此字段,例如:test。
           imageRepoUser:     # 阿里云镜像仓库用户名。如果您希望在本地构建镜像部署,需要填入此字段,例如:***@***。
           imageRepoPassword: # 阿里云镜像仓库密码。如果您希望在本地构建镜像部署,需要填入此字段,例如:password。
        oss:
           bucket:              # 目标存储桶名称。如果您希望使用自定义的OSS仓库存储部署包,需要填入此字段,例如:bucket-name01。
           key:                 # OSS自定义路径。如果您希望使用自定义的OSS仓库存储部署包,需要填入此字段,例如:test1/test.jpg。
           accessKeyId:         # OSS账号。如果您希望使用自定义的OSS仓库存储包,需要填入此字段。
           accessKeySecret:     # OSS密码。如果您希望使用自定义的OSS仓库存储包,需要填入此字段。
           useVpcEndpoint: true # 是否通过内网上传文件。true表示通过内网上传,false表示不通过内网上传。
           accessTimeout:30     # 部署包临时访问地址的过期时间,单位为分钟,默认为30。如果您希望使用自定义的过期时间,可修改该字段。                       
  • 展开查看部署参数。

    部署文件当前支持的完整参数如下所示。

    说明
    • 如果您有新的参数需要支持,请加入钉群(钉群号:32874633),联系产品技术专家进行咨询。

    • 为了能够完整地使用以下参数部署应用,推荐您使用最新版本的Maven插件。

    apiVersion: V1
    kind: AppDeployment
    spec:
      type: serverless
      target:
        appName:     # 应用名称。
        namespaceId: # 应用所在命名空间。
        appId:       # 应用ID。插件会使用此应用进行部署,如果未填入则使用namespaceId和appname来查找应用进行部署。
      version:       # 部署版本号,默认使用日时分秒格式。
      jdk:           # 部署的包依赖的JDK版本,支持以下6个选项:OpenJDK 8、OpenJDK 7、Dragonwell 11、Dragonwell 8、openjdk-8u191-jdk-alpine3.9、openjdk-7u201-jdk-alpine3.9。镜像不支持。
      webContainer:  # 部署的包依赖的Tomcat版本,支持以下2个选项:apache-tomcat-7.0.91、apache-tomcat-8.5.42。
      batchWaitTime: # 分批等待时间。
      command:       # 镜像启动命令。该命令必须为容器内存在的可执行的对象。
      commandArgs:   # 镜像启动命令参数。上述启动命令所需参数。
      - 1d
      updateStrategy: 
        type: GrayBatchUpdate # 部署类型,BatchUpdate表示分批部署,GrayBatchUpdate表示灰度部署。
        batchUpdate: 
          batch: 2 # 分批数,如果是灰度部署,表示灰度批次后的分批数。
          releaseType: manual # 分批类型。manual表示手动分批,auto表示自动分批。
          batchWaitTime: 0 # 分批类型为auto时使用,表示分批间间隔时间,单位为分钟。
        grayUpdate: # 灰度部署时需要配置。
          gray: 1 # 灰度的实例数。
      envs:    # 容器环境变量参数。
        - name: envtmp0
          value: '0'
        - name: envtmp1
          value: '1'
      customHostAlias:  # 容器内自定义host映射。
        - hostName: 'samplehost1'
          ip: '127.X.X.X'
        - hostName: 'samplehost2'
          ip: '127.X.X.X'
      jarStartOptions:  # JAR包启动应用选项。
      jarStartArgs:     # JAR包启动应用参数。
      liveness:   # 容器健康检查,健康检查失败的容器将被重启。
        exec:
          command:
            - sleep
            - 1s
        initialDelaySeconds: 5
        timeoutSeconds: 11
        periodSeconds: 30 
      readiness:  # 应用启动状态检查,多次健康检查失败的容器将被重启。不通过健康检查的容器将不会有SLB流量进入。
        exec:
          command:
            - sleep
            - 1s
        initialDelaySeconds: 5
        timeoutSeconds: 11
        periodSeconds: 30   
      minReadyInstances: 1  # 最小存活实例数。在滚动升级过程中或者滚动升级失败时,可用实例数都将尽可能不小于该值,为0则没有限制。弹性扩缩容的范围不能小于该值,否则将触发异常。
      timezone: Asia/Shanghai # 时区设置。
      warStartOptions: CATALINA_OPTS=\"$CATALINA_OPTS $Options\" catalina.sh run # WAR包部署的启动命令。
      tomcatConfig: # 以WAR包部署的Tomcat配置。
        port: 8082
        maxThreads: 399
        contextPath: /test/
        uriEncoding: UTF-8
        useBodyEncodingForUri: false
      nasConfig: # NAS配置。
        nasId: 3fc4*****
        mountHost: 3fc4*****.cn-shanghai.nas.aliyuncs.com
        mountDesc:
          - mountPath: /nas
            nasPath: /
      postStart: # 启动后处理。
        exec:
          command:
            - sh
            - -c
            - echo helloPostStart
      preStop: # 停止前处理。
        exec:
          command:
            - sh
            - -c
            - echo helloPreStop
      terminationGracePeriodSeconds: 9 # 优雅下线时间,单位为秒。
      changeOrderDesc: maven test # 发布说明。
      autoEnableApplicationScalingRule: true # 是否自动启用弹性规则。
      associateEip: true # EIP配置。该配置与autoEnableApplicationScalingRule的配置互斥,即二者只能有一个取值为true。
      configMapMountDesc: # ConfigMap配置。
        - configMapId: 123**
          key: config1
          mountPath: /configMap
      enableAhas: true # 是否启用AHAS。
      ossConfig: # OSS配置。
        ossAkId: ******
        ossAkSecret: ******
        ossMountDescs:
          - bucketName: ******-cn-shanghai-s-*****
            bucketPath: /
            mountPath: /ossPath
            readOnly: true
      slsConfigs: # SLS日志采集设置,不填写选填项,则SAE会自动创建相应SLS资源;选填1和2,会采用指定SLS资源并自动创建Logtail配置;选填1、2和3,则完全采用您指定的SLS资源与Logtail配置。
        - logDir: /tmp/test.log # 必填,文件日志路径。
          projectName: test-project   # 选填项1。
          logstoreName: test-logstore # 选填项2。
          logtailName: test-logtail   # 选填项3。

更多信息

SAE部署应用完成后,您可以对应用进行如下操作。

操作

相关文档

更新、扩缩容、启停、删除应用等生命周期管理的操作

管理应用生命周期

自动弹性伸缩、CLB绑定和批量启停等提升应用性能的操作

日志管理、监控管理、应用事件查看和变更记录查看等聚焦应用运行状态的操作