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

Posted

技术标签:

【中文标题】如何阻止 Jenkins 中的 CI 构建意外发布到发布存储库?【英文标题】:How to stop CI builds in Jenkins from accidentally publishing to release repository? 【发布时间】:2016-09-19 20:45:18 【问题描述】:

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

我考虑过以下问题,但没有一个是简单的一步解决方案

编写预提交挂钩以检查版本是否由管理员以外的任何人签入而不使用快照; 修改 Jenkins 作业,查看构建是否为 CI 构建;然后 grep 版本,如果版本不是 SNAPSHOT 版本,则会出错。为此,我需要修改 100 个作业。

【问题讨论】:

你使用什么版本控制/分支策略?如果在develop 上,版本不是SNAPSHOT,则实际上可以中断构建,反之亦然,如果在发布分支中,版本不是候选发布版,并且只需通过pom.xml 配置进行许多其他操作 Maven Enforcer Plugin 有一个enhancement request 来强制执行快照版本。它目前尚未解决,但我会继续努力,这似乎是一个合法的用例。这样,如果不在发布/部署中,您可以强制执行快照(并使构建失败)。 【参考方案1】:

一个很好的解决方案是利用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>

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"

【讨论】:

很好解释。旁注:查看 BeanShell 的网站,我很震惊他们使用 Comics Sans 作为左侧菜单,应该有一个 adsBlocker 插件喜欢阻止这种字体.. 这个可以加到公司父pom中,让所有项目都遵循同样的规则吗?还是建议我只将它添加到单个项目的父 pom 中? @user1164061 这可以很好地添加到父 POM 中,是的,可以在项目之间共享。

以上是关于如何阻止 Jenkins 中的 CI 构建意外发布到发布存储库?的主要内容,如果未能解决你的问题,请参考以下文章

CI/CD技术专题「Jenkins实战系列」jenkins+pipeline构建自动化部署

Jenkins——Jenkins构建企业CI/CD持续集成持续发布平台

Jenkins中的邮件配置

CI/CD技术专题「Jenkins实战系列」jenkins+pipeline构建自动化部署

CI/CD技术专题「Jenkins实战系列」如何通过Gitlab对接Jenkins构建提交自动触发部署构建体系指南(上部)

实践:基于Azure部署Jenkins服务并开发MERN应用的CI/CD构建管道