如何阻止Jenkins中的CI构建意外发布到发布存储库?

时间:2016-09-19 20:45:19

标签: maven jenkins maven-3 jenkins-plugins

有时,开发人员意外地在POM中签入一个没有“SNAPSHOT”的版本。这将构建Maven项目并发布工件以释放存储库。我该如何避免这种情况?我只想发布构建工件来发布存储库而不是CI构建。

我想到了以下内容 - 但它们都不是一个简单的一步解决方案

  • 编写预提交挂钩以检查版本是否在没有SNAPSHOT的情况下被允许执行发布版本的管理员以外的任何人签入;
  • 修改Jenkins作业以查看构建是否为CI构建;如果版本不是SNAPSHOT版本,那么grep版本和错误输出。为此,我需要修改100个工作。

1 个答案:

答案 0 :(得分:4)

解决此问题的一个好方法是利用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结束,则规则通过,否则规则将失败并且构建结束。确定版本是否为快照。 (快照版本的严格规则是more complicated,但这应涵盖所有用例)。因此,这样的规则将验证正在构建的项目是否具有SNAPSHOT版本。

上述两种配置都将Maven属性声明为

<property>
  <fail.if.release>true</fail.if.release>
</property>

在SNAPSHOT版本上运行mvn deploy时,它们会使您的构建失败,确保没有意外地将SNAPSHOT部署到版本库。

然后,执行发布时需要禁用该规则。为此,我们可以定义release配置文件以禁用已定义的规则:

<profile>
  <id>release</id>
  <properties>
    <fail.if.release>false</fail.if.release>
  </properties>
</profile>

并在发布时使用

激活该配置文件
mvn release:prepare release:perform -Darguments="-Prelease"