在我们的构建和部署基础架构中,我们有一个构建我们的多模块Maven项目的Jenkins作业,并且最近一直在向Nexus部署生成的工件(包括一个综合tarball)。然后另一个作业(有时由成功的构建作业触发)运行部署,它根据构建作业运行的POM从Nexus中提取所需的工件(构建作业存档POM,以便可以使用依赖:复制目标)。对于发行版,这可以正常工作,如果需要回滚方案,我们甚至可以部署早期版本。但是,这会破坏SNAPSHOT构建,因为POM不包含除工件-SNAPSHOT
之外的任何版本标识符。
构建输出确实包含在构建完成后可以使用grepped的信息,以便我们可以将其用作版本。那些熟悉Maven的人会识别以下Maven输出片段:
[INFO] Uploading: http://nexus.eng.company.com/nexus/content/repositories/snapshots/com/company/application/application-dist/4.19.3-SNAPSHOT/application-dist-4.19.3-20160819.223606-7-eng.tar.gz
[INFO] Uploaded: http://nexus.eng.company.com/nexus/content/repositories/snapshots/com/company/application/application-dist/4.19.3-SNAPSHOT/application-dist-4.19.3-20160819.223606-7-eng.tar.gz (109687 KB at 413.1 KB/sec)
但是有更好的方法吗?我们特别想要允许的情况是开发人员部署早期版本(通常用于部署功能分支版本),但除非我找到一种方法来获取带有日期戳的版本标识符,否则目前是不可能的。
答案 0 :(得分:2)
可能的解决方案是创建动态属性以使用classifier
。在这种情况下,build-helper-maven-plugin
可以提供帮助,例如以下内容:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
<version>1.10</version>
<executions>
<execution>
<id>regex-property</id>
<goals>
<goal>timestamp-property</goal>
</goals>
<configuration>
<name>custom.classifier</name>
<pattern>yyyy-MM-dd_HH-mm-ss.SSS</pattern>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<version>3.0.2</version>
<configuration>
<classifier>${custom.classifier}</classifier>
</configuration>
</plugin>
上面我们正在创建一个新属性custom.classifier
,并用pattern
元素定义的时间戳填充它(精心设计,以便不会有空格或无效字符,因为分类器将成为最终文件名的一部分。)
然后maven-jar-plugin
案例相应地设置了分类器。
然后,您可以进一步将上述行为包装在Maven profile中,以便仅为CI作业激活它。