【问题标题】:Strategy for maven deploy via a Jenkins job通过 Jenkins 作业部署 Maven 的策略
【发布时间】:2013-04-15 10:47:19
【问题描述】:

我有一份 Jenkins 工作,它使用 maven 构建目标“干净包部署”为主 git 分支。但是,由于 nexus 存储库不允许重新部署,如果 Jenkins 作业在没有更改版本的情况下第二次运行,它将失败并出现预期的 400 Bad Request 错误:

org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal 
    org.apache.maven.plugins:maven-deploy-plugin:2.7:deploy (default-deploy) 
    on project common-library: 
Failed to deploy artifacts: Could not transfer artifact 
    net.bacon.common:common-library:pom:1.2.13 from/to bacon-releases 
    (https://maven.bacon.com/nexus/content/repositories/releases): 
Failed to transfer file: 
    https://maven.bacon.com/nexus/content/repositories/releases/net/bacon/common/common-library/1.2.13/common-library-1.2.13.pom. 
Return code is: 400, ReasonPhrase:Bad Request.

任何人都可以提出不同的策略,从而可以运行部署目标而不会导致 Jenkins 作业失败?

【问题讨论】:

  • 您要部署快照还是发布版本?
  • 你不应该运行clean package deploy,因为在部署阶段包阶段正在第二次运行。看起来你没有注意到生命周期。只需要运行 clean deploy。如果您尝试部署已部署的工件,则无法再次运行它。为此,您应该使用 -SNAPSHOT 而不是版本。
  • @puce 在这种情况下是发布版本
  • @khmarbaise 感谢您提供以下信息:clean package deploy vs clean deploy。我知道重新部署的问题,所以我试图了解 is 何时是运行 deploy 目标的适当时间......有点 maven n00b,所以我想知道更有经验的人会做什么......

标签: java maven jenkins


【解决方案1】:

我们所做的是自动快照构建。然后,版本会自动递增。

对于发布构建,我们使用 maven 发布插件并手动输入版本。但是,您可以让发布插件完成工作。它将删除“-SNAPSHOT”构建、部署,然后,对于下一个版本,增加最后一位数字并再次附加“-SNAPSHOT”。

对于分发管理,您可以有两个存储库,一个用于快照,一个用于发布,具有不同的重新部署设置。

【讨论】:

  • +1 用于部署快照,然后使用 Maven 发布插件手动执行发布。请注意,有一个 Jenkins 插件来支持 Maven 发布插件。
【解决方案2】:

我们采用“双重行动”解决方案:

  • 增量版本
  • 运行 mvn install
  • 运行测试
  • 如果全部通过,我们运行 mvn deploy

这样,我们不会在知道全部通过之前尝试部署,并且每次都部署一个唯一的版本。

我希望这会有所帮助。

【讨论】:

  • 您是否找到了一种方法来使用 Jenkins 从已安装的 jar 中运行测试?
  • 我们不直接使用安装好的jar。我们将它们打包到战争中,然后打包到我们安装在专用服务器上的 RPM 中。这能回答你的问题吗?
【解决方案3】:

您应该确保 master 上的每个提交在 pom 文件中都有自己的版本号。所以你不会有重新部署。

拒绝“重新部署”有一个很好的理由:发布版本的内容永远不应该改变。

如果您无法避免在 master 上提交相同版本号,请考虑将链式 jenkins 作业更改为“干净安装”(仅将工件存储在本地存储库中)并使用“干净部署”创建一个新作业只能手动启动。

【讨论】:

    【解决方案4】:

    这也是我们小组的问题。

    我们希望 maven 尝试 PASSIVE 部署,因此如果部署存在于 nexus 中,那么它会在 SUCCESS ALREADY DEPLOYED 的情况下继续进行,如果部署在 nexus 中不存在,它将上传并部署 SUCCESS。

    我们希望 jenkins 在构建并通过覆盖检查后进行部署,但如何使其仅部署未部署的,而忽略已部署的。

    我们的解决方案是自定义脚本。

    【讨论】:

      【解决方案5】:

      您可以使用发布候选的概念。当您开始发布时,您将 -RC1 添加到版本(例如 1.1.0-RC1)。

      在下一次重新部署时,您将增加 RC 编号。发布完成后,如果要生成新的 TAG,只需删除该版本的 RC。在标签创建之前

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-11-23
        • 2013-04-17
        • 2018-10-08
        • 1970-01-01
        • 2017-12-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多