Внедрение текущего идентификатора коммита git в веб-приложение Java
У нас есть git-репозиторий, содержащий исходные тексты для нескольких связанных Java-WAR и JAR-файлов. Было бы хорошо, если бы код Java мог как-то:
System.err.println("I was built from git commit " + commitID);
(Очевидно, что реальный код может помещать это в заголовок HTTP, регистрировать его при запуске или что-то в этом роде, это сейчас не важно)
Мы используем Ant для сборки (по крайней мере, для производственных сборок, кажется, некоторые программисты проводят тестирование из Eclipse, о котором я знаю даже меньше), двоичных файлов.
Есть ли канонический способ получить идентификатор фиксации для текущей проверки git в нашу Java во время сборки? Если нет, могут ли люди, использующие Ant для сборки, предложить, как они это сделают, и мы увидим, появится ли каноническое решение? Я уверен, что могу сам что-то придумать из цельной ткани, но это похоже на многократно используемый строительный блок, поэтому я бы предпочел этого не делать.
6 ответов
Я не знаю, есть ли какая-нибудь задача Ant для git (я немного погуглил безуспешно), в любом случае Ant может обновить файл свойств с помощью опции Piotr (git rev-parse HEAD
), а затем во время выполнения используйте эти свойства, чтобы получить номер ревизии. Это более чистый и дружественный IDE, чем Ant, генерирующий файл.java.
Вы можете получить последний коммит SHA с помощью
git rev-parse HEAD
но в целом это гораздо полезнее
git describe
который даст вам что-то похожее на это:
v0.7.0-185-g83e38c7
Это работает, если у вас есть теги - он сообщит вам, сколько коммитов из последнего действующего тега находится в вашей текущей проверке плюс частичный SHA для этой фиксации, так что вы можете использовать его, чтобы основать извлечение позже. Вы можете использовать этот идентификатор точно так же, как и SHA, но в большинстве случаев он более удобочитаемый.
Если это помогает кому-то еще. Я знаю, что ваш ANT
Для сборки MAVEN вы можете использовать git-commit-id-plugin
<plugin>
<groupId>pl.project13.maven</groupId>
<artifactId>git-commit-id-plugin</artifactId>
<version>2.2.0</version>
<executions>
<execution>
<goals>
<goal>revision</goal>
</goals>
</execution>
</executions>
<configuration>
<dotGitDirectory>${project.basedir}/.git</dotGitDirectory>
<generateGitPropertiesFile>true</generateGitPropertiesFile>
<generateGitPropertiesFilename>${project.build.outputDirectory}/git.properties</generateGitPropertiesFilename>
</configuration>
</plugin>
Пожалуйста, пройдите по ссылке: http://www.baeldung.com/spring-git-information & https://github.com/ktoso/maven-git-commit-id-plugin для получения дополнительной информации.
Я написал задачу Ant для получения номера сборки с использованием JGit API (без приложения командной строки git), см. Jgit-buildnumber-ant-task. Затем вы можете сохранить этот номер сборки в файле MANIFEST.MF и получить его из пути к классам во время выполнения.
git rev-parse HEAD
напечатает то, что вы, вероятно, хотите (например, идентификатор HEAD
фиксации). Вы можете заставить ant сгенерировать простой класс Java с этим идентификатором в качестве статической константы.
Во-первых, вы можете использовать ident
Gitattribute с $Id$
ключевое слово (хотя это, вероятно, не то, что вы хотите; это хеш содержимого файла, и не имеет никакого отношения к текущей версии проекта).
Во-вторых, вы можете сделать это так, как это делают ядро Linux и сам Git: в Makefile (в вашем случае: в файле Ant) есть правило, которое заменяет некоторый заполнитель, обычно "@@VERSION@@" (но в случае с Perl является '++VERSION++') результатом GIT-VERSION-GEN, который, в свою очередь, использует " git description". Но для того, чтобы это было полезно, вы должны отмечать свои выпуски (используя аннотированные / подписанные теги).