Внедрение текущего идентификатора коммита 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". Но для того, чтобы это было полезно, вы должны отмечать свои выпуски (используя аннотированные / подписанные теги).

Другие вопросы по тегам