2017-08-27 1 views
2

Ich entwickle Spring Data JPA-Projekt, das eine MySQL-Datenbank richtet, und ich mag, End-to-End-Integrationstests von Maven laufen.Pass Portnummer von Docker-Maven-Plugin Federeigenschaft

Bis jetzt habe ich io.fabric8.docker-maven-plugin konfiguriert, um einen MySQL-Container während pre-integration-test Phase hochzufahren. Es wird einen zufällig verfügbaren Port verwenden, den ich an meine application.properties Datei übergeben muss.

Ich habe Automatic property expansion using Maven versucht, aber ich vermute, dass die mysql.port Maven Eigenschaft wird nur nach die Federeigenschaften werden immer aktualisiert gelöst zu werden.

pom.xml

<?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"> 
    <modelVersion>4.0.0</modelVersion> 

    <groupId>example</groupId> 
    <artifactId>pass-port-number-from-docker-maven-plugin-to-spring-property</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 
    <packaging>jar</packaging> 

    <parent> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-parent</artifactId> 
     <version>1.5.6.RELEASE</version> 
     <relativePath/> <!-- lookup parent from repository --> 
    </parent> 

    <properties> 
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
     <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> 
     <java.version>1.8</java.version> 
    </properties> 

    <dependencies> 

     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-data-jpa</artifactId> 
     </dependency> 

     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-devtools</artifactId> 
      <scope>runtime</scope> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-test</artifactId> 
      <scope>test</scope> 
     </dependency> 

     <!-- other jpa dependencies ... --> 

    </dependencies> 

    <build> 

     <resources> 
      <resource> 
       <directory>src/main/resources</directory> 
       <filtering>true</filtering> 
      </resource> 
     </resources> 

     <plugins> 

      <plugin> 
       <groupId>org.springframework.boot</groupId> 
       <artifactId>spring-boot-maven-plugin</artifactId> 
      </plugin> 

      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-failsafe-plugin</artifactId> 
       <executions> 
       <execution> 
        <goals> 
        <goal>integration-test</goal> 
        <goal>verify</goal> 
        </goals> 
       </execution> 
       </executions> 
      </plugin> 

     </plugins> 
    </build> 

    <profiles> 
     <profile> 
      <id>docker-test</id> 
      <properties> 
       <docker-maven.version>0.21.0</docker-maven.version> 
      </properties> 
      <build> 
       <resources> 
        <resource> 
         <directory>src/main/resources</directory> 
         <filtering>true</filtering> 
        </resource> 
       </resources> 
       <plugins> 

        <plugin> 
         <groupId>org.codehaus.mojo</groupId> 
         <artifactId>build-helper-maven-plugin</artifactId> 
         <version>3.0.0</version> 
         <executions> 
         <execution> 
          <id>reserve-network-port</id> 
          <goals> 
          <goal>reserve-network-port</goal> 
          </goals> 
          <phase>process-resources</phase> 
          <configuration> 
          <portNames> 
           <portName>mysql.port</portName> 
          </portNames> 
          </configuration> 
         </execution> 
         </executions> 
        </plugin> 

        <plugin> 
        <groupId>io.fabric8</groupId> 
        <artifactId>docker-maven-plugin</artifactId> 
        <version>${docker-maven.version}</version> 

        <configuration> 
         <images> 
          <image> 
          <alias>mysql</alias> 
          <name>mysql:5.7</name> 
          <run> 
           <env> 
            <MYSQL_ROOT_PASSWORD>my-secret-pw</MYSQL_ROOT_PASSWORD> 
           </env> 
           <ports> 
            <port>mysql.port:3306</port> 
           </ports> 
           <wait> 
            <log>ready for connections</log> 
            <!-- <time>20000</time> --> 
           </wait> 
           <log> 
            <prefix>mysql</prefix> 
            <date>ISO8601</date> 
            <color>blue</color> 
           </log> 
          </run> 
          </image> 
         </images> 
        </configuration> 

        <!-- Connect start/stop to pre- and 
         post-integration-test phase, respectively if you want to start 
         your docker containers during integration tests --> 
        <executions> 
         <execution> 
         <id>start</id> 
         <phase>pre-integration-test</phase> 
         <goals> 
          <goal>start</goal> 
         </goals> 
         </execution> 
         <execution> 
         <id>stop</id> 
         <phase>post-integration-test</phase> 
         <goals> 
          <goal>stop</goal> 
         </goals> 
         </execution> 
        </executions> 
        </plugin> 
       </plugins> 
      </build> 
     </profile> 
    </profiles> 

</project> 

application.properties

mysql.port = @[email protected] 

Als ich betreibe meine Test ich einen Verbindungsfehler zu erhalten, und wenn ich target/classes/application.properties inspizieren ich sehe, dass @[email protected] nicht aktualisiert wurde.

Alle Vorschläge würden sehr geschätzt werden.

+0

Wenn Sie den Link überprüfen, den Sie angegeben haben. Sie müssen eine Konfiguration hinzufügen, um '@' als Trennzeichen zu verwenden, das Sie in Ihrem Beispiel nicht konfiguriert haben ... – khmarbaise

Antwort

0

@nur funktioniert, wenn Sie von spring-boot-starter-parent verlängern; Sie haben die relevanten Teile Ihrer pom.xml nicht angezeigt. Angenommen, Sie tun, versuchen reserve-network-port zu process-sources Phase Anbringen vorprocess-resources. Es ist sehr gut möglich, dass, wenn Maven die Ressourcen kopiert, der reserve-network-port noch nicht gelaufen ist.

Was passiert, wenn Sie 3306 in application.properties codieren?

+0

Danke, der 'reserve-network-port' in die' process-sources'-Phase zu verschieben, hat den Trick gemacht. –