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

背景信息

toolkit-maven-plugin是一个开源工具,能够帮助您构建一个完整的生命周期框架,完成项目的基础工具建设。功能特性如下:
  • 可扩展,能够轻松编写Java或脚本语言。
  • 能够将任意数量的项目构建到预定义的输出类型中,如JAR、WAR或基于项目元数据的分发,而不需要在大多数情况下执行任何脚本。
  • 不需要额外的配置,就可以与源代码管理系统(如Subversion或Git)集成,并可以基于某个标签管理项目的发布。

Cloud Toolkit的更多信息,请参见什么是Alibaba Cloud Toolkit

典型场景示例

场景一:本地构建WAR或FatJAR包并部署

例如您在华北2(北京)地域下有WAR类型的应用,期望在本地使用WAR包部署应用。文件打包和部署配置如下。
  • 打包文件
    apiVersion: V1
    kind: AppPackage
    spec:
      packageType: War                                    
  • 部署文件
    apiVersion: V1
    kind: AppDeployment
    spec:
      type: serverless
      target:
        appId:        #部署应用的ID。如果配置了该参数则无需配置namespaceIdappName。
        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。如果配置了该参数则无需配置namespaceIdappName。
        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。如果配置了该参数则无需配置namespaceIdappName。
        namespaceId:  #应用所属命名空间ID。如果您不清楚应用ID,可使用应用所属命名空间及应用名称进行部署。
        appName:      #应用名称。如果您不清楚应用ID,可使用应用名称及命名空间进行部署。                                      

操作步骤

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

  1. 在您的打包工程的pom.xml文件中添加插件依赖。
    <build>
        <plugins>
            <plugin>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>toolkit-maven-plugin</artifactId>
                <version>1.1.8</version>
            </plugin>
        </plugins>
    </build>                            
    说明 建议您使用1.1.8版本的toolkit-maven-plugin。
  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:   #应用部署包类型,支持WarFatJarImageurl。您只有在该处配置了URL,那么packageUrl才能生效。
       packageUrl:    #部署包地址,WarFatJar类型应用可配置。不填则使用当前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。如果配置了该参数则无需配置namespaceIdappName。
         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配置。
    说明 toolkit-maven-plugin插件1.1.2及以上版本支持该配置参数。
    执行该打包命令后,系统显示如下结果,当返回信息中显示BUILD SUCCESS表示部署成功。page_deploy_maven_plugin_version_1.1.8

部署多模块工程

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

  • 方式一:在父工程中执行打包及部署命令。

    此方式需要toolkit-maven-plugin为1.0.3及以上版本。

    在父工程中执行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:   #应用部署包类型,支持WarFatJarImageurl。您只有在该处配置了URL,那么packageUrl才能生效。
  imageUrl:      #镜像地址,Image包类型应用可设置。如果设置了spec.build.docker,使用本地构建的镜像部署,则不需要设置该参数。
  acrInstanceId: #ACR EE实例ID,如果需要使用ACR EE才填写。
  packageUrl:    #部署包地址,WarFatJar类型应用可填入。
  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。如果您希望使用自定义的过期时间,可修改该字段。                       

部署参数

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

说明
  • 如果您有新的参数需要支持,提交工单加入钉钉群反馈。
  • 为了能够完整地使用以下参数部署应用,推荐您使用最新版本的Maven插件。
apiVersion: V1
kind: AppDeployment
spec:
  type: serverless
  target:
    appName:     #应用名称。
    namespaceId: #应用所在命名空间。
    appId:       #应用ID。插件会使用此应用进行部署,如果未填入则使用namespaceIdappname来查找应用进行部署。
  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。

更多信息