Получить последний измененный номер версии 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:

  1. Для 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>
    
  2. Для версий 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. Все еще не исправлено.

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