Получить последний измененный номер версии SVN с помощью buildnumber-maven-plugin
В настоящее время я разрабатываю архитектуру на основе микросервиса для своего приложения. У меня есть многомодульный проект maven, в котором есть много сервисов, поэтому я могу легко развернуть их в док-центре с помощью команды maven deploy, а также подключаемого модуля maven docker.
Тем не менее, теги изображений докера основаны на номере версии проекта, хотя я бы хотел, чтобы они были помечены последним измененным номером ревизии репозитория. В настоящее время я пытаюсь просто добавить это поле в качестве записи манифеста, используя buildnumber-maven-plugin:
Допустим, это мой многомодульный проект:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
...
<modules>
<module>module-a</module>
<module>module-b</module>
</modules>
...
</project>
И модель для модуля-а будет:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
...
<scm>
<connection>scm:svn:http://myrepo.com/svn/application/module-a</connection>
</scm>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>buildnumber-maven-plugin</artifactId>
<version>1.4</version>
<executions>
<execution>
<phase>validate</phase>
<goals>
<goal>create</goal>
</goals>
</execution>
</executions>
<configuration>
<doCheck>false</doCheck>
<doUpdate>true</doUpdate>
<useLastCommittedRevision>true</useLastCommittedRevision>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifestEntries>
<SCM-Revision>${buildNumber}</SCM-Revision>
</manifestEntries>
</archive>
</configuration>
</plugin>
....
</plugins>
</build>
<dependencies>
...
</dependencies>
</project>
Проблема в том, что {buildNumber} оценивает мой номер рабочей копии, который ссылается на последний коммит, сделанный в хранилище, а не на scm:svn:http://myrepo.com/svn/application/module-a
место нахождения. Чтобы объяснить это лучше, когда я отображаю свойства module-a от черепахи, я получаю это:
Я хочу получить 3248, которое относится к последнему реальному изменению, внесенному в модуль-а, вместо 3257 (рабочая копия), что я и получаю из плагина. Таким образом, подключаемый модуль докера будет знать, является ли это другим тегом изображения, и отправит его только в том случае, если будут внесены изменения в модуль в репозитории.
3 ответа
Я не мог заставить buildnumber-maven-plugin работать для этого же сценария. <useLastCommittedRevision>
не работает в v1.4 и в v1.3 не возвращает последнюю измененную ревизию, но предпоследнюю в некоторых ситуациях.
Есть хитрый обходной путь, который вы можете сделать, чтобы получить последний измененный номер ревизии от svn info
вывод команды. Два варианта в зависимости от вашей версии SVN:
Для SVN v1.9 или новее используйте maven-antrun-plugin для запуска
svn info --show-item=last-changed-revision
и сохранить вывод в свойство.<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-antrun-plugin</artifactId> <version>1.8</version> <executions> <execution> <phase>validate</phase> <goals> <goal>run</goal> </goals> <configuration> <exportAntProperties>true</exportAntProperties> <target> <exec executable="svn" outputProperty="svn.info"> <arg value="info"/> <arg value="--show-item=last-changed-revision"/> </exec> </target> </configuration> </execution> </executions> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <configuration> <archive> <manifestEntries> <SCM-Revision>${svn.info}</SCM-Revision> </manifestEntries> </archive> </configuration> </plugin>
Для версий SVN старше v1.9 (в моем случае v1.8.13) вы можете использовать maven-antrun-plugin для запуска
svn info --xml
и сохраните вывод в свойстве, и build-helper-maven-plugin для анализа содержимого этого свойства с помощью регулярного выражения, сопоставления последнего измененного номера ревизии и сохранения его во втором свойстве.Я решил добавить параметр --xml, потому что основной
svn info
вывод переводится в зависимости от языка установки, но формат вывода xml всегда одинаков.<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-antrun-plugin</artifactId> <version>1.8</version> <executions> <execution> <phase>validate</phase> <goals> <goal>run</goal> </goals> <configuration> <exportAntProperties>true</exportAntProperties> <target> <exec executable="svn" outputProperty="svn.info"> <arg value="info"/> <arg value="--xml"/> </exec> </target> </configuration> </execution> </executions> </plugin> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>build-helper-maven-plugin</artifactId> <version>3.0.0</version> <executions> <execution> <id>regex-svn-last-rev</id> <goals> <goal>regex-property</goal> </goals> <configuration> <!-- Output property --> <name>svn.last.rev</name> <value>${svn.info}</value> <regex>^[\s\S]*?commit[\s\S]*?revision=\"(\d+?)\"[\s\S]*?$</regex> <replacement>$1</replacement> <failIfNoMatch>false</failIfNoMatch> </configuration> </execution> </executions> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <configuration> <archive> <manifestEntries> <SCM-Revision>${svn.last.rev}</SCM-Revision> </manifestEntries> </archive> </configuration> </plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>buildnumber-maven-plugin</artifactId>
<version>1.3</version>
<executions>
<execution>
<phase>validate</phase>
<goals>
<goal>create</goal>
</goals>
</execution>
</executions>
<configuration>
<doCheck>false</doCheck>
<doUpdate>true</doUpdate>
<useLastCommittedRevision>true</useLastCommittedRevision>
</configuration>
</plugin>
Это сработало для меня.
Я думаю, что единственное, что вы пропустили здесь,
<doCheck>false</doCheck>
Я думаю, что это должно быть true
,
Наткнувшись на эту проблему, я почувствовал себя обязанным разобраться в ней: кажется, это довольно старая проблема в самом плагине buildnumber-maven-plugin: реализовать "Last Changed Rev" вместо поля "Revision"
Исправление было фактически внесено, но с тех пор не было выпущено ни одной новой версии.
Самый простой вариант - это проверить / загрузить код и собрать его локально, обязательно поместив его в центральный репозиторий вашей организации.
Если это не вариант, попробуйте jitpack, чтобы получить последнюю версию напрямую в виде зависимости от maven: могу ли я использовать проект GitHub непосредственно в Maven?=> /questions/11810074/mogu-li-ya-ispolzovat-proekt-github-neposredstvenno-v-maven/11810082#11810082
...
<repositories>
<repository>
<id>jitpack.io</id>
<url>https://jitpack.io</url>
</repository>
</repositories>
...
<dependency>
<groupId>com.github.mojohaus</groupId>
<artifactId>buildnumber-maven-plugin</artifactId>
<version>e74e373</version>
</dependency>
...
Это хорошо известная ошибка в maven-scm-provider-svnexe. Все еще не исправлено.