0

We are switching from maven to gradle. In maven we are starting the Spring Boot server in "pre-integration-test" phase with the use of the spring-boot-mvane-plugin as documented here https://docs.spring.io/spring-boot/docs/current/maven-plugin/usage.html

   <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <executable>true</executable>
            </configuration>
            <executions>
                <execution>
                    <id>pre-integration-test</id>
                    <goals>
                        <goal>start</goal>
                    </goals>
                </execution>
                <execution>
                    <id>post-integration-test</id>
                    <goals>
                        <goal>stop</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
        <plugin>
            <groupId>com.github.eirslett</groupId>
            <artifactId>frontend-maven-plugin</artifactId>
            <executions>
                <execution>
                    <id>run e2e tests</id>
                    <phase>integration-test</phase>
                    <goals>
                        <goal>npm</goal>
                    </goals>
                    <configuration>
                        <arguments>run verify</arguments>
                    </configuration>
                </execution>
            </executions>
        </plugin>

I didn't find a way to fork a process in gradle. The gradle Spring Boot Plugin doesn't help either.

How can I achieve this in gradle?

Janning Vygen
  • 8,877
  • 9
  • 71
  • 102

1 Answers1

0

I got it work with gradle-spawn-plugin, but it looks very complicated to me

backend/build.gradle

plugins {
    id "com.wiredforcode.spawn" version "0.8.2"
}
task startServer(type: SpawnProcessTask, dependsOn: 'bootJar') {
    command "java -jar ${projectDir}/build/libs/project-${version}.jar --spring.profiles.active=integration"
    ready 'Started'
}
task stopServer(type: KillProcessTask)

frontend/build.gradle

task verify(dependsOn: ':backend:startServer', type: NpmTask) {
    // Copy from 'dist'
    inputs.files(fileTree('tests/e2e'))
    dependsOn 'npmBuild'
    args = ['run', 'verify']
}
check.dependsOn verify
verify.finalizedBy ':backend:stopServer'

But pay attention to some quirks: If you are logging to the console you get some problems. First everything looks fine. But after some minutes of testing the logging does not work anymore.

Many threads are blocked like this:

"http-nio-127.0.0.1-8082-exec-2" #27 daemon prio=5 os_prio=0 cpu=462,00ms elapsed=531,88s tid=0x00007f1442a32000 nid=0x76d5 waiting on condition  [0x00007f136f021000]
   java.lang.Thread.State: WAITING (parking)
        at jdk.internal.misc.Unsafe.park(java.base@11.0.7/Native Method)
        - parking to wait for  <0x0000000454d81218> (a java.util.concurrent.locks.ReentrantLock$NonfairSync)
        at java.util.concurrent.locks.LockSupport.park(java.base@11.0.7/LockSupport.java:194)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(java.base@11.0.7/AbstractQueuedSynchronizer.java:885)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireQueued(java.base@11.0.7/AbstractQueuedSynchronizer.java:917)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(java.base@11.0.7/AbstractQueuedSynchronizer.java:1240)
        at java.util.concurrent.locks.ReentrantLock.lock(java.base@11.0.7/ReentrantLock.java:267)
        at ch.qos.logback.core.OutputStreamAppender.writeBytes(OutputStreamAppender.java:197)
        at ch.qos.logback.core.OutputStreamAppender.subAppend(OutputStreamAppender.java:231)
        at ch.qos.logback.core.OutputStreamAppender.append(OutputStreamAppender.java:102)
        at ch.qos.logback.core.UnsynchronizedAppenderBase.doAppend(UnsynchronizedAppenderBase.java:84)
        at ch.qos.logback.core.spi.AppenderAttachableImpl.appendLoopOnAppenders(AppenderAttachableImpl.java:51)
        at ch.qos.logback.classic.Logger.appendLoopOnAppenders(Logger.java:270)
        at ch.qos.logback.classic.Logger.callAppenders(Logger.java:257)
        at ch.qos.logback.classic.Logger.buildLoggingEventAndAppend(Logger.java:421)
        at ch.qos.logback.classic.Logger.filterAndLog_0_Or3Plus(Logger.java:383)
        at ch.qos.logback.classic.Logger.info(Logger.java:579)

I don't know exactly why but it seems to me that gradle-spawn-plugin is something doing with STDOUT. Maybe because of searching for the "ready" string. And as we do not log to console in production it is best not to do it when integration testing. So I disabled logging to console and everything works fine again.

Janning Vygen
  • 8,877
  • 9
  • 71
  • 102