内置编号的Maven + Mercurial

时间:2010-10-14 15:03:10

标签: maven-2 mercurial build-process hudson build-numbers

我无法弄清楚如何将Mercurial版本ID放入我的Maven版本中(理想情况下,我想在我的罐子和战争中使用它)。

我能找到的最接近的解决方案是:

mvn -DbuildNumber=`hg id -i`

哪个不适用于Windows或我的Hudson服务器。 幸运的是Hudson标记了我的构建,但如果构建版本也使用Mercurial changset id标记,我还想要更多的保证。

2 个答案:

答案 0 :(得分:4)

查看this previous question以及接受答案中的链接。基本上,您希望做同样的事情,除非您想要使用Mercurial的buildnumber:hgchangeset目标来获取内容为changeset的{​​{1}}属性。

答案 1 :(得分:1)

不幸的是,hg id -i太长了,无法使用。我创建了一个脚本来计算准确的内部版本号。但是,有两个例外。如果分支上没有先前的版本,则它无效。如果本地仓库有变化,则无效。在我的构建脚本中,我将构建标记为" x.x.UNSTABLE"只要发生这种情况。

我使用REL_PATTERN来获取当前分支中标记为实际版本的最后一个标记。然后我通过跟踪该版本的提交日志计数+自该版本以来对分支的所有提交来计算构建号。

#!/bin/bash
REL_PATTERN="release-[0-9]*\.[0-9]*\.[0-9]*"
BRANCH=$( hg branch )
CURR_REV=$( hg id -n )
if [  "${CURR_REV: -1}" = "+" ] ; then
  echo "ERROR: This workspace contains uncommitted code. Cannot calculate build number" >&2
  echo "UNSTABLE"
  exit 1
fi
RELEASE=$( hg log --rev="branch($BRANCH) and tag() and 1:$CURR_REV" -T "{tags} {rev}\n"|grep "${REL_PATTERN} "|tail -1 )
if [ "$RELEASE" = "" ] ; then
  echo "ERROR: Unable to locate version tag" >&2
  echo "UNSTABLE"
  exit 1
fi
RELEASE_REV=$( echo $RELEASE|cut -f 2 -d ' ' )
RELEASE_TAG=$( echo $RELEASE|cut -f 1 -d ' ' )
REVS=$( hg log -P $RELEASE_REV -b $BRANCH -T "{rev}\n"|wc -l )
BUILD=$( hg log -r1:$CURR_REV -P $RELEASE_REV -b $BRANCH -T "{rev}\n"|wc -l )
echo "BRANCH=$BRANCH" >&2
echo "CURR_REV=$CURR_REV" >&2
echo "RELEASE_REV=$RELEASE_REV" >&2
echo "RELEASE_TAG=$RELEASE_TAG" >&2
echo "BUILD=$BUILD" >&2
echo $BUILD