Как найти последний хеш git commit из скрипта сборки ant
Как найти последний хеш git commit из скрипта сборки ant?
В настоящее время я работаю над новым проектом с открытым исходным кодом, который я храню на github. Я хотел бы расширить свой существующий файл сборки ANT, чтобы позволить мне создавать нумерованные сборки. Я предполагаю, что я бы запустил сборку с чем-то вроде "ant buildnum -Dnum=12".
Я хотел бы, чтобы у получающегося jar было два важных бита информации в его файле манифеста:
- build.number = 12
- build.gitcommit =
Я знаю, как создать строку build.number. Тем не менее, я не уверен в том, что лучший муравейник для поиска последнего хита git commit является значением, которое я хочу заполнить.
7 ответов
Я написал следующую цель муравья для проекта на GitHub. Использование:
- сохраняет версию в свойстве "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>
Например, он может быть использован для расширения токена @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. Команда должна выполняться как в Windows, так и в *nix системах
<exec executable="git" outputproperty="git.revision">
<arg value="log" />
<arg value="-1" />
<arg value="--pretty=format:%H" />
</exec>
Я фактически использовал оба ответа. Код муравья, который я написал, был следующим.
<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 для определения версии сборки без явного вызова команды Git, чтобы мне не нужно было устанавливать ее (в Windows мне также нужно было бы включить ее в PATH
). Рабочий процесс управления версиями:
- Любые изменения версии "вехой" (т.е. первые 2 или 3 числа) устанавливаются вручную с помощью тегов на ветке.
master
, - Каждый коммит, следующий за тегом, добавляет номер сборки. (Только для тегов на
master
.) - При сборке из отдельной ветки ее название должно быть включено в версию.
Исходный код и примеры: https://github.com/Hunternif/JGitVersion
Вы должны пометить версию (начиная с 0.1 или аналогичной), а затем просто использовать git describe
,
Это даст вам читаемые уникальные идентификаторы в качестве опорных точек из вашего тега. Когда вы отпустите, этот номер версии будет таким, каким вы его указали.
В большой компании я нашел <exec> git command-line
быстро столкнулся с проблемами, некоторые разработчики использовали графический интерфейс, у некоторых были разные версии командной строки, установленные в разных местах, у некоторых были другие проблемы. Я понял, что путь к успеху - это чистое Java-решение с зависимостями, являющимися частью системы сборки проекта, так же, как мы использовали ранее в Svnkit для Subversion.
Одним из условий было то, что разрешались только "основные" библиотечные зависимости. Мы могли бы использовать библиотеку JGit, но многие проекты по задачам git ant, разбросанные по github и т.п., были исключены.
Решением было использовать комбинацию из build.xml и библиотеки JGit.
ТОДО: вставить код...