【问题标题】:Infrastructure with maven, Jenkins, Nexus使用 maven、Jenkins、Nexus 的基础设施
【发布时间】:2011-10-20 11:46:12
【问题描述】:

我们正在使用 Maven。我想设置基础设施,以便自动构建的工件将进入 Nexus 存储库。然后它们可以被开发人员使用。

我已经为我们的项目设置了 1 个工作。 我将 Nexus 设置在同一台服务器上。

在开发人员的 PC 上,我将默认 maven 设置复制到 C:\Users{user}.m2\settings.xml 添加此部分。 参考资料:

Configuring Maven to Use a Single Nexus

Maven Settings Reference

<mirror>
  <!--This sends everything else to /public -->
  <id>nexus</id>
  <mirrorOf>*</mirrorOf>
  <url>http://myserver:8081/nexus/content/groups/public</url>
</mirror>

(我只关注Repository Management with Nexus书)

我的下一步应该是什么? 詹金斯的工作应该有mvn install吗? 如何为公司工件创建 Nexus 存储库?

【问题讨论】:

    标签: maven jenkins nexus


    【解决方案1】:

    要将工件部署到 Nexus,您需要在 pom.xml 中包含 distributionManagement section。 Nexus 附带已经为快照和版本设置的特定存储库。您应该为每一个提供正确的路径,以便 Maven 将快照和发布工件部署到正确的存储库。然后,每当您部署工件时——通常使用mvn deploy 或使用maven release plugin,工件将在那里部署。默认情况下,Nexus 已启用写入身份验证,因此您需要确保将具有正确凭据的 server section 添加到将要部署工件的任何人的 settings.xml 中。可以像对待任何其他用户一样对待 Jenkins。如果你有它做一个deploy 作为它的构建,那么每个构建都将部署到 Nexus。还有一个用于部署工件的构建后操作,以防您希望稍后在 Jenkins 作业中发生。

    【讨论】:

    • 虽然这会起作用,但它会强制您的项目知道您的工件存储库的位置。查看this answer,让 Jenkins 专门处理工件部署。
    【解决方案2】:

    我不需要对我的项目 pom.xml 进行任何更改。相反,在詹金斯的“构建后操作”中,我选择了“将工件部署到 Maven 存储库”,然后选择“高级”并将存储库 URL 设置为 http://nexusserver:8081/nexus/content/repositories/releases,将存储库 ID 设置为 deploymentRepo

    在我添加的詹金斯机器上的~/.m2/settings.xml

    <settings>
      <servers>
        <server>
          <id>deploymentRepo</id>
          <username>deployment</username>
          <password>deployment123</password>
        </server>
      </servers>
       ...
    
    </settings>
    

    【讨论】:

    • Nexus 发布存储库的默认设置是允许 1 个版本仅部署一次。您是否有第二份工作仅用于发布(即部署到 Nexus)?
    • @PaulVerest 您可以添加一个 Pre Step 以执行 Shell 并运行 mvn versions:set -DnewVersion=1.${BUILD_NUMBER} versions:commit,以内部版本号命名版本。然后,当这个 Post-build Action 发生时,它会将其部署为该版本。
    • @JoshJohnson 这是史蒂夫布朗的回答。我个人建议使用 maven-release-plugin 而不是 versions-maven-plugin (versions:set)
    • @PaulVerest 抱歉,我在 cmets 中误解了您的问题。作为记录,我无法使用发布插件,因为它在我的构建管道中引入了手动步骤。
    • 已经有一段时间了,我对一些细节很模糊。我将每个版本都做成了一个 Maven 版本,jenkins 每次都会增加版本号。我使用了来自this article 的想法。正如该博客文章的一位评论者所提到的,对于 maven 和持续集成,有一种“将方形钉子钉入圆孔”的感觉
    【解决方案3】:

    更新pom.xml

     <distributionManagement>
        ...
        <repository>
          <id>deploymentRepo</id>
          <name>Internal Releases</name>
          <url>http://nexusserver:8081/nexus/content/repositories/releases</url>
        </repository>
        ...
      </distributionManagement>
    

    然后为 maven ~/.m2/settings.xml 添加(这是 Nexus 中的默认部署用户)

    <server>
      <id>deploymentRepo</id>
      <username>deployment</username>
      <password>deployment123</password>
     </server>
    

    然后mvn deploy

    然后可以在任何项目中使用已部署的工件,就像标准工件一样。 在这种情况下添加到 pom.xml

    <!-- company repositories -->
        <repository>
            <id>deploymentRepoReleases</id>
            <name>Releases (Nexus)</name>
            <url>http://nexusserver:8081/nexus/content/repositories/releases/</url>
        </repository>
        <repository>
            <id>deploymentRepoSnapshots</id>
            <name>Snapshots (Nexus)</name>
            <url>http://nexusserver:8081/nexus/content/repositories/snapshots/</url>
        </repository>
    

    更新:后来我们不再使用 Snapshot 存储库,而是使用 maven-release-plugin,它只需要发布类型的存储库。

    【讨论】:

      【解决方案4】:

      如果这是 Jenkins 问题而不是 Maven 问题,我建议在大多数情况下使用内置的 Jenkins“将工件部署到 Maven 存储库”构建后操作。

      我认为的优点:

      • 更便携(我们在生命周期的不同阶段使用不同的存储库),每个 Jenkins 实例都知道自己的存储库
      • 对于阅读 Jenkins 工作的人来说更明显
      • 更符合 Jenkins 的处事方式

      【讨论】:

        【解决方案5】:

        maven-release-plugin 的以下 maven 目标参数可用于通过 nexus 存储库身份验证

        -Dusername=<> -Dpassword=<>
        

        与 jenkins 项目、maven 命令行一起使用,用于 nexus repo 身份验证

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-04-26
          • 1970-01-01
          • 2023-03-20
          • 2011-06-19
          • 2013-03-07
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多