当前位置: 首页 > 面试题库 >

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

孙俊彦
2023-03-14
问题内容

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

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

  • 编写一个预先提交的钩子,以检查是否允许除管理员以外的任何其他人在没有SNAPSHOT的情况下签入版本;
  • 修改Jenkins作业以查看该构建是否为CI构建;然后grep获取版本,如果该版本不是SNAPSHOT版本,则会出错。为此,我需要修改100个工作。

问题答案:

一个好的解决方案是利用Maven Enforcer插件。

更新到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"


 类似资料:
  • 我有一个Jenkins的自由式构建,基于一个使用SBT的Scala项目。我正试图使用Jenkins艺术工厂插件将生成的工件发布到艺术工厂存储库,特别是托管在artifactoryonline.com.的存储库。然而,我正在努力寻找一个合理的配置。我倾向于怀疑我错过了什么,但我无计可施,我找到的留档似乎都没有详细介绍这个用例,我厌倦了浏览艺术工厂插件源代码。非常感谢任何帮助。 情况如下。我想: 使用

  • 我想在我的开源项目中使用Travis CI。Travis没有提供任何方法来发布生成的工件(尽管,他们在未来的计划中有这一点)。 在某处发布/上传工件有哪些解决方法?我可以在CI机器上执行任何脚本。 简单的上传可以工作,但是有一个安全问题:任何人都可以以同样的方式上传东西,因为所有的资源都是公开的。

  • 构建 当项目开发完毕,只需要运行一行命令就可以打包你的应用: # 打包正式环境 npm run build:prod # 打包预发布环境 npm run build:stage 构建打包成功之后,会在根目录生成 dist 文件夹,里面就是构建打包好的文件,通常是 ***.js 、***.css、index.html 等静态文件。 如果需要自定义构建,比如指定 dist 目录等,则需要通过 co

  • 在项目正常开发,预览效果达到要求的情况下,可以构建项目来进行更多的测试。 导读 熟悉构建发布面板 了解通用构建参数 命令行发布项目 定制项目的构建模版 扩展构建流程 构建流程简介与常见错误处理 发布到 web 平台 发布到原生平台 安装配置原生环境 原生平台 JavaScript 调试 发布到 iOS App Clip (轻 App) 发布到支付宝小游戏 发布到字节小游戏 发布到 Cocos Pl

  • 我想将jar发布到Nexus快照存储库。 如果你知道如何实现,我很想知道。 我将从詹金斯的工作中发布jar。 我想发布到快照存储库,但我无法调查/实现各种事情。 根据我的研究,似乎已经有了下面的Jenkins插件 null 卷曲时的错误信息如下所示。 谢谢你。

  • 问题内容: 我是詹金斯的新手。我想知道如何将生成的生成文件附加到作为生成后操作发送的电子邮件中? 谢谢 问题答案: 您可以使用此插件,该插件可让您自定义电子邮件并附加构建文件。