Maven多模块部署Nexus失败后Commit Hash及制品状态问询
先逐个解答你的三个问题,再补充如何获取已上传快照对应的Git commit hash:
1. 前两个组件A和B是否已上传至Nexus?
大概率是已经上传成功了。Maven的多模块部署是按模块顺序依次执行的,每个模块的deploy目标是独立完成的——只要componentA和componentB的deploy阶段在网络问题发生前已经执行完毕,它们的制品就已经被推送到Nexus了。你可以直接登录Nexus仓库,在对应的快照仓库路径下(比如groupId/com/projectAlfa/componentA/[版本号])查看是否有对应的jar/pom等文件来确认。
2. 若查询projectAlfa的commit hash,会得到什么结果?
这里要区分两个场景:
- 如果你是在本地Jenkins构建机器上查询这个项目的Git commit hash:只要构建过程中没有修改代码仓库,得到的就是触发本次构建的那个commit hash(也就是整个projectAlfa所有模块共同基于的commit)。
- 如果你是想从Nexus上的制品反向查commit hash:默认情况下Maven不会自动把commit hash嵌入到快照制品里,所以直接查不到,需要你提前在构建配置里做额外处理(后面会说)。
3. projectAlfa的各组件是否会处于不同状态/拥有不同commit hash?
不会。因为本次构建是基于同一个Git commit触发的,componentA、B、C在构建时的代码都是同一个commit的内容。只是部署阶段中途失败,导致C没上传,A、B上传成功了——它们的代码基底是同一个commit,只是部署状态不同(A、B已在Nexus,C不在)。
如何获取Nexus上已上传快照制品对应的Git commit hash?
要实现这个,你需要在构建阶段提前把commit hash注入到Maven项目的构建信息里,常见的两种方式:
使用
git-commit-id-plugin插件:
在父pom.xml里添加这个插件配置,它会自动获取当前Git commit hash,并把它写入到项目的pom.properties或者生成一个单独的git.properties文件,打包到制品中:<build> <plugins> <plugin> <groupId>pl.project13.maven</groupId> <artifactId>git-commit-id-plugin</artifactId> <version>4.9.10</version> <executions> <execution> <id>get-the-git-infos</id> <goals> <goal>revision</goal> </goals> </execution> </executions> <configuration> <generateGitPropertiesFile>true</generateGitPropertiesFile> <generateGitPropertiesFilename>${project.build.outputDirectory}/git.properties</generateGitPropertiesFilename> </configuration> </plugin> </plugins> </build>部署完成后,你可以从Nexus下载componentA的jar包,解压后找到
git.properties文件,里面的git.commit.id字段就是对应的commit hash。自定义Maven属性注入:
在Jenkins构建时,先通过git rev-parse HEAD命令获取当前commit hash,然后作为Maven参数传入:mvn deploy -Dgit.commit.hash=$(git rev-parse HEAD)然后在pom.xml里把这个属性写入到
pom.properties中:<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>3.3.0</version> <configuration> <archive> <manifestEntries> <Git-Commit-Hash>${git.commit.hash}</Git-Commit-Hash> </manifestEntries> </archive> </configuration> </plugin> </plugins> </build>之后解压jar包,查看
META-INF/maven/[groupId]/[artifactId]/pom.properties,就能看到这个自定义属性了。
内容的提问来源于stack exchange,提问作者m19v

