J2EE项目完整开发、测试、部署、发布环境(updating)

J2EE项目目前成熟的框架、工具很多,但个人对整个项目完整的开发、测试、部署、发布及代码管理缺乏系统整理。
本文旨在对整个项目管理全生命周期详述,以期改进、总结项目流程

主要围绕下述几个维度和工具展开:

  • 项目配置工具: Maven, Git, Log4j
  • 代码测试: TestNG, Selenium
  • 代码管理: GitLab
  • 代码审核: Gerrit
  • 持续集成及发布: Jenkins

一、项目配置工具:Maven, Git, Log4j

1.1 项目管理与构建:Maven

maven是一个项目构建和管理的工具,提供了帮助管理 构建、文档、报告、依赖、scms、发布、分发的方法。可以方便的编译代码、进行依赖管理、管理二进制库等等。

Build Lifecycle: 是指一个项目build的过程。maven的Build Lifecycle分为三种,分别为default(处理项目的部署)、clean(处理项目的清理)、site(处理项目的文档生成)。他们都包含不同的lifecycle。
Pom: project object Model, 是一个xml,在maven2里为pom.xml。pom文件中包含了项目的信息和maven build项目所需的配置信息,通常有项目信息(如版本、成员)、项目的依赖、插件和goal、build选项等等。

pom是可以继承的,通常对于一个大型的项目或是多个module的情况,子模块的pom需要指定父模块的pom
project pom文件的顶级元素
modelVersion 所使用的object model版本,为了确保稳定的使用,这个元素是强制性的。除非maven开发者升级模板,否则不需要修改
groupId 是项目创建团体或组织的唯一标志符,通常是域名倒写,如groupId org.apache.maven.plugins就是为所有maven插件预留的
artifactId 是项目artifact唯一的基地址名
packaging artifact打包的方式,如jar、war、ear等等。默认为jar。这个不仅表示项目最终产生何种后缀的文件,也表示build过程使用什么样的lifecycle。
version artifact的版本,通常能看见为类似0.0.1-SNAPSHOT,其中SNAPSHOT表示项目开发中,为开发版本
name 表示项目的展现名,在maven生成的文档中使用
url表示项目的地址,在maven生成的文档中使用
description 表示项目的描述,在maven生成的文档中使用
dependencies 表示依赖,在子节点dependencies中添加具体依赖的groupId artifactId和version
build 表示build配置
parent 表示父pom

其中groupId:artifactId:version唯一确定了一个artifact
Artifact: 项目产生的文件(jar, 源码, 二进制文件, war, pom)等,每个artifact由groupId:artifactId:version组成的标识符唯一识别。
Repositories: 仓库,用来存储各种不同的Artifact。

Maven Build Lifecycle | Maven构建的生命周期

1
2
3
4
5
6
7
8
validate: 验证项目是否正确以及必须的信息是否可用
compile: 编译源代码
test: 测试编译后的代码,即执行单元测试代码
package: 打包编译后的代码,在target目录下生成package文件
integration-test: 处理package以便需要时可以部署到集成测试环境
verify: 检验package是否有效并且达到质量标准
install: 安装package到本地仓库,方便本地其它项目使用
deploy: 部署,拷贝最终的package到远程仓库和替他开发这或项目共享,在集成或发布环境完成

Maven常用命令和参数

常用命令

1
2
3
4
5
mvn test-compile: 编译测试代码
mvn test: 运行程序中的单元测试
mvn compile: 编译项目
mvn package: 打包,此时target目录下会出现maven-quickstart-1.0-SNAPSHOT.jar文件,即为打包后文件
mvn install: 打包并安装到本地仓库,此时本机仓库会新增maven-quickstart-1.0-SNAPSHOT.jar文件。

每个phase都可以作为goal,也可以联合,如mvn clean install将先执行mvn clean清理项目,再执行mvn install安装package到本地库。

常用参数

mvn -e 显示详细错误
mvn -U 强制更新snapshot类型的插件或依赖库(否则maven一天只会更新一次snapshot依赖)
mvn -o 运行offline模式,不联网更新依赖
mvn -N仅在当前项目模块执行命令,关闭reactor
mvn -pl module_name在指定模块上执行命令
mvn -ff 在递归执行命令过程中,一旦发生错误就直接退出
mvn -Dxxx=yyy指定java全局属性
mvn -Pxxx引用profile xxx

常用指令

