之前介绍过使用versions-maven-plugin,maven-scm-plugin以及maven-release-plugin来管理工程的版本号以及依赖的版本号。这些maven插件已经帮助我们最大程度上解决了多项目多模块的版本问题。但是仍然不够智能,我们仍然需要执行若干maven命令,这里介绍下使用jenkins实现完全自动化更新版本的方法。
这里会有两个工程,一个是root-pom,一个是普通的工程。普通工程完成一版迭代,push代码,然后使用一个jenkins的job来发包,同时出发一个root-pom的job,自动修改其中的dependencyManagement,其他工程就能拉取到最新的版本。
普通工程:
<?xml version="1.0" encoding="UTF-8"?> <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> <parent> <groupId>com.liyao</groupId> <artifactId>testRoot</artifactId> <version>1.0-SNAPSHOT</version> </parent> <scm> <developerConnection>scm:git:https://github.com/miracle2138/testJenkins.git</developerConnection> <tag>HEAD</tag> </scm> <groupId>com.liyao</groupId> <artifactId>testJenkins</artifactId> <version>1.32-SNAPSHOT</version> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-release-plugin</artifactId> </plugin> </plugins> </build> </project>然后建一个jenkins的job:
1)执行shell脚本为:
echo "testJenkins 开始构建" #切换分支,否则后面使用release插件会报错 git checkout master #release prepare修改当前工程版本号 mvn -DignoreSnapshots=true release:clean release:prepare #取出当前release版本号 git tag | xargs -I {} git tag -d {} git pull origin master --rebase --tag releaseVersion=$(git tag | sed "s/[a-z|A-Z]*-//g" | sort -nr | head -1) echo "release版本 ${releaseVersion}" #发包 mvn release:perform #将release版本号传递给rootpom的job echo version=${releaseVersion} > releaseInfo.txt echo "testJenkins 构建结束"传递版本号是通过release插件提交git时打的tag实现的。
2)构建后的操作:
这里需要安装一个Parameterized Trigger plugin,然后将工程名和版本号传递给下一个工程。
因为工程名是固定的,所以使用predefinded parameters,该该方式只能传递值,而非变量,无法在构建中修改值。
如果要在构建中修改,可以使用properties file方式传递,在脚本中将变量值写入文件,通过文件传递。
另外,后面的工程想要使用这些传递的变量,必须定义参数化构建来接受参数。
root-pom工程:
<?xml version="1.0" encoding="UTF-8"?> <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>com.liyao</groupId> <artifactId>testRoot</artifactId> <!--版本固定为这个--> <version>1.0-SNAPSHOT</version> <packaging>pom</packaging> <scm> <developerConnection>scm:git:https://github.com/miracle2138/testRootPom.git</developerConnection> </scm> <properties> <testJenkins.version>1.32</testJenkins.version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> <dependency> <groupId>com.liyao</groupId> <artifactId>testJenkins</artifactId> <version>${testJenkins.version}</version> </dependency> </dependencies> </dependencyManagement> <build> <pluginManagement><!-- lock1r down p4lugins versions to avoid using Maven defaults (may be moved to parent pom) --> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-release-plugin</artifactId> <version>2.5.3</version> <configuration> <autoVersionSubmodules>true</autoVersionSubmodules> </configuration> </plugin> </plugins> </pluginManagement> </build> <distributionManagement> <repository> <id>release_user</id> <name>Release Deploy</name> <url>http://localhost:8081/repository/maven-releases/</url> </repository> <snapshotRepository> <id>snapshot_user</id> <name>Snapshot Deploy</name> <url>http://localhost:8081/repository/maven-snapshots/</url> </snapshotRepository> </distributionManagement> </project>jenkins的job:
1)执行脚本:
echo “开始更新root-pom” git checkout master git pull origin master --rebase name=${dependency_name} version=${version} echo "更新的依赖名称 ${name}" echo "更新版本 ${version}" property="${name}.version" mvn versions:set-property -Dproperty=${property} -DnewVersion=${version} mvn scm:checkin -Dmessage="update dependency ${dependency_name}: ${version}" mvn clean deploy echo “更新root-pom结束”2)参数:
项目配置就是这样。
执行:
假设现在版本号为1.32-SNAPSHOT,做了开发,push了代码,点击”立即构建“来发包。
[INFO] --- maven-release-plugin:2.5.3:prepare (default-cli) @ testJenkins --- + releaseVersion=1.33 + echo 'release版本 1.33' release版本 1.33 + mvn release:perform [INFO] Scanning for projects... [INFO] [INFO] -----------------------< com.liyao:testJenkins >------------------------ [INFO] Building testJenkins 1.34-SNAPSHOT [INFO] --------------------------------[ jar ]--------------------------------- + echo 'testJenkins 构建结束' testJenkins 构建结束 [parameterized-trigger] Current build has no parameters. 触发新的构建 root-pom Finished: SUCCESS可以看到当前工程发包正常,且修改了工程版本,并触发了root-pom的job。
git log一下:
commit 703d15c8dcd7f7eb848a6d34f60ac4792bed8ae1 (HEAD -> master, origin/master) Author: miracle2138 <454684579@qq.com> Date: Sun May 26 23:37:27 2019 +0800
[maven-release-plugin] prepare for next development iteration
commit 45aa0eafb21fd1e1109f45f0e0da994102390c8d Author: miracle2138 <454684579@qq.com> Date: Sun May 26 23:37:17 2019 +0800
[maven-release-plugin] prepare release testJenkins-1.33 版本已经修改。
再看下触发的root-pom的执行:
+ name=testJenkins + version=1.33 + echo '更新的依赖名称 testJenkins' 更新的依赖名称 testJenkins + echo '更新版本 1.33' 更新版本 1.33 + property=testJenkins.version + mvn versions:set-property -Dproperty=testJenkins.version -DnewVersion=1.33 [INFO] Scanning for projects... + mvn scm:checkin '-Dmessage=update dependency testJenkins: 1.33' [INFO] Scanning for projects... + mvn clean deploy [INFO] Scanning for projects... [INFO] [INFO] -------------------------< com.liyao:testRoot >------------------------- [INFO] Building testRoot 1.0-SNAPSHOTroot-pom的版本也修改了并且deploy。