首页 文章

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

提问于
浏览
2

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

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

  • 编写一个预提交钩子,检查版本是否在没有SNAPSHOT的情况下被允许执行发布版本的管理员以外的任何人签入;

  • 修改Jenkins作业以查看构建是否为CI构建;如果版本不是SNAPSHOT版本,那么grep版本和错误输出 . 为此,我需要修改100个工作 .

1 回答

  • 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"
    

相关问题