【jenkins】自动修改工程版本号 以及 父pom版本号 (maven-release-plugin)
之前介绍过使用maven-versn-plugin,maven-scm-plugin以及maven-release-plugin来管理工程的版本号以及依赖的版本号。这些maven插件已经帮助我们最大程度上解决了多项目多模块的版本问题。但是仍然不够智能,我们仍然需要执行若干maven命令,这里介绍下使用jenkins实现完全自动化更新版本的方法。这里会有两个工程,一个是root-pom,一...
之前介绍过使用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-SNAPSHOT
root-pom的版本也修改了并且deploy。
更多推荐
所有评论(0)