有时候,开发人员不小心检入了POM中没有"SNAPSHOT"的版本。这将构建Maven项目并将构件发布到发布存储库。我怎样才能避免这种情况呢?我只想发布构建构件到发布库,而不是一个CI构建。
我考虑了以下问题——但没有一个是简单的一步解决方案
- 写一个预提交钩子来检查版本是否在没有快照的情况下被除管理员之外的任何人签入;
- 修改Jenkins作业,查看构建是否是CI构建;然后grep查询版本,如果版本不是SNAPSHOT版本,则报错。为此,我需要修改100个作业。
一个很好的解决方案是利用Maven Enforcer Plugin。
更新到1.4.2
从1.4.2版本开始(尚未发布,请参阅增强请求MENFORCER-204),有一个新的requireSnapshotVersion
规则,强制正在构建的项目具有快照版本。
<plugin>
<artifactId>maven-enforcer-plugin</artifactId>
<version>1.4.2</version>
<executions>
<execution>
<id>enforce-snapshot</id>
<goals>
<goal>enforce</goal>
</goals>
<configuration>
<rules>
<requireSnapshotVersion/>
</rules>
<fail>${fail.if.release}</fail>
</configuration>
</execution>
</executions>
</plugin>
编写自定义规则
到1.4.1版本,如果当前项目是SNAPSHOT版本,没有内置的失败规则,但我们仍然可以使用evaluateBeanshell
规则。
这个想法是使构建失败的版本不是默认的快照版本。当当前项目处于发布中时,禁用该规则。
为此,您可以在POM中添加以下内容:
<plugin>
<artifactId>maven-enforcer-plugin</artifactId>
<version>1.4.1</version>
<executions>
<execution>
<id>enforce-beanshell</id>
<goals>
<goal>enforce</goal>
</goals>
<configuration>
<rules>
<evaluateBeanshell>
<condition>"${project.version}".endsWith("-SNAPSHOT")</condition>
</evaluateBeanshell>
</rules>
<fail>${fail.if.release}</fail>
</configuration>
</execution>
</executions>
</plugin>
它的作用是执行一个评估项目版本的BeanShell脚本。如果它以-SNAPSHOT
结束,则规则通过,否则,规则失败并且构建结束。判断版本是否为快照。(快照版本的严格规则更复杂,但这应该涵盖所有用例)。因此,这样的规则将验证正在构建的项目具有SNAPSHOT版本。
上述两个配置都将Maven属性声明为
<property>
<fail.if.release>true</fail.if.release>
</property>
当mvn deploy
在SNAPSHOT版本上运行时,它们将使您的构建失败,确保没有SNAPSHOT被意外地部署到发布存储库。
然后,在执行释放时需要禁用该规则。为此,我们可以定义一个release
配置文件来禁用已定义的规则:
<profile>
<id>release</id>
<properties>
<fail.if.release>false</fail.if.release>
</properties>
</profile>
并在发布时使用
激活该配置文件mvn release:prepare release:perform -Darguments="-Prelease"