1
2
3
4
5
6
7
mvn archetype:generate 创建maven项目
mvn package 打包,上面已经介绍过了
mvn package -Prelease打包,并生成部署用的包,比如deploy/*.tgz
mvn install 打包并安装到本地库
mvn eclipse:eclipse 生成eclipse项目文件
mvn eclipse:clean 清除eclipse项目文件
mvn site 生成项目相关信息的网站

Maven实例

  • Maven创建quick start项目
    1
    mvn archetype:generate -DgroupId=com.trinea.maven.test -DartifactId=maven-quickstart -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

其中DgroupId指定groupId,DartifactId指定artifactId,DarchetypeArtifactId指定ArchetypeId,
DinteractiveMode表示是否使用交互模式,交互模式会让用户填写版本信息之类的,非交互模式采用默认值

  • Maven创建web项目
    1
    mvn archetype:generate -DgroupId=com.trinea.maven.web.test -DartifactId=maven-web -DarchetypeArtifactId=maven-archetype-webapp -DinteractiveMode=false

本小节参考文章:

  1. Maven介绍,包括作用、核心概念、用法、常用命令、扩展及配置
  2. Maven工程配置实例

1.2 版本控制: Git

Git 定义
Git主要用法
git rebase强调说明
git 生命周期

1.3 运行日志: Log4j

二、代码测试:TestNG, Selenium

2.1 单元测试:TestNG

关于JUnit和TestNG的对比,可参考追求代码质量: JUnit 4 与 TestNG 的对比

2.2 功能测试: Selenium

自动化功能测试,Selenium模拟浏览器操作,进行页面元素的判断。不仅局限于测试,可以开发很多工具。

三、代码管理:GitLab

GitLab提供媲美GitHub的功能,适合团队内部构建自己的代码管理系统,官网:GitLab Download
由于国内网络环境的特殊原因,推荐方式基本无法顺利进行。
同时官网也特别提到If you are located in China, try using the GitLab CE mirror hosted by TUNA
建议国内用户采用清华TUNA方式安装GitLab
采用清华TUNA源的GitLab安装步骤如下:

3.1信任GitLab的GPG公钥

1
curl https://packages.gitlab.com/gpg.key 2> /dev/null | sudo apt-key add - &>/dev/null

3.2 下载并安装GitLab安装包

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
* 添加deb https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/ubuntu trusty main到文件gitlab-ce.list中。
sudo touch /etc/apt/sources.list.d/gitlab-ce.list
* apt-get update更新源
sudo apt-get update
* 安装gitlab-ce
sudo apt-get install gitlab-ce
five@node10:/etc/apt/sources.list.d$ sudo apt-get install gitlab-ce
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following NEW packages will be installed:
gitlab-ce
0 upgraded, 1 newly installed, 0 to remove and 125 not upgraded.
Need to get 267 MB of archives.
After this operation, 786 MB of additional disk space will be used.
Get:1 https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/ubuntu/ trusty/main gitlab-ce amd64 8.5.8-ce.0 [267 MB]
75% [1 gitlab-ce 200 MB] 301 kB/s 3min 40s

Fetched 267 MB in 16min 25s (271 kB/s)
Selecting previously unselected package gitlab-ce.
(Reading database ... 64819 files and directories currently installed.)
Preparing to unpack .../gitlab-ce_8.5.8-ce.0_amd64.deb ...
Unpacking gitlab-ce (8.5.8-ce.0) ...
Setting up gitlab-ce (8.5.8-ce.0) ...
gitlab: Thank you for installing GitLab!
gitlab: To configure and start GitLab, RUN THE FOLLOWING COMMAND:

sudo gitlab-ctl reconfigure

gitlab: GitLab should be reachable at http://node10
gitlab: Otherwise configure GitLab for your system by editing /etc/gitlab/gitlab.rb file
gitlab: And running reconfigure again.
gitlab:
gitlab: For a comprehensive list of configuration options please see the Omnibus GitLab readme
gitlab: https://gitlab.com/gitlab-org/omnibus-gitlab/blob/master/README.md
gitlab:
It looks like GitLab has not been configured yet; skipping the upgrade script.

3.3 配置GitLab

1
2
3
4
5
6
7
* 修改GitLab使用端口为8081,避免冲突
sudo vi /etc/gitlab/gitlab.rb
external_url 'http://localhost:8081'
* 配置邮箱等其他配置

* 重新配置gitlab使变更生效(任何配置更改后续执行reconfigure使配置生效)
sudo gitlab-ctl reconfigure

3.4 浏览器访问页面

安装后本地访问地址:http://localhost:8081

1
2
Username: root
Password: 5iveL!fe

后记

初始化的默认配置比较简单,但若要自定义化满足组织实际需求,需要按照官网文档仔细配置。
这将在下一篇文章《GitLab自定义配置指南》中详述。

四、代码审核:Gerrit

五、持续集成、发布: Jenkins

参考文献

  1. CI 系统搭建:一. 基础环境设置、规划
  2. CI 系统搭建:二. GitLab 的安装配置
  3. Ubuntu之Gitlab、Gerrit、Jenkins协调工作配置
  4. Java EE7和Maven工程入门