如何从ant构build脚本中查找最新的git commit哈希
我如何从ant构build脚本中查找最新的git commit哈希?
我目前正在开发一个新的开源项目,我在github上存储。 我想扩展我现有的ANT构build文件,以允许我创build编号的构build。 我正在想象,我会用“ant buildnum -Dnum = 12”之类的东西来启动构build。
我希望得到的jar在清单文件中有两个重要的信息:
- build.number = 12
- build.gitcommit =
我知道如何创buildbuild.number行。 然而,我不确定最好的antpipe道查找最新的git提交散列,这是我想填写的值。
我在github上为一个项目编写了下面的ant目标。 用法:
- 在属性“repository.version”中存储版本
- 如果没有安装git或没有.git目录存在(后备)
- 其他目标必须依靠这个目标,如果他们需要的Git版本
- 只有一个git命令被执行( – 总是)
<available file=".git" type="dir" property="git.present"/> <target name="git.revision" description="Store git revision in ${repository.version}" if="git.present"> <exec executable="git" outputproperty="git.revision" failifexecutionfails="false" errorproperty=""> <arg value="describe"/> <arg value="--tags"/> <arg value="--always"/> <arg value="HEAD"/> </exec> <condition property="repository.version" value="${git.revision}" else="unknown"> <and> <isset property="git.revision"/> <length string="${git.revision}" trim="yes" length="0" when="greater"/> </and> </condition> </target>
它例如用于扩展模板文件中的token @repository.version@
:
<target name="index.html" depends="git.revision" description="build index.html from template"> <copy file="index.html.template" tofile="index.html" overwrite="yes"> <filterchain> <replacetokens> <token key="repository.version" value="${repository.version}" /> </replacetokens> </filterchain> </copy> </target>
这个命令总是返回工作文件夹的最后一个提交SHA1,当你不总是从HEAD构build时,这个命令很有用。 该命令应该在Windows和* nix系统上运行
<exec executable="git" outputproperty="git.revision"> <arg value="log" /> <arg value="-1" /> <arg value="--pretty=format:%H" /> </exec>
那是你在找什么?
git rev-parse HEAD
我实际上使用了两个答案。 我写的ant代码如下。
<target name="getgitdetails" > <exec executable="git" outputproperty="git.tagstring"> <arg value="describe"/> </exec> <exec executable="git" outputproperty="git.revision"> <arg value="rev-parse"/> <arg value="HEAD"/> </exec> <if> <contains string="${git.tagstring}" substring="cannot"/> <then> <property name="git.tag" value="none"/> </then> <else> <property name="git.tag" value="${git.tagstring}"/> </else> </if> </target>
<target name="getgitdetails" > <exec executable="git" outputproperty="git.tagstring"> <arg value="describe"/> </exec> <exec executable="git" outputproperty="git.revision"> <arg value="rev-parse"/> <arg value="HEAD"/> </exec> <if> <contains string="${git.tagstring}" substring="cannot"/> <then> <property name="git.tag" value="none"/> </then> <else> <property name="git.tag" value="${git.tagstring}"/> </else> </if> </target>
我写了一个Ant任务来确定构build版本,而不显式调用Git命令,所以我不需要安装它(在Windows上,我还需要将其包含在PATH
)。 版本控制工作stream程:
- 任何“里程碑”版本更改(即前两个或三个数字)都是通过分支
master
上的标签手动设置的。 - 在标签之后的每个提交都会添加到内部版本号中。 (仅限于
master
标签) - 如果从一个单独的分支构build,它的名字应该包含在版本中。
源代码和示例: https : //github.com/Hunternif/JGitVersion
你应该标记一个版本 (从0.1或类似开始),然后使用git describe
。
这将为您提供可读的唯一标识符作为来自您的标签的参考点。 当你释放时,这个版本号将是你指定的任何东西。
在一家大公司,我发现<exec> git command-line
很快遇到了问题,一些开发者使用了一个GUI,一些在不同的地方安装了不同的命令行版本,一些还有其他问题。 我意识到要走的路是一个纯粹的Java解决scheme,依赖关系是项目构build系统的一部分,就像我们以前用Svnkit进行Subversion一样。
一个条件是只允许“主stream”的图书馆依赖。 我们可以使用JGit库,但是排在github之类的许多git ant任务项目被排除在外。
解决scheme是使用build.xml和JGit库中的组合。
TODO:粘贴代码…