Сохраните вывод exec в <properties></properties> секцию pom.xml для использования в более поздней фазе maven - PullRequest
0 голосов
/ 27 марта 2019

У меня есть проект Java Maven, в котором docker build находится образ докера, а затем docker save образ как артефакт сборки с использованием плагина io.fabric8.docker-maven-plugin.

Когда я собираю образ докера,Я хотел бы получить размер и добавить его к метаданным, чтобы мы могли видеть, насколько велико изображение, прежде чем оно будет распаковано.

Плагин io.fabric8.docker-maven-plugin не имеет способа получить точный размер сгенерированного докера.image, поэтому в настоящее время я использую плагин org.codehaus.mojo.exec-maven-plugin для получения размера изображения следующим образом:

<plugin>
    <!-- generate metadata about docker image -->
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>exec-maven-plugin</artifactId>
    <version>1.1</version>
    <executions>
        <execution>
            <id>generate-docker-metadata</id>
            <phase>generate-resources</phase>
            <goals>
                <goal>exec</goal>
            </goals>
            <configuration>
                <executable>docker</executable>
                <commandlineArgs>image inspect ${project.docker.image}:${project.version} --format='{{.Size}}' >> ${project.basedir}/src/main/resources/META-INF/Docker-Image-Size</commandlineArgs>
                <workingDirectory>.</workingDirectory>
            </configuration>
        </execution>
    </executions>
</plugin>

В настоящее время я могу поместить вывод в файл Docker-Image-Size, но мне нужен способсделать его доступным как свойство, на которое можно ссылаться в разделе метаданных, который генерирует файл метаданных.

Как сохранить этот вывод exec в разделе <properties>/<properties> pom.xml файл для последующего использования на другом этапе?

Нужно ли использовать файл свойств или я могу просто сохранить его как ${docker.image.size}?

1 Ответ

0 голосов
/ 28 марта 2019

Я не могу напрямую редактировать любые свойства, которые уже существуют в разделе <properties>/<properties> pom.xml.

Однако , ответ, который я придумал, состоит в том, чтобы использовать плагин org.codehaus.gmaven.gmaven-plugin для запуска сценария оболочки, редактирования вывода и сохранения его в переменной, которую можно использовать позже в pom.xml файл. Обратите внимание, что его переменная фактически не определена нигде в файле, кроме как в разделе плагина org.codehaus.gmaven.gmaven-plugin.

( Помещение пустой переменной в секцию <properties>/<properties> pom.xml всегда делает переменную пустой. )

Я использовал плагин org.codehaus.gmaven.gmaven-plugin примерно так:

<plugin>
    <groupId>org.codehaus.gmaven</groupId>
    <artifactId>gmaven-plugin</artifactId>
    <version>1.4</version>
    <executions>
        <execution>
            <phase>generate-resources</phase>
            <goals>
                <goal>execute</goal>
            </goals>
            <configuration>
                <properties>
                    <script>docker image inspect ${project.docker.image}:${project.version} --format='{{.Size}}</script>
                </properties>
                <source>
                    def command = project.properties.script
                    def process = command.execute()
                    process.waitFor()

                    def text = process.in.text.trim()
                    // Remove single quotes that surround number output
                    def number = text.substring(1, text.length()-1);
                    project.properties.dockerImageSize = number
                </source>
            </configuration>
        </execution>
    </executions>
</plugin>

Секция метаданных затем использует переменную следующим образом:

<plugin>
    <groupId>org.apache.felix</groupId>
    <artifactId>maven-bundle-plugin</artifactId>
    <version>2.4.0</version>
    <extensions>true</extensions>
    <executions>
        <execution>
            <id>bundle-manifest</id>
                <phase>process-classes</phase>
                <goals>
                    <goal>manifest</goal>
                </goals>
        </execution>
    </executions>
    <configuration>
        <instructions>
            <Bundle-Category>Thing</Bundle-Category>
            <Bundle-Activator>com.company.thing.impl.Activator</Bundle-Activator>
            <Bundle-Vendor>${company.vendor}</Bundle-Vendor>
            <Bundle-ContactAddress>${company.contactAddress}</Bundle-ContactAddress>
            <Bundle-Copyright>${company.copyright}</Bundle-Copyright>
            <Bundle-LicenseType>${company.licenseType}</Bundle-LicenseType>
            <Bundle-Description>${company.description}</Bundle-Description>
            <Bundle-DockerImageSize>${dockerImageSize}</Bundle-DockerImageSize>
            <Import-Package>
                com.company.thing.api*;version="[0.0.10,1.0.0)",
                *
            </Import-Package>
        </instructions>
    </configuration>
</plugin>
...