自动化构建
举个例子:
项目A:app-web-ui
项目B:app-desktop-ui
俩个项目都依赖于新项目C:bus-core-api
app-web-ui使用的是 bus-core-api 项目的 1.0 快照:
<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> <groupId>app-web-ui</groupId> <artifactId>app-web-ui</artifactId> <version>1.0</version> <packaging>jar</packaging> <dependencies> <dependency> <groupId>bus-core-api</groupId> <artifactId>bus-core-api</artifactId> <version>1.0-SNAPSHOT</version> </dependency> </dependencies> </project>
app-desktop-ui 项目使用的是 bus-core-api 项目的 1.0 快照:
<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> <groupId>app-desktop-ui</groupId> <artifactId>app-desktop-ui</artifactId> <version>1.0</version> <packaging>jar</packaging> <dependencies> <dependency> <groupId>bus-core-api</groupId> <artifactId>bus-core-api</artifactId> <version>1.0-SNAPSHOT</version> </dependency> </dependencies> </project>
bus-core-api 项目:
<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> <groupId>bus-core-api</groupId> <artifactId>bus-core-api</artifactId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging> </project>
app-web-ui和app-desktop-ui项目需要不管bus-core-api怎么变化,什么时候变化,他们的构建过程都应可以启动。使用快照可以确保最新的bus-core-api项目被使用。
故需要进行以下操作:
1.在bus-core-api项目的pom文件中添加一个post_build目标操作来启动app-web-ui和app-desktop-ui项目的构建 2.使用持续集成,Jenkins来管理构建自动化
打开命令行,进入到bus-core-api目录下;执行命令:
PS D:\yiq\Maven\bus-core-api>>mvn clean package -U
执行完成后,开始构建项目:bus-core-api
[INFO] Scanning for projects... [INFO] ------------------------------------------------------------------ [INFO] Building bus-core-api [INFO] task-segment: [clean, package] [INFO] ------------------------------------------------------------------ ... [INFO] [jar:jar {execution: default-jar}] [INFO] Building jar: D:\yiq\Maven\bus-core-api\target\ bus-core-ui-1.0-SNAPSHOT.jar [INFO] ------------------------------------------------------------------ [INFO] BUILD SUCCESSFUL [INFO] ------------------------------------------------------------------
bus-core-api构建完成后,Maven将开始构建app-web-ui 项目
[INFO] ------------------------------------------------------------------ [INFO] Building app-web-ui [INFO] task-segment: [package] [INFO] ------------------------------------------------------------------ ... [INFO] [jar:jar {execution: default-jar}] [INFO] Building jar: D:\yiq\Maven\app-web-ui\target\ app-web-ui-1.0-SNAPSHOT.jar [INFO] ------------------------------------------------------------------ [INFO] BUILD SUCCESSFUL [INFO] ------------------------------------------------------------------
app-web-ui 构建完成后,Maven 将开始构建 app-desktop-ui 项目
[INFO] ------------------------------------------------------------------ [INFO] Building app-desktop-ui [INFO] task-segment: [package] [INFO] ------------------------------------------------------------------ ... [INFO] [jar:jar {execution: default-jar}] [INFO] Building jar: D:\yiq\Maven\app-desktop-ui\target\ app-desktop-ui-1.0-SNAPSHOT.jar [INFO] ------------------------------------------------------------------- [INFO] BUILD SUCCESSFUL [INFO] -------------------------------------------------------------------
使用持续集成(CI)-Jenkins
每次一个新项目,比如上面的app-web-ui,添加依赖项目bus-core-api时,开发者就不需要更新bus-core-api项目中的pom,Jenkins会借助maven的依赖管理功能实现自动化构建
当代码提交到Git/Svn后,Jenkins就会自动构建项目任务,一旦构建完成,就会自动查找依赖的项目,然后构建。
自动化部署:
部署的过程分为以下几部分:
1. 将项目代码提交到Svn/Git代码库并打上标签 2. 从Svn/Git上下载完整的源代码 3. 构建应用 4. 存储构建输出WAR或EAR文件到一个常用的网络上 5. 从网络上获取文件并且部署文件到生产站点上 6. 更新文档并且更新应用的版本号
问题:可能有多个团队多个人在操作,导致网络机器上的版本不是最新的,导致部署的版本不是最新的
那么, 此时就需要自动化部署。
1. 使用maven构建和发布项目 2. 使用subversion源码仓库管理源代码 3. 使用远程仓库管理软件来管理项目二进文件
最后,修改pom.xml文件
<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> <groupId>bus-core-api</groupId> <artifactId>bus-core-api</artifactId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging> <scm> <url>http://www.svn.com</url> <connection>scm:svn:http://localhost:8080/svn/jrepo/trunk/ Framework</connection> <developerConnection>scm:svn:${username}/${password}@localhost:8080: common_core_api:1101:code</developerConnection> </scm> <distributionManagement> <repository> <id>Core-API-Java-Release</id> <name>Release repository</name> <url>http://localhost:8081/nexus/content/repositories/ Core-Api-Release</url> </repository> </distributionManagement> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-release-plugin</artifactId> <version>2.0-beta-9</version> <configuration> <useReleaseProfile>false</useReleaseProfile> <goals>deploy</goals> <scmCommentPrefix>[bus-core-api-release-checkin]-</scmCommentPrefix> </configuration> </plugin> </plugins> </build> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> </properties> </project>
说明:
SCM:配置SVN的路径,maven将从该路径下将代码取下来
repository:构建的 WAR 或 EAR 或JAR 文件的位置,或者其他源码构建成功后生成的构件的存储位置。
Plugin:配置maven-release-plugin插件来实现自动化部署过程
Maven Release插件:
maven使用 maven-release-plugin插件完成以下任务:
清理工作空间,保证最新的发布进程成功运行 mvn release:clean
在上次发布过程不成功的情况下,回滚 mvn release:rollback
执行很多操作:检查本地是否有未提交的,确保没有快照的依赖,更新POM文件,运行测试用例,提交修改后的POM,为代码在svn中标记,增加版本号…… mvn release:prepare
构建成功后,检查在仓库上传的jar文件是否生效 mvn release:perform