当工程上线时,需要发布正式版本,如果是多模块结构,如果一个个工程手工去修改,费时费力,本文主要介绍如何使用maven-release-plugin插件,结合git进行版本发布。

配置

pom.xml
<project>

    <repositories>
        <repository>
            <id>maven-public</id> (1)
            <url>https://repo.liming.pub/nexus/repository/maven-public/</url>
        </repository>
    </repositories>
    <pluginRepositories>
        <pluginRepository>
            <id>maven-public</id> (1)
            <url>https://repo.liming.pub/nexus/repository/maven-public/</url>
        </pluginRepository>
    </pluginRepositories>

    <distributionManagement>
        <repository>
            <id>maven-releases</id> (2)
            <url>https://repo.liming.pub/nexus/repository/maven-public-releases/</url>
        </repository>
        <snapshotRepository>
            <id>maven-snapshots</id>
            <url>https://repo.liming.pub/nexus/repository/maven-public-snapshots/</url>
        </snapshotRepository>
    </distributionManagement>

    <!-- ... -->
    <scm>
        <developerConnection>scm:git:http://code.liming.pub/test.git</developerConnection>
        <tag>HEAD</tag>
    </scm>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-release-plugin</artifactId>
                <version>2.5.3</version>
                <configuration>
                    <useReleaseProfile>false</useReleaseProfile>
                    <autoVersionSubmodules>true</autoVersionSubmodules>
                    <arguments>-DskipTests -Pmaven-public</arguments>  (3)
                    <scmCommentPrefix>「版本发布」</scmCommentPrefix>
                </configuration>
            </plugin>
        </plugins>
    </build>
    <!-- ... -->
</project
  1. 下载仓库ID

  2. 发布仓库ID

  3. maven命令额外参数

settings.xml
<settings>
    <servers>
        <server>
            <id>maven-releases</id> (1)
            <username></username>
            <password></password>
        </server>
    </servers>
</settings>
  1. 仓库ID,对应pom.xml中的

执行

准备

命令: mvn release:prepare

  1. 检测是否有未提交的代码。

  2. 测是否有snapshot依赖。

  3. 修改工程的版本号为release版本(提示输入)。

  4. 为当前代码打上一个git的tag(提示输入),提交代码至远程仓库。

  5. 修改pom为下一个snapshot版本(输入提示),提交至远程仓库。

--batch-mode 命令行非互动模式。 ` -Dresume=false` 忽略上一次prepare留下的backUp文件。

回滚

命令: mvn release:rollback

Note
本地tag不会删除,需要执行“git tag -d <你的tag名称>” 来删除本地tag
  1. 发布 mvn perform

与Gitlab-CI整合

因为Gitlab-CI是基于提交自动触发,而prepare阶段会有两次push提交,如果有提交触发的Job,如快照发布:mvn:deploy,那么perform阶段时就会失败(nexus不允许重复发布release)。所以gitlab发布时需要特殊处理:

  1. 配置手动触发模式

    gitlab-ci.yml
    release:
      stage: release
      script:
        - repo_public_release
      when: manual
      tags:
        - deploy
    repo_public_release
    set -e
    set -x
    cd /home/gitlab-runner/releases
    mkdir -p ${CI_PROJECT_NAMESPACE}
    cd ${CI_PROJECT_NAMESPACE}
    if [[ ! -e ${CI_PROJECT_NAME} ]];then
      echo "克隆${CI_PROJECT_NAME}工程"
      git clone git@code.liming.pub:${CI_PROJECT_NAMESPACE}/${CI_PROJECT_NAME}.git
    fi
    cd ${CI_PROJECT_NAME}
    set +x
    
    if [[ -e release.properties ]];then
      echo "上次发布未成功,需要手工处理!"
      exit 1
    fi
    set -x
    git checkout ${CI_COMMIT_REF_NAME}
    git reset --hard origin/${CI_COMMIT_REF_NAME}
    git pull
    set +x
    
    commit_message=$(git log --pretty=format:'%cn#%cd#%s' -1|cut -d# -f3|awk '{print $1}')
    if [[ "${commit_message}" == "「版本发布」prepare" || "${commit_message}" == "「版本发布」rollback" ]];then
      echo "当前分支不具备发布条件!"
      exit 1
    fi
    
    echo "开始发布版本"
    mvn release:prepare --batch-mode
    mvn release:perform --batch-mode
  2. 自动触发的剔除CI提交

    commit_message=$(git log --pretty=format:'%cn#%cd#%s' -1|cut -d# -f3|awk '{print $1}')
    if [[ "${commit_message}" == "「版本发布」prepare" || "${commit_message}" == "「版本发布」rollback" ]];then
      echo "版本发布自动提交,忽略..."
      exit 0
    fi

问题

  1. maven-release-plugin默认都是基于同一个分支,即master分支,如果结合gitflow多分支策略时,如何操作?

    请移步: gitflow-maven-plugin插件