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

2024-05-09

有时,开发人员会不小心签入 POM 中没有“SNAPSHOT”的版本。这将构建 Maven 项目并将工件发布到发布存储库。我怎样才能避免这种情况呢?我只想发布构建工件以发布存储库,而不是 CI 构建。

我考虑了以下问题 - 但它们都不是一个简单的一步解决方案

  • 编写一个预提交挂钩来检查版本是否已由除允许进行发布构建的管理员之外的任何人在没有快照的情况下签入;
  • 修改Jenkins作业,查看构建是否是CI构建;然后 grep 查找版本,如果版本不是快照版本,则会出错。为此我需要修改数百个作业。

解决这个问题的一个好的解决方案是利用Maven 强制执行器插件 http://maven.apache.org/enforcer/maven-enforcer-plugin/.

更新至1.4.2

从1.4.2版本开始(尚未发布,请参阅增强请求Menforcer-204 https://issues.apache.org/jira/browse/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 http://maven.apache.org/enforcer/enforcer-rules/evaluateBeanshell.html rule.

这个想法是让构建失败,因为该版本默认不是快照版本。当当前项目处于发布状态时,禁用该规则。

为此,您可以在 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>

这是执行一个豆壳 http://www.beanshell.org/评估项目版本的脚本。如果它结束于-SNAPSHOT那么规则通过,否则规则失败并且构建结束。确定版本是否是快照。 (快照版本的严格规则是更复杂 http://blog.sonatype.com/2008/05/maven-code-how-to-detect-if-you-have-a-snapshot-version/但这应该涵盖所有用例)。因此,这样的规则将验证正在构建的项目是否具有快照版本。


上面的两个配置都将 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"
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