使用Nexus3进行Snapshot和Release管理

Nexus3中的关键角色与用户

Snapshot库的Deploy角色

  • nx-repository-view-maven2-maven-snapshots-edit

在Nexus库中创建拥有以上角色的用户,例如 developer

这个角色,必须要包含 nx-anonymous 这个「匿名角色」,否则会被以 ReasonPhrase:Forbidden. 理由拒绝。

Release库的Deploy角色

  • nx-repository-view-maven2-maven-releases-edit

在Nexus库中创建拥有以上角色的用户,例如 publisher

这个角色,必须要包含 nx-anonymous 这个「匿名角色」,否则会被以 ReasonPhrase:Forbidden. 理由拒绝。

.m2/settings.xml中servers的设置

<settings>
    <servers>
        <server>
            <id>snapshot</id>
            <username>developer</username>
            <password>password-of-developer-in-nexus</password>
        </server>
        <server>
            <id>release</id>
            <username>publisher</username>
            <password>password-of-publisher-in-nexus</password>
        </server>
    </servers>
...
</settings>

maven project

super-parent maven project

对于每个组织或者企业,使用一个顶级的、唯一的parent project是十分有必要的,这可以统一各级子工程的发布管理配置。

<scm>
    <url>http://your.domain/and-path</url>
    <connection>scm:git:ssh://git@your.vcs.domain/your-path</connection>
</scm>
<distributionManagement>
    <snapshotRepository>
        <id>snapshot</id>
        <url>http://your.nexus/repository/maven-snapshots</url>
    </snapshotRepository>
    <repository>
        <id>release</id>
        <url>http://your.nexus/repository/maven-releases</url>
    </repository>
</distributionManagement>
<build>
    <pluginManagement>
        <plugins>
            <plugin>
                <artifactId>maven-release-plugin</artifactId>
                <version>2.5.3</version>
            </plugin>
        </plugins>
    </pluginManagement>
</build>

其中,snapshotRepository 中的 id.m2/settings.xml 中的 server/id 需要保持一致。

在例子中,两处都都同时使用了 snapshot` 以及 ``release

snapshot deploy

snapshot deploy 是每个developer日常进行snapshot library发布的正常行为。

在每个developer的本地,都可以针对一个 maven project 执行: mvn deploy 操作,将任意的 Version-SNAPSHOT 结尾的 artifact 部署至 snapshot 库中。

release publish

maven-release-plugin 是用作正式发布使用的maven插件。

其中有两个关键的mvn 指令, mvn release:prepare 以及 mvn release:perform

  • mvn release:prepare

这个指令主要的操作目标是VCS (例如GitLab) ,它的执行条件有:

  1. 本地的所有代码已经提交,对于git而言,本地的所有代码,都已经经过 git push ,也就是说stage区不存在修改过的文件。
  2. mave坐标中的Version,必须以 -SNAPSHOT 结尾,否则该指令会罢工。这个指令的执行过程,是交互式的,它会询问三项内容:
  3. 指定要发布的Version值,一般来说,它会自动提示不包含 -SNAPSHOT 部分的版本号
  4. VCS的tag名称。例如,git分支上的tag。
  5. 下一个开发版,含的 -SNAPSHOT 版本号,一般来说,它会自动将最后一位数字版本号自动增加1。

这个动作执行之后,会生成两个主要的文件:

  1. 原来pom.xml的备份文件
  2. release.properties,即本次release的相关信息。

同时,这个指令还会对修改后的release版本进行

  • mvn release:perform

这个指令主要的操作目标是仓库 (Repository,例如 Nexus)。

它的主要目的,是把本地已经生成好的 release library 部署至仓库。并不会对 VCS 进行任何写操作。