Внедрение текущего git commit id в Java webapp
У нас есть репозиторий git, который содержит источник для нескольких связанных Java WAR и JAR. Было бы неплохо, если бы код Java мог как-то:
System.err.println("I was built from git commit " + commitID);
(Очевидно, что реальный код может помещать это в HTTP-заголовок, регистрировать его при запуске или что-то еще, что не важно сейчас)
Мы используем Ant для сборки (по крайней мере для производственных сборок, кажется, что некоторые программисты выполняют свои тесты изнутри Eclipse, о которых я знаю даже меньше).
Есть ли канонический способ получить идентификатор фиксации для текущей проверки git в нашей Java во время сборки? Если нет, могут ли люди, использующие Ant для сборки, предлагать, как они это сделают, и мы увидим, появляется ли каноническое решение? Я уверен, что могу полностью придумать что-то из цельной ткани, но это похоже на многоразовый блок, поэтому я бы предпочел не делать этого.
Ответы
Ответ 1
Я не знаю, есть ли какая-либо задача Ant для git (я искал немного без ошибок), в любом случае Ant может обновить файл свойств с помощью параметра Piotr (git rev-parse HEAD
), а затем во время выполнения используйте эти свойства, чтобы получить номер версии. Это чище и IDE дружелюбно, чем Ant генерирует .java файл.
Ответ 2
Вы можете получить последнюю фиксацию SHA с помощью
git rev-parse HEAD
но, как правило, гораздо полезнее использовать
git describe
который даст вам что-то похожее на это:
v0.7.0-185-g83e38c7
Это работает, если у вас есть теги - он расскажет вам, сколько из последнего действительного тега совершает ваш текущий чек, плюс частичный SHA для этого фиксации, поэтому вы можете использовать его для последующего выведения заказа. Вы можете использовать этот идентификатор так же, как SHA в большинстве случаев, но он гораздо читательнее.
Ответ 3
Я написал задачу Ant для получения номера сборки с использованием JGit API (без приложения командной строки git), см. Jgit-buildnumber-ant-task. Затем вы можете сохранить этот номер сборки в файле MANIFEST.MF и получить его из пути к классам во время выполнения.
Ответ 4
git rev-parse HEAD
напечатает то, что вы, вероятно, захотите (например, идентификатор HEAD
commit).
Вы можете сделать ant генерировать простой класс Java с этим id как статической константой.
Ответ 5
Во-первых, вы можете использовать ident
gitattribute с ключевым словом $Id$
(хотя это, вероятно, не то, что вы хотите; является хешем содержимого файла и не имеет ничего общего с текущей версией проекта).
Во-вторых, вы можете сделать это так, как это делает ядро Linux и Git: в Makefile (в вашем случае: в файле Ant) есть правило, которое заменяет некоторый заполнитель, обычно '@@VERSION @@' (но в случае Perl это "++ VERSION ++" ) по результату GIT-VERSION-GEN, который, в свою очередь, использует " git описать" . Но для этого вам нужно пометить свои релизы (используя аннотированные/подписанные теги).
Ответ 6
Если это помогает кому-то еще. Я знаю, что ваш ANT
Для сборки MAVEN вы, вероятно, можете использовать git-commit-id-plugin в вашем файле pom.xml
<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>
Пожалуйста, пройдите:
1. http://www.baeldung.com/spring-git-information &
2. https://github.com/ktoso/maven-git-commit-id-plugin для получения дополнительной информации.