Maven发布到Nexus

2023/05/24

1. 概述

在本系列的上一篇文章中,我们设置了一个使用Maven到Nexus的部署过程。在本文中,我们将在项目的pom和Jenkins作业中使用Maven配置发布流程

2. pom中的仓库

为了让Maven能够发布到Nexus仓库服务器,我们需要通过distributionManagement元素定义仓库信息

<distributionManagement>
   <repository>
      <id>nexus-releases</id>
      <url>http://localhost:8081/nexus/content/repositories/releases</url>
   </repository>
</distributionManagement>

托管的发布仓库在Nexus上开箱即用,因此无需显式创建它。

3. Maven pom中的SCM

发布过程将与项目的源代码控制系统交互,这意味着我们首先需要在pom.xml中定义<scm>元素:

<scm>
    <connection>scm:git:https://github.com/user/project.git</connection>
    <url>http://github.com/user/project</url>
    <developerConnection>scm:git:https://github.com/user/project.git</developerConnection>
</scm>

或者,使用git协议:

<scm>
    <connection>scm:git:git@github.com:user/project.git</connection>
    <url>scm:git:git@github.com:user/project.git</url>
    <developerConnection>scm:git:git@github.com:user/project.git</developerConnection>
</scm>

4. release插件

发布过程使用的标准Maven插件是maven-release-plugin,这个插件的配置是最小的:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-release-plugin</artifactId>
    <version>2.4.2</version>
    <configuration>
        <tagNameFormat>v@{project.version}</tagNameFormat>
        <autoVersionSubmodules>true</autoVersionSubmodules>
        <releaseProfiles>releases</releaseProfiles>
    </configuration>
</plugin>

这里重要的是releaseProfiles配置实际上会强制一个Maven profile(releases profile),在发布过程中变为激活状态。

正是在这个过程中,nexus-staging-maven-plugin用于执行部署到nexus-releases Nexus仓库:

<profiles>
    <profile>
        <id>releases</id>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.sonatype.plugins</groupId>
                    <artifactId>nexus-staging-maven-plugin</artifactId>
                    <version>1.5.1</version>
                    <executions>
                        <execution>
                            <id>default-deploy</id>
                            <phase>deploy</phase>
                            <goals>
                                <goal>deploy</goal>
                            </goals>
                        </execution>
                    </executions>
                    <configuration>
                        <serverId>nexus-releases</serverId>
                        <nexusUrl>http://localhost:8081/nexus/</nexusUrl>
                        <skipStaging>true</skipStaging>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    </profile>
</profiles>

该插件配置为在没有暂存机制的情况下执行发布过程,与之前相同,用于部署过程(skipStaging=true)。

并且与部署过程类似,发布到Nexus是一项安全操作,因此我们将再次使用开箱即用的部署用户表单Nexus。

我们还需要在全局settings.xml(%USER_HOME%/.m2/settings.xml)中配置nexus-releases服务器的凭据:

<servers>
    <server>
        <id>nexus-releases</id>
        <username>deployment</username>
        <password>the_pass_for_the_deployment_user</password>
    </server>
</servers>

这是完整的配置。

5. 发布过程

让我们将发布过程分解为小而集中的步骤,当项目的当前版本是SNAPSHOT版本(比如0.1-SNAPSHOT)时,我们正在执行发布。

5.1 release:prepare

清理发布将

  • 删除发布描述符(release.properties)
  • 删除任何备份POM文件

5.2 release:prepare

发布过程的下一部分是准备发布;这将:

  • 执行一些检查-不应该有未提交的更改,并且项目不应该依赖于任何SNAPSHOT依赖项
  • 将pom文件中的项目版本更改为完整发布版本号(删除SNAPSHOT后缀),在我们的示例中为0.1
  • 运行项目测试套件
  • 提交并推送更改
  • 从这个非SNAPSHOT版本控制的代码中创建标签
  • 增加POM中项目的版本,在我们的示例中为0.2-SNAPSHOT
  • 提交并推送更改

5.3 release:perform

发布过程的后半部分是执行发布;这将:

  • 从SCM签出发布标签
  • 构建和部署发布的代码

该过程的第二步依赖于准备步骤的输出-release.properties。

6. 关于Jenkins

Jenkins可以通过以下两种方式之一执行发布过程,它可以使用它自己的发布插件,或者它也可以简单地使用运行正确发布步骤的标准maven作业来执行发布。

现有的专注于发布过程的Jenkins插件有:

然而,由于用于执行发布的Maven命令非常简单,我们可以简单地定义一个标准的Jenkins作业来执行该操作,不需要插件。

因此,对于一个新的Jenkins作业(构建一个maven2/3项目),我们将定义2个字符串参数:releaseVersion=0.1和developmentVersion=0.2-SNAPSHOT。

构建配置部分,我们可以简单地配置以下Maven命令来运行:

release:clean release:prepare release:perform 
   -DreleaseVersion=${releaseVersion} -DdevelopmentVersion=${developmentVersion}

在运行参数化作业时,Jenkins会提示用户为这些参数指定值,因此每次运行作业时,我们都需要为releaseVersion和developmentVersion填写正确的值。

此外,值得使用Workspace Cleanup插件并为此构建选中“Delete workspace before build starts”选项。但是请记住,发布的perform步骤必须由与prepare步骤相同的命令运行,这是因为后面的perform步骤将使用由prepare创建的release.properties文件。这意味着我们不能让一个Jenkins Job运行prepare而另一个运行perform

7. 总结

本文展示了如何在有或没有Jenkins的情况下实现发布Maven项目的过程,与部署类似,此过程使用nexus-staging-maven-plugin与Nexus交互并专注于git项目。

与往常一样,本教程的完整源代码可在GitHub上获得。

Show Disqus Comments

Post Directory

扫码关注公众号:Taketoday
发送 290992
即可立即永久解锁本站全部文章