Дженкинс несколько сборок док-порта конфликты - PullRequest
0 голосов
/ 18 сентября 2018

У меня есть многомодульный проект Maven, и я получаю конфликты портов докера при одновременном выполнении нескольких сборок Jenkins.

Я использую плагин docker-maven-plugin в моем pom.xmlфайлы

Как я могу решить эту проблему?

<plugin>
    <groupId>io.fabric8</groupId>
    <artifactId>docker-maven-plugin</artifactId>
    <executions>
        <execution>
            <id>start</id>
            <phase>pre-integration-test</phase>
            <goals>
                <goal>stop</goal>
                <goal>build</goal>
                <goal>start</goal>
            </goals>
        </execution>
        <execution>
            <id>stop</id>
            <phase>post-integration-test</phase>
            <goals>
                <goal>stop</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <images>
            <image>
                <name>guest/guest-main:${project.version}</name>
                <alias>guest</alias>
                <run>
                    <env>
                        <myapp_ENDPOINT>http://mock:8081/mycalcService</myapp_ENDPOINT>
                    </env>
                    <namingStrategy>alias</namingStrategy>
                    <dependsOn>
                        <container>mock</container>
                    </dependsOn>
                    <links>
                        <link>mock:mock</link>
                    </links>
                    <ports>
                        <port>guest.port:8080</port>
                    </ports>
                    <wait>
                        <log>Started guestServiceApplication</log>
                        <time>60000</time>
                    </wait>
                </run>
            </image>
            <image>
                <alias>mock</alias>
                <name>guest/myapp-mock:${project.version}</name>
            </image>
        </images>
    </configuration>
</plugin>

С уважением

1 Ответ

0 голосов
/ 18 сентября 2018

Ваша конфигурация выставляет guest.port для порта 8080 вашей хост-системы Docker (например, Jenkins) со следующей строкой

<port>guest.port:8080</port>

Поскольку порт может быть привязан только к одному сервису одновременно, более поздняя сборка не сможет привязаться к этому порту.

Чтобы решить эту проблему, вы можете использовать разные порты для каждой сборки или подождать, пока один порт, который вы хотите использовать, будет освобожден другим заданием.

Например, вы можете добавить следующее в свой Jenkinsfile непосредственно перед выполнением mvn:

timeout(time: 10, unit: "MINUTES") {
    waitUntil {
        script {
            sh(script: 'netstat -lnpt 2>&1 | grep ":8080"', returnStatus: true) != 0
        }
    }
}
sh "mvn ..."

Шаг timeout заставляет Дженкинса отменяться через 10 минут.

Шаг waitUntil заставляет Дженкинса повторять script до тех пор, пока он не будет успешным.

A script необходим, так как мы делаем Caparison (!=) возвращаемого значения.

Наконец, netstat возвращает список связанных в данный момент портов, а grep вернет 0, только если порт 8080 является одним из них.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...