Hibernate-reactive: les tests ont cessé de fonctionner sur le bureau Docker

Créé le 4 oct. 2020  ·  23Commentaires  ·  Source: hibernate/hibernate-reactive

Je n'ai aucune idée de ce qui se passe ici, mais cela semble avoir coïncidé avec la mise à jour du bureau Docker sur Mac vers la dernière version :

Gradle Test Executor 2 > org.hibernate.reactive.FilterTest > testFilterCollectionFetch FAILED
    org.testcontainers.containers.ContainerLaunchException: Container startup failed
        at org.testcontainers.containers.GenericContainer.doStart(GenericContainer.java:330)
        at org.testcontainers.containers.GenericContainer.start(GenericContainer.java:311)
        at org.hibernate.reactive.containers.PostgreSQLDatabase.getJdbcUrl(PostgreSQLDatabase.java:39)
        at org.hibernate.reactive.containers.DatabaseConfiguration.getJdbcUrl(DatabaseConfiguration.java:78)
        at org.hibernate.reactive.BaseReactiveTest.constructConfiguration(BaseReactiveTest.java:88)
        at org.hibernate.reactive.FilterTest.constructConfiguration(FilterTest.java:26)

        Caused by:
        org.testcontainers.containers.ContainerFetchException: Can't get Docker image: RemoteDockerImage(imageName=postgres:13.0, imagePullPolicy=DefaultPullPolicy())
            at org.testcontainers.containers.GenericContainer.getDockerImageName(GenericContainer.java:1279)
            at org.testcontainers.containers.GenericContainer.logger(GenericContainer.java:613)
            at org.testcontainers.containers.GenericContainer.doStart(GenericContainer.java:320)
            ... 5 more

            Caused by:
            java.lang.IllegalStateException: Can not connect to Ryuk at localhost:32768
                at org.testcontainers.utility.ResourceReaper.start(ResourceReaper.java:176)
                at org.testcontainers.DockerClientFactory.client(DockerClientFactory.java:168)
                at org.testcontainers.LazyDockerClient.getDockerClient(LazyDockerClient.java:14)
                at org.testcontainers.LazyDockerClient.listImagesCmd(LazyDockerClient.java:12)
                at org.testcontainers.images.LocalImagesCache.maybeInitCache(LocalImagesCache.java:68)
                at org.testcontainers.images.LocalImagesCache.get(LocalImagesCache.java:32)
                at org.testcontainers.images.AbstractImagePullPolicy.shouldPull(AbstractImagePullPolicy.java:18)
                at org.testcontainers.images.RemoteDockerImage.resolve(RemoteDockerImage.java:59)
                at org.testcontainers.images.RemoteDockerImage.resolve(RemoteDockerImage.java:26)
                at org.testcontainers.utility.LazyFuture.getResolvedValue(LazyFuture.java:20)
                at org.testcontainers.utility.LazyFuture.get(LazyFuture.java:27)
                at org.testcontainers.containers.GenericContainer.getDockerImageName(GenericContainer.java:1277)
                ... 7 more

    java.lang.NullPointerException
        at org.hibernate.reactive.BaseReactiveTest.after(BaseReactiveTest.java:156)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at io.vertx.ext.unit.junit.VertxUnitRunner.invokeTestMethod(VertxUnitRunner.java:95)
        at io.vertx.ext.unit.junit.VertxUnitRunner.lambda$invokeExplosively$0(VertxUnitRunner.java:114)
        at io.vertx.ext.unit.impl.TestContextImpl.run(TestContextImpl.java:90)
        at io.vertx.ext.unit.junit.VertxUnitRunner.invokeExplosively(VertxUnitRunner.java:130)
        at io.vertx.ext.unit.junit.VertxUnitRunner.access$000(VertxUnitRunner.java:39)
        at io.vertx.ext.unit.junit.VertxUnitRunner$3.evaluate(VertxUnitRunner.java:217)
        at io.vertx.ext.unit.junit.Timeout$1.evaluate(Timeout.java:45)
        at org.junit.rules.RunRules.evaluate(RunRules.java:20)
        at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
        at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
        at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
        at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
        at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
        at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
        at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
        at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
        at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
        at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.runTestClass(JUnitTestClassExecutor.java:110)
        at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.execute(JUnitTestClassExecutor.java:58)
        at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.execute(JUnitTestClassExecutor.java:38)
        at org.gradle.api.internal.tasks.testing.junit.AbstractJUnitTestClassProcessor.processTestClass(AbstractJUnitTestClassProcessor.java:62)
        at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.processTestClass(SuiteTestClassProcessor.java:51)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36)
        at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
        at org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:33)
        at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:94)
        at com.sun.proxy.$Proxy2.processTestClass(Unknown Source)
        at org.gradle.api.internal.tasks.testing.worker.TestWorker.processTestClass(TestWorker.java:119)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36)
        at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
        at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:182)
        at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:164)
        at org.gradle.internal.remote.internal.hub.MessageHub$Handler.run(MessageHub.java:414)
        at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
        at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:56)
        at java.lang.Thread.run(Thread.java:748)

Des idées @Sanne , @DavideD ?

bug testing

Commentaire le plus utile

