在整个预测云计算(PCC)项目中使用了多种构建工具和技术,使开发团队能够自动构建和验证更改。 所选择的工具和技术使团队能够自动化构建过程并高度自信地部署更改,使其能够正常运行并受到支持。 在本文中,我们讨论了PCC中使用的构建和测试方法。 图1说明了PCC构建和测试体系结构。
图1.构建和测试架构

Maven构建自动化
构建自动化是一种实践,它消除了构建过程中耗时且容易出错的手动步骤,并用自动且一致的过程代替了这些步骤,这些过程可从源代码中创建工件。 构建自动化工具通过卸载和自动化构建过程来促进小变化的测试和传播。 PCC使用Maven作为其构建自动化工具。 使用Maven,开发人员可以签入源代码管理中的更改,在这些更改中自动测试代码并将其内置到可以部署的工件中。
Maven通过使用定义构建过程的XML文件来执行构建和测试。 Maven是一个高度结构化的构建系统,可在项目之间实施统一性。 这使开发人员可以在不同项目之间移动,并具有与其构建系统一致的界面。
“ PCC系统中使用的工具和技术使团队能够自动化构建过程并部署更改,并充满信心地认为代码将是可运行且可支持的。 ”
Maven是基于生命周期的。 构建生命周期包括以下高级步骤。 如果这些步骤中的任何一个失败,则将不执行下一步,并且将生成错误日志。
- 验证 。 验证执行构建生命周期的所有信息均可用并且在语法上正确。
- 生成源。 生成项目所需的任何源代码。 在PCC项目中,该步骤用于使用OpenJPA提供程序自动生成与数据存储访问相关的某些代码段。
- 流程源。 在编译之前,检查源代码并对其执行转换步骤。
- 生成资源和过程资源 。 类似于其相应的源步骤,但是对资源(例如XML文件)而不是代码起作用。
- 编译 。 将源代码编译成可执行代码。
- 流程测试源和流程测试资源 。 预处理测试配置以设置测试框架和上下文。
- 测试编译 。 将测试编译为可执行代码。
- 测试 。 执行测试。
- 包装 获取编译后的代码并将其放入可分发格式,例如Java存档(JAR)。
- 安装 。 将打包的代码安装到本地存储库中。 安装后,该JAR适合用作其他相关项目的依赖项。
- 部署 。 将工件推送到生产和开发环境以提供PCC操作。
表1列出了Maven构建过程中的所有项目及其支持PCC的功能。
表1. Maven构建过程中涉及的项目
项目 | 功能 |
---|---|
大引擎 | 对大数据执行多线程作业运行,为RESTful服务建立端点,并为WebSphere Liberty Profile进行配置。 |
设定档 | 解析应用程序,网球,高尔夫和整体比赛配置。 |
因素 | 高尔夫和网球模拟中的特征提取算法。 |
坚持不懈 | 处理数据库功能。 |
球拍流 | 提取InfoSphere Streams中的情感分析。 |
播放器 | 包含有关玩家的信息。 |
共享 | 包含PCC项目之间共享的元素。 |
共享集成 | 为共享项目提供集成测试。 |
Twitter分析 | 对鸣叫量进行分析。 |
推特出口商 | 将Twitter feed导出到其他InfoSphere Steams流程。 |
推特 | 从Twitter API读取。 |
WebLogAnalyzer | 分析Web日志内容以从内容中提取玩家提及。 |
视觉效果 | 支持从前端视觉到后端BigEngine系统的请求代理的系统。 |
图2中的BigEngine项目是PCC的主要工作。 这项工作建立了PCC用来预测站点流量的分析和决策引擎。 BigEngine-Integration作业对BigEngine执行耗时的集成测试,并与BigEngine作业隔离开来,以加快小更改的交付时间。 TwitterAnalysis,TwitterExporter和StreamsLogAggregator作业用于创建工件以在InfoSphere Streams中进行部署。 其他项目,例如WebLogAnalyzer,提供了支持PCC的大数据功能。 这些都是基于Maven的项目。
图2. PCC基于Jenkins Maven的构建作业
清单1包含BigEngine项目的Maven配置指令。 指令包含在称为项目对象模型(POM)文件的文档中。 该文件包含在PCC中的BigEngine项目上编译,测试和执行静态分析的所有必要指令。 POM文件包含离散的部分,包括版本,模型版本,包装,属性和内部版本。 version
指令定义了由Maven构建的项目的当前版本。 packaging
部分告诉Maven在编译和测试后如何packaging
生成的工件。 modelVersion
通知Maven正在使用Maven模型的哪个版本。 在大多数情况下,该值为4.0.0。 artifactID
是没有文件扩展名的打包产品的名称。 POM文件是一个非常大的连续文件。 出于说明目的,将其分为以下几个单独的部分。
清单1. BigEngine Maven配置
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<artifactId>BigEngine</artifactId>
<version>2.0.0</version>
<packaging>war</packaging>
properties
部分定义了Maven在构建过程中要使用的几个属性。 对于此特定项目,我们设置输出目录和构建时间指令,默认情况下,我们跳过此构建的集成测试。 源和输出编码也由Maven设置和使用。
清单2. BigEngine Maven属性配置
<properties>
<output.directory>${project.basedir}\WebContent\WEB-INF\classes</output.directory>
<buildtime>${maven.build.timestamp}</buildtime>
<skip.integration.tests>true</skip.integration.tests>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
</properties>
build
部分包含本文档中的大多数指令,并控制Maven如何构建该项目。 本节有几个小节:资源,测试资源,插件,插件管理,父项和依赖项。 除了小节外, build
配置还包含用于指导构建过程的指令。 finalName
指令为Maven提供一个名称,以用于生成的构建工件。 这通常与更高级别项目配置中的工件ID相同。 该directory
是Maven放置构建工件的位置。 outputDirectory
是Maven放置编译结果的位置。 testOutputDirectory
是已编译测试源文件的目标。 此目录是单独的,因此测试文件不会与最终工件打包在一起。
清单3. BigEngine Maven构建配置
<build>
<finalName>BigEngine</finalName>
<directory>target</directory>
<outputDirectory>${output.directory}</outputDirectory>
<testOutputDirectory>${output.directory}</testOutputDirectory>
<sourceDirectory>src/main/java</sourceDirectory>
resource
部分定义了应包含在结果包中的非代码资源的位置。 test-resources
部分指示Maven在哪里定位在测试阶段应该可用但未与构建工件打包在一起的资源。
清单4. BigEngine Maven资源和测试资源配置
<resources>
<resource>
<directory>src/main/resources</directory>
</resource>
</resources>
<testResources>
<testResource>
<directory>src/test/resources</directory>
</testResource>
</testResources>
plugins
指令包含在构建过程中使用的Maven插件列表。 每个插件的配置各不相同。 通常,必须始终定义插件的版本。 每个插件可能都有一些可以提供的特定配置指令。 有时,我们定义了在插件的执行阶段。
清单5. BigEngine Maven插件配置
<plugins>
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>2.4.1</version>
<executions>
<execution>
<id>auto-clean</id>
<phase>initialize</phase>
<goals>
<goal>clean</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.6</version>