我想在我的pom.xml
文件中附加Jenkins内部版本号。我可以通过Maven Version plugin执行此操作,但首先我需要pom.xml
文件中的原始版本。
为了做到这一点,我使用命令xmllint --xpath '/project/version/text()' pom.xml
命令。但是,我一直在XPath set is empty
以下是示例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>
<artifactId>das-artifact</artifactId>
<name>das-name</name>
<version>4.2</version>
</project>
这是我的输出:
$ xmllint --nsclean --xpath '/project/version/text()' pom.xml
XPath set is empty
$
但是,如果我将xmlns
元素更改为fooxmlns
,则可以:
以下是示例pom.xml
文件:
<project fooxmlns="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>
<artifactId>das-artifact</artifactId>
<name>das-name</name>
<version>4.2</version>
</project>
这是我的输出:
$ xmllint --nsclean --xpath '/project/version/text()' pom.xml
4.2$
我不太熟悉xmllint
可以做的所有事情。我可以让它忽略xmlns
命名空间属性吗?
答案 0 :(得分:3)
一般有两种解决方案你要走@A_Di-Matteo所建议的路径(但我建议至少使用Maven 3.3.9或3.4.0如果发布)或者你可以通过{{3如下所示:
mvn build-helper:parse-version versions:set \
-DnewVersion=\${parsedVersion.majorVersion}.\${parsedVersion.minorVersion}.\${parsedVersion.incrementalVersion}-WhatEverYouLikeToAdd \
versions:commit
答案 1 :(得分:1)
回答实际问题:
基于@djeikyb在xml - xmllint failing to properly query with xpath - Stack Overflow的务实评论,这对我有用:
sed < pom.xml '2 s/xmlns=".*"//g' | xmllint --xpath '/project/version/text()' - 2>/dev/null
我仍然感到困惑的是,为什么xml使用我认为专为此任务设计的工具进行解析,如果没有这种kludge就无法正常工作......
答案 2 :(得分:1)
对每个xml节点使用local-name()
函数。
Old-XPath: /project/version/text()
New-XPath: /*[local-name()="project"]/*[local-name()="version"]/text()
现在在bash shell中运行,你将获得
$ xmllint --xpath '/*[local-name()="project"]/*[local-name()="version"]/text()' pom.xml
1.0.0-SNAPSHOT
答案 3 :(得分:0)
这就是我的所作所为:
<?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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.das-group</groupId>
<artifactId>das-artifact</artifactId>
<version>1.1.0-123</version>
<profiles>
<profile>
<id>arse-version</id>
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
<version>1.12</version>
<executions>
<execution>
<id>parse-version</id>
<goals>
<goal>parse-version</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>versions-maven-plugin</artifactId>
<version>2.3</version>
<executions>
<execution>
<phase>validate</phase>
<id>set-version</id>
<goals>
<goal>set</goal>
<goal>commit</goal>
</goals>
</execution>
</executions>
<configuration>
<newVersion>${parsedVersion.osgiVersion}-${BUILD_NUMBER}</newVersion>
</configuration>
</plugin>
</plugins>
</build>
</profile>
</profiles>
</project>
我创建了一个配置文件arse-version
(这实际上在我的公司pom.xml中,它是我们所有项目的父项),它添加了build-helper-maven-plugin
和versions-maven-plugin
插件。我将它们都设置为在validate
生命周期中执行。
现在,要设置在Jenkins中附加了内置编号的版本,我可以执行此操作:
$ mvn -Parse-version -DBUILD_NUMBER=$BUILD_NUMBER validate
这与管道构建和Jenkinsfile
非常吻合。不需要单独的shell或Python脚本。无需担心xpath
或xmllint
是否已安装并以特定方式工作(在Mac与Linux上的工作方式不同)。
我的主要问题是版本号会一直重建而不是拿那些东西。如果开发人员将版本设置为1.0
并且这是版本#23,那么我将获得版本1.0.0-23
。如果开发人员放置1.2-3 , I get
1.2.3-23`。所以,我只是告诉所有开发人员他们现在必须使用标准的三部分版本编号方案。
干净简洁。感谢khmarbaise的回答。
注意:已编辑以添加commit
目标。这将从工作区中删除 backup pom.xml。