Apache Maven相关知识说明
Apache Maven是跨平台的项目管理工具。主要服务于基于Java平台的项目构建,项目管理和项目信息管理。所谓的项目构建就是对项目进行清理、编译、测试、报告、打包、部署等一系列的过程称为项目的构建。
关于更多的Maven介绍参考官方文档: https://maven.apache.org/
标准的Maven管理的Java项目一般有几种制品打包方式:
Maven的项目组织形式一般有两种:
Maven依赖包管理是其核心功能,依赖包管理我们需要注意以下几点内容:
Rainbond识别Maven项目
Rainbond rbd-chaos服务通过Git、SVN源代码管理协议从用户指定的代码仓库获取项目源代码,从项目主目录下读取pom.xml文件,如果读取到,则认为当前项目为Java-Maven类型,将采用Java-Maven类型对应的源码编译方式对源代码进行打包构建。
在服务创建过程中会发起源码检测任务,源码检测程序会读取pom.xml文件,如果从文件中读取到多模块的配置,即认为当前代码仓库是多模块类型,将批量创建多个Rainbond服务。
检测程序递归读取所有模块的pom.xml的配置,塞选所有的打包方式为 jar 或者 war 的模块,并自动生成默认的Maven构建命令(BUILD_MAVEN_CUSTOM_GOALS)和服务启动命令(BUILD_PROCFILE),这两个命令需要用户自行判断是否正确并修正,下文详细描述这两个参数的自定义方式:
构建命令类似如下形式:
clean install -pl module_name -am
Rainbond为每一个模块创建一个对应的服务,因此用户需要根据自身项目情况人工判断哪些是公共类库项目,在批量创建过程中取消公共类库类模块的创建。每一个服务对应有构建命令,如果不正确也需要用户自行修改。
如果识别的项目是单模块项目,则直接进入服务构建流程。
Rainbond构建Maven服务
当用户从UI触发或Webhook触发服务进行构建后,构建任务将由数据中心API服务生成发送到消息系统,由rbd-chaos服务从消息系统竞争构建任务,如果当前rbd-chaos节点正在执行的构建任务超过了最大值(默认最大值为节点CPU核数的2倍),将暂停任务的竞争。获取到任务后开始通过git 或svn 客户端获取项目代码并缓存下来,下一次构建任务在缓存代码的基础上进行代码更新。然后启动builder容器传入代码和构建参数(具体构建参数在下文中说明)执行构建任务。
构建任务的执行有如下步骤:
在项目源码主目录中可以定义system.properties 文件来指定JDK的版本和Maven的版本。格式如下:
java.runtime.version=1.9
maven.version=3.2.5
如果代码中存在system.properties 文件,代码检测阶段会读取此文件定义的JDK版本为BUILD_RUNTIMES变量赋默认值。
用户可以在Rainbond平台设置以下变量来选择JDK和Maven的版本:
注意,本文中所有描述的以BUILD_开头的变量都可以在服务环境变量中设置,其他大部分变量也已在构建源设置中体现。
1.1 JDK的下载
如果开启了ORACLEJDK的支持,通过指定的BUILD_ORACLEJDK_URL路径下载JDK, 如果未指定,Maven构建脚本默认根据上诉设置变量指定的版本来构建JDK的下载路径,比如:
http://lang.goodrain.me/jdk/openjdk1.8.0_20.tar.gz
lang.goodrain.me 域名是Rainbond数据中心内部域名,rbd-repo服务(artifactory)提供,意味着资源是从数据中心内部rbd-repo服务下载的。rbd-repo服务只是一层静态资源缓存,它第一次接收到请求后将从Rainbond提供的云OSS上下载相应的资源,然后缓存到本地。
注意,如果遇到JDK下载失败问题,需要确认rbd-repo是否能够正常联网,并且确认Rainbond是否提供了指定版本的JDK下载。
1.2 Maven的下载
Maven的下载与JDK是原理一致的,根据指定的版本构建下载路径从rbd-repo服务中下载。
- NO_CACHE 设置后下一次构建过程将先去除缓存资源后重新下载,移除变量后下一次则不会清理。
注意,存在于rbd-repo服务中的二级缓存用户可以访问rbd-repo服务的UI来清理。
编译程序首先需要构造编译命令,用户可以通过以下参数自定义设置Maven的编译命令:
因此如果你未设置任何参数时,Rainbond默认的构建命令为:
mvn -B -s setting.xml文件路径 -DskipTests clean dependency:list install
-B 参数的意思是以非交互的方式运行,-s指定setting.xml配置文件,路径由上文中描述的逻辑确定。
大多数用户本地测试时采用的命令是 mvn clean install 没有dependency:list参数。
如果是多模块的服务,BUILD_MAVEN_CUSTOM_GOALS 参数会在服务创建时自动更改类似下述的命令:
clean install -pl module_name -am
大多数标准项目都是可以正常构建的,如果用户多模块项目不符合,需要用户必须修改BUILD_MAVEN_CUSTOM_GOALS参数。
构建命令确定后编译程序将执行Maven构建,实时输出构建过程日志。
注意,请务必在使用Rainbond构建项目之前使用上诉的命令本地执行测试。
mvn完成编译打包后有两种介质,分别为war包和jar包。
生成的介质如何运行,即启动命令配置,是在代码主目录Procfile文件中定义,如果代码中做了定义,服务创建时会识别配置内容来初始化BUILD_PROCFILE变量。 Procfile 文件的规范请参考文档
BUILD_PROCFILE 未定义的情况下Rainbond编译脚本会做如下判断来生成默认的启动命令配置:
根据pom.xml文件是否包含<packaging>war</packaging>来判断当前项目是否为war项目,如果是则使用下述运行命令运行:
web: java $JAVA_OPTS -jar ./webapp-runner.jar --port $PORT target/*.war
根据pom.xml文件是否包含<groupId>org.springframework.boot 和<artifactId>spring-boot 且打包方式为jar包时识别为springboot项目,如果是默认运行命令是:
web: java -Dserver.port=$PORT $JAVA_OPTS -jar target/*.jar
根据pom.xml文件中是否包含<groupId>org.wildfly.swarm来识别是否为wildfly_swarm项目,如果是,默认运行命令为:
web: java -Dswarm.http.port=$PORT $JAVA_OPTS -jar target/*.jar
手动配置 BUILD_PROCFILE 直接设置启动命令是最准确和直接的方式。
几个场景下需要自行设置启动命令
从上诉自动生成的启动命令可以看出,Rainbond运行War时采用的是webapp-runner项目,如果需要设置Tomcat版本或其他参数时,需要根据webapp-runner的相关参数来对应设置启动命令。比如设置会话路径时:
web: java $JAVA_OPTS -jar ./webapp-runner.jar --path /test --port $PORT target/*.war
其他设置参数参考文档:tomcat参数设置
上诉流程完成后编译脚本将代码目录进行打包,打包命令如下:
tar -z --exclude='.git' -X "$build_root/.slugignore" -C $build_root -cf $slug_file .
默认的情况下会将整个源码、编译过程下载的JDK等执行程序、编译生成的介质文件一起打包。目的是不遗漏任何文件,特别是静态文件、配置文件等。如果用户不想将运行态无用的源代码打包,需要定义.slugignore 文件。
.slugignore 文件与常见的.gitignore文件语法类似。从上诉打包命令可以看出此文件是在tar命令打包时生效。
所有语言类型编译完成后都会生成tar包,我们提供了runner基础镜像来运行这些tar包。源码在 https://github.com/goodrain/runner , 其工作流程如下:
常见问题说明