Le passage à testcontainers 1.15.0-rc2 semble l'avoir corrigé pour moi.

Tous les 23 commentaires

Qu'est-ce qu'un Ryuk et pourquoi devrait-il fonctionner sur localhost:32768 ?

PosgreSQL a récemment publié la version 13, j'ai donc reconfiguré nos images de test pour utiliser l'image postgres:13.0 . On dirait que vous n'arrivez pas à le télécharger ?

Bizarre, ce n'est censé être pas différent de la récupération des versions précédentes.

PosgreSQL a récemment publié la version 13, j'ai donc reconfiguré nos images de test pour utiliser l'image postgres:13.0 . On dirait que vous n'arrivez pas à le télécharger ?

Je pense - mais je ne suis pas sûr - que je l'avais déjà fait fonctionner sur Postgres 13 jusqu'à ce que je mette à jour Docker.

La première fois que j'entends parler de Ryuk .. d'après les quelques références doc que j'ai trouvées, il semble qu'un serveur local facultatif soit censé démarrer ?
Il est responsable de la récupération des images au nom des Testcontainers - donc ne pas avoir de nouveau conteneur (comme postgresql 13) déclencherait cela.

Semble un bogue dans Testcontainers.

Vous pourrez peut-être le contourner en téléchargeant le conteneur une fois manuellement ?

essayer

docker run --rm -it --name HibernateTestingPGSQL \
    -e POSTGRES_USER=hreact -e POSTGRES_PASSWORD=hreact -e POSTGRES_DB=hreact \
    -p 5432:5432 postgres:13.0

Le passage à testcontainers 1.15.0-rc2 semble l'avoir corrigé pour moi.

Alternativement : https://www.testcontainers.org/features/configuration/#disabling-ryuk

Ouais, ça a marché.

Existe-t-il un bon moyen de définir une variable d'environnement à partir du script gradle ?

Apparemment:

test {
    environment "TESTCONTAINERS_RYUK_DISABLED", "true"

c'est vrai, ça devrait le faire.

BTW s'il vous plaît maintenez enfoncé pendant quelques minutes :) la libération est en cours d'exécution

Relâchement terminé.. Je vais faire les mises à jour Quarkus maintenant.

Relâchement terminé.. Je vais faire les mises à jour Quarkus maintenant.

Excellent!

Est-ce toujours un problème ?

Je crois que le bogue est toujours là, mais les seules personnes qui vont en faire l'expérience sont des personnes qui n'ont pas déjà la chose récupérée sur leur machine locale.

Je me demande donc si cela est dû à la nécessité de mettre à niveau la base de données de test lors de la migration de Postgres 12 vers 13 ?

Vous voyez, j'ai défini testcontainers.reuse.enable=true , ce qui réutilise peut-être la base de données entre les tests ?

Je ne crois pas que nous ayons strictement besoin de cette mise à niveau vers PostgreSQL 13 ?

AFAIR lorsque je l'ai mis à niveau, je n'ai pas eu besoin d'apporter de modifications connexes, donc je m'attendrais à ce que tout fonctionne bien sur 12 également - à moins qu'une régression n'ait été incluse entre-temps, mais cela semble moins probable que d'avoir des problèmes avec docker/ conteneurs de test.

Essayez peut-être de rétablir la configuration à 12 et voyez?

Je vis à nouveau ça :-(

Vous voyez, j'ai défini testcontainers.reuse.enable=true , ce qui réutilise peut-être la base de données entre les tests ?

Je l'ai mis sur false et cela n'a pas résolu le problème.

environment "TESTCONTAINERS_RYUK_DISABLED", "true"

Cela l'a à nouveau corrigé.

@Sanne Pensez-vous que je devrais appliquer ce changement au script gradle?

Oui bien sûr pourquoi pas. Cela semble être une nouvelle fonctionnalité, et nous avons été heureux jusqu'à présent sans elle.

Il est responsable de la récupération des images au nom des Testcontainers - donc ne pas avoir de nouveau conteneur (comme postgresql 13) déclencherait cela.

Il est en fait responsable de l'arrêt des conteneurs après l'exécution des tests. Si vous tuez la JVM, les hooks d'arrêt ne seront pas exécutés et les conteneurs continueront à s'exécuter, créant des conteneurs suspendus.
La variable d'environnement est là pour les systèmes CI où Ryuk ne peut pas être utilisé (par exemple BitBucket Pipelines) mais ils garantissent le nettoyage eux-mêmes.

tl;dr : ne désactive pas Ryuk ;)

Si vous tuez la JVM, les hooks d'arrêt ne seront pas exécutés et les conteneurs continueront à s'exécuter, créant des conteneurs suspendus.

Eh bien, TBH, je cours toujours avec testcontainers.reuse.enable=true , donc je suppose que c'est ce qui se passe de toute façon.

Et, dans l'ensemble, les conteneurs suspendus sont moins pires que mes tests qui ne fonctionnent tout simplement pas. :-)

Mais bien sûr, si cela est corrigé dans la version 1.15 (qui vient de sortir il y a deux jours, je pense), alors c'est génial, et nous allons simplement mettre à niveau à la place.

Merci d'avoir expliqué ça @bsideup !

Cette page vous a été utile?
0 / 5 - 0 notes