Skip to content

Fix stop-app using a PID file instead of Actuator or JMX#15698

Open
jamesfredley wants to merge 13 commits into
7.0.xfrom
fix/stop-app-cli
Open

Fix stop-app using a PID file instead of Actuator or JMX#15698
jamesfredley wants to merge 13 commits into
7.0.xfrom
fix/stop-app-cli

Conversation

@jamesfredley

@jamesfredley jamesfredley commented May 29, 2026

Copy link
Copy Markdown
Contributor

Fixes #13695

Problem

stop-app no longer works reliably on modern Grails setups. The old command tried to stop an app through JMX or the Spring Boot Actuator shutdown endpoint:

  • JMX depends on attach/management-agent behavior that is not reliable on current JDKs.
  • Actuator shutdown is disabled by default and should not need to be enabled just so a development CLI command can stop run-app.

The failed user-facing result is that grails stop-app can report Application not running while a run-app process is still active.

What this PR now does

This PR makes run-app and stop-app share a project-local PID file contract:

  1. bootRun is configured by the Grails Gradle plugin to set cli.pid.file to <build>/run-app.pid by default.
  2. run-app still passes an explicit grails.cli.pid.file value so the CLI and forked app agree on the same PID file path.
  3. GrailsApp.run() registers Spring Boot's ApplicationPidFileWriter only when cli.pid.file is present.
  4. stop-app reads that PID file and stops the process with ProcessHandle.destroy(), falling back to destroyForcibly() if it does not exit within the timeout.

Because the handoff is on disk, stop-app works when the app is forked by Gradle bootRun and when grails stop-app is run from a different CLI invocation or terminal.

Safety and compatibility

  • The PID helper rejects missing, malformed, non-positive, stale, and likely recycled PIDs.
  • A run-app.stopping marker lets a foreground run-app report a deliberate stop as Application stopped instead of as a startup failure.
  • run-app clears stale stop markers before startup and refuses to start a second app when one is already running for the project.
  • stop-app --host and stop-app --port are retained as declared options but now fail fast with a clear unsupported-options message before any PID or run-app state is touched.
  • Normal deployed applications are unaffected because cli.pid.file is only used when supplied by the CLI/Gradle development path.

Main changes

  • Replaced the old JMX/Actuator stop path with RunningApplicationProcess in grails-shell-cli.
  • Added ApplicationPidFileWriter registration in GrailsApp.run() when cli.pid.file is present.
  • Added bootRun PID-file setup in GrailsGradlePlugin using project.layout.buildDirectory.file('run-app.pid'), while preserving an explicit CLI-supplied path.
  • Updated run-app and stop-app scripts for the PID-file lifecycle.
  • Simplified stop-app docs to describe user-facing behavior and removed internal implementation explanation.

Verification

  • ./gradlew :grails-gradle-plugins:test --tests org.grails.gradle.plugin.core.GrailsGradlePluginToolchainSpec
  • ./gradlew :grails-shell-cli:test --tests org.grails.cli.gradle.RunningApplicationProcessSpec
  • ./gradlew :grails-profiles-base:compileProfile
  • Manual Groovy driver: stopped a real sleep process through RunningApplicationProcess.stop() and handled a malformed PID file as NOT_RUNNING.

The base profile stop-app command relied on JMX (via
com.sun.tools.attach.VirtualMachine and the management-agent.jar that was
removed in Java 9+) with an HTTP fallback to the Spring Boot Actuator
/actuator/shutdown endpoint. The JMX path is broken on modern JDKs and the
Actuator endpoint is disabled by default, so stop-app failed with a
FileNotFoundException against /actuator/shutdown even though the application
was running.

In the interactive shell, run-app starts the application as an asynchronous
Gradle bootRun build whose cancellation token was only reachable through the
run-app command's ExecutionContext. This adds a RunningApplicationRegistry
that tracks the running build's CancellationTokenSource so that stop-app can
cancel it directly - the same mechanism CTRL-C already uses - without
shutting down the CLI.

- Add RunningApplicationRegistry to track running bootRun builds.
- GradleUtil.wireCancellationSupport now returns the token source (created
  via the public GradleConnector.newCancellationTokenSource() instead of the
  internal DefaultCancellationTokenSource) and a new runBuildWithConsoleOutput
  overload registers and deregisters it.
- GradleInvoker tracks only the bootRun task for stop support.
- Rewrite stop-app to cancel the running build via the registry and wait for
  it to stop; remove the obsolete port/host flags.
- run-app no longer enables the Actuator shutdown endpoint and its shutdown
  hook cancels via the registry directly.
- Update the reference and getting-started docs.

Fixes #13695

Assisted-by: opencode:claude-opus-4-8
@jamesfredley jamesfredley marked this pull request as ready for review May 29, 2026 04:34
Copilot AI review requested due to automatic review settings May 29, 2026 04:34

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Fixes a long-broken stop-app in the interactive Grails CLI by replacing the JMX-attach and Spring Boot Actuator /actuator/shutdown HTTP fallback (both of which fail on modern JDKs/default configurations) with a CLI-only registry that lets stop-app cancel the running bootRun Gradle Tooling API build directly via its CancellationTokenSource.

Changes:

  • New RunningApplicationRegistry tracks running bootRun cancellation tokens; stop-app.groovy is rewritten to cancel via the registry and awaitStop, dropping the JMX/HTTP shutdown code and the port/host flags.
  • GradleUtil.wireCancellationSupport now uses the public GradleConnector.newCancellationTokenSource() and returns the token; a new runBuildWithConsoleOutput(context, trackForStop, closure) overload registers/deregisters tokens around the build.
  • GradleInvoker opts only the bootRun/:bootRun task into tracking; run-app.groovy drops -Dgrails.management.endpoints.shutdown.enabled=true and the shutdown hook calls RunningApplicationRegistry.stopAll(); reference and getting-started docs updated to match the new flow.

Reviewed changes

Copilot reviewed 8 out of 8 changed files in this pull request and generated 2 comments.

Show a summary per file
File Description
grails-shell-cli/src/main/groovy/org/grails/cli/gradle/RunningApplicationRegistry.groovy New registry of running app cancellation token sources with stop/await operations.
grails-shell-cli/src/test/groovy/org/grails/cli/gradle/RunningApplicationRegistrySpec.groovy Spock spec covering register/deregister, stopAll, throw resilience, and awaitStop success/timeout.
grails-shell-cli/src/main/groovy/org/grails/cli/gradle/GradleUtil.groovy Switches to public newCancellationTokenSource(), returns the token, and adds a trackForStop overload that registers/deregisters around the build.
grails-shell-cli/src/main/groovy/org/grails/cli/gradle/GradleInvoker.groovy Enables stop tracking only for bootRun/:bootRun invocations.
grails-profiles/base/commands/stop-app.groovy Rewritten to cancel via the registry and await shutdown; removes JMX and Actuator HTTP fallback and port/host flags.
grails-profiles/base/commands/run-app.groovy Drops Actuator shutdown system property; shutdown hook now calls RunningApplicationRegistry.stopAll() directly.
grails-doc/src/en/ref/Command Line/stop-app.adoc Documents the new CLI-only, same-session shutdown semantics and removes obsolete arguments.
grails-doc/src/en/guide/gettingStarted/runningAndDebuggingAnApplication.adoc Updates the example output to match the new status messages.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

- awaitStop now waits on a monitor that deregister() notifies, instead of
  polling every 100ms. The stop-app command reacts immediately when the
  cancelled build finishes and the timeout handling is more deterministic.
- stopAll no longer silently swallows a failed cancel(); the failure is
  logged via GrailsConsole.verbose so it is visible during diagnosis.

Assisted-by: opencode:claude-opus-4-8
@jamesfredley jamesfredley self-assigned this May 29, 2026
@jamesfredley jamesfredley moved this to In Progress in Apache Grails May 29, 2026
@jamesfredley jamesfredley added this to the grails:7.0.12 milestone May 29, 2026
mbean.shutdown()
console.addStatus "Application shutdown."
return true
if (org.grails.cli.gradle.RunningApplicationRegistry.stopAll()) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Doesn't this only worked for non-forked processes?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Correct - that was the core limitation. The previous version cancelled the in-memory Gradle build token, which only existed in the one CLI JVM, so it couldn't reach a forked app or an independent grails stop-app.

This is now fixed in a53817c: the forked bootRun app writes its own PID to build/run-app.pid (Spring Boot ApplicationPidFileWriter), and stop-app reads that file and stops the process with ProcessHandle.destroy() (graceful SIGTERM on Unix, best effort on Windows). Because the handoff is a file on disk, it works for forked processes and when stop-app is run from a different invocation/terminal than run-app. Details in the PR comment above.

@jdaugherty jdaugherty left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If the processes are forked or someone runs the grails command grails stop-app independently of the original run-app call, I don't see how this will work.

Why not just write the pid of the application in the RunApp gradle task and then check for that pid and call the OS equivalent of a graceful shutdown? i.e. on linux using kill -TERM <pid>

Replaces the in-memory RunningApplicationRegistry, which only worked within
a single CLI JVM session, with a PID file plus OS signal so that stop-app can
terminate an application started by run-app even when it was forked into a
separate process or when stop-app is run from a different grails invocation.

run-app now asks the forked bootRun application to write its PID via Spring
Boot's ApplicationPidFileWriter, gated by the cli.pid.file system property so
production runs are unaffected. stop-app reads build/run-app.pid and stops the
process with ProcessHandle.destroy() (a graceful SIGTERM on Unix-like systems;
best effort on Windows), guarding against stale and recycled PIDs, then removes
the file. A stop marker lets a foreground run-app report a clean shutdown rather
than a startup failure when its process is terminated, and an already-running
guard prevents a second run-app from orphaning a running application.

Assisted-by: claude-code:claude-4.8-opus
@jamesfredley

Copy link
Copy Markdown
Contributor Author

@jdaugherty thanks for the review - you were right, the in-memory registry only worked within a single CLI JVM, so it broke for forked processes and for an independent grails stop-app. I've reworked the PR to your suggestion: write the application PID during run-app and have stop-app signal that PID directly.

What changed (pushed in a53817c)

Writing the PID (run-app side)

  • The forked bootRun application writes its own PID via Spring Boot's ApplicationPidFileWriter to build/run-app.pid. It's registered in GrailsApp.run() only when the cli.pid.file system property is present, so normally deployed apps are unaffected.
  • run-app passes that path as -Dgrails.cli.pid.file=<abs path>; the grails. prefix is stripped by GrailsGradlePlugin when it forwards properties into the forked JVM (same mechanism already used for grails.server.port -> server.port), so no Gradle plugin change was needed.

Stopping by PID (stop-app side)

  • New RunningApplicationProcess helper reads build/run-app.pid and stops the process via ProcessHandle.of(pid).destroy() - i.e. a graceful SIGTERM on Unix-like systems (JVM shutdown hooks / Spring orderly shutdown run), falling back to destroyForcibly() if it doesn't exit within the timeout. On Windows there is no graceful signal equivalent, so termination there is best effort (documented).
  • Includes a stale/recycled-PID guard (compares the live process startInstant against the PID file mtime) so it never kills an unrelated process that happens to have reused the id.

Because the contract is a file on disk, this now works for the two cases you called out: forked processes and grails stop-app run independently of the original run-app (including from a different terminal).

Other details

  • A small run-app.stopping marker lets a foreground run-app (blocked on bootRun) report a clean "Application stopped" instead of a startup failure when its process is killed by SIGTERM (non-zero exit). It's cleared at the start of each run-app so it can't mask a genuine startup failure.
  • A guard prevents a second run-app from orphaning an already-running app.
  • Reverted the GradleUtil/GradleInvoker cancellation-token changes and removed RunningApplicationRegistry; the JMX/Actuator code stays gone.
  • New RunningApplicationProcessSpec (13 tests: missing/malformed/non-positive/stale PID, live-process stop, marker lifecycle) plus updated docs.

I kept kill -TERM-equivalent semantics exactly as you described. Let me know if you'd prefer the PID file somewhere other than build/, or a different policy for the Windows best-effort path.

@matrei matrei left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Got unexpected output from stop-app (see comment).


* `port` - Specifies the port which the Grails application is running on (defaults to 8080 for HTTP or 8443 for HTTPS)
* `host` - Specifies the host the Grails application is bound to
This is a CLI only mechanism: it does not require the Spring Boot Actuator shutdown endpoint to be enabled, nor does it rely on JMX.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think we need to explain this in the documentation.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agreed. I simplified the command reference so it now describes only the user-facing behavior: interactive/separate invocation usage, current-project run-app scope, unsupported host/port options, and the not-running result. The PID/Actuator/JMX implementation explanation is removed.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Tried it out and got this:

mattias@mr-p920:~/Projects/tmp/grails-core/grails-shell-cli/build/install/grails-shell-cli$ ./bin/grails-shell-cli create-app myapp
Resolving dependencies...
| Application created at /home/mattias/Projects/tmp/grails-core/grails-shell-cli/build/install/grails-shell-cli/myapp
mattias@mr-p920:~/Projects/tmp/grails-core/grails-shell-cli/build/install/grails-shell-cli$ cd myapp
| Resolving Dependencies. Please wait...

| Starting interactive mode...
| Enter a command name to run. Use TAB for completion:
grails> run-app
| Running application.....

>                                                                            <
>                            ____           _ _                              <
>                           / ___|_ __ __ _(_) |___                          <
>                          | |  _| '__/ _` | | / __|                         <
>                          | |_| | | | (_| | | \__ \                         <
>                           \____|_|  \__,_|_|_|___/                         <
>                          https://grails.apache.org                         <
>                                                                            <

Grails application running at http://localhost:8080 in environment: development
<=======<=======<===========--> 85% EXECUTING [26s]
> :bootRun
grails> stop-app
| Shutti<===========--> 85% EXECUTING [1m 39s]
| Error Application not running. (Use --stacktrace to see the full trace)

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for trying it. The failure path should be addressed now: bootRun itself now gets a default cli.pid.file under the Gradle build directory, and run-app still passes the explicit CLI path. That means the forked app writes the PID file stop-app reads, including from interactive mode and from a separate CLI invocation. I also added TestKit coverage for both the default bootRun PID path and the CLI override path.

@jamesfredley jamesfredley changed the title Fix stop-app in the interactive CLI without Actuator or JMX Fix stop-app using a PID file instead of Actuator or JMX Jun 4, 2026
@jdaugherty

Copy link
Copy Markdown
Contributor

I was expecting us to change the bootRun task configuration in the gradle plugin to write out pid files to the build directory via a doFirst { } (and if multiple are running, we could force a failure since it will fail with a port conflict anyhow). Then your stop app just reads that - Scott made a change to support running in different directories (usually work trees) so I think there's already a standardized way to access the build directory. I think the helper is BuildSettings or Settings.groovy.

@codeconsole

Copy link
Copy Markdown
Contributor

could just update the create app templates to have a config that turns the actuator on in development mode only. Last time I checked, jmx worked as well, but that was also an opt in. So I would say preferred approach would be traditional then pid fallback

jamesfredley and others added 3 commits June 10, 2026 16:59
Set a default cli.pid.file on bootRun tasks so applications launched through bootRun write the same build/run-app.pid file that stop-app reads. Preserve the CLI-supplied PID file path when run-app passes one explicitly.

Add TestKit coverage for the default bootRun PID path and the CLI override path.

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Assisted-by: opencode:gpt-5.5 oracle
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Keep the stop-app reference focused on user-facing behavior and remove implementation details about the PID file, Actuator, JMX, and platform-specific shutdown mechanics.

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Assisted-by: opencode:gpt-5.5 oracle
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Keep the legacy host and port options declared so callers receive an explicit error instead of having the options ignored. Reject them before mutating run-app state or attempting PID-file termination.

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Assisted-by: opencode:gpt-5.5 oracle
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
@jamesfredley

Copy link
Copy Markdown
Contributor Author

Updated the PR with three follow-up commits after the latest review:

  • e9afa4d11b - Configures bootRun in the Grails Gradle plugin to provide the default cli.pid.file at build/run-app.pid, while preserving the explicit CLI-supplied PID path from run-app. Added TestKit coverage for both paths.
  • ff748be2f7 - Simplifies the stop-app command docs to focus on user-facing behavior instead of PID/JMX/Actuator internals.
  • d9a96cf89a - Keeps legacy --host and --port declared but fails fast before any run-app state, stop marker, PID lookup, or process termination is touched.

Verification run locally:

  • ./gradlew :grails-gradle-plugins:test --tests org.grails.gradle.plugin.core.GrailsGradlePluginToolchainSpec
  • ./gradlew :grails-shell-cli:test --tests org.grails.cli.gradle.RunningApplicationProcessSpec
  • ./gradlew :grails-profiles-base:compileProfile
  • Manual Groovy driver stopped a real sleep process via RunningApplicationProcess.stop() and treated a malformed PID file as NOT_RUNNING.

I also updated the PR description to match the current design and replied to the review threads about docs and the interactive run-app/stop-app failure.

@jamesfredley jamesfredley requested a review from jdaugherty June 11, 2026 00:29
@jamesfredley jamesfredley dismissed jdaugherty’s stale review June 11, 2026 00:29

Requested changes completed

jamesfredley and others added 4 commits June 10, 2026 20:29
Resolve the run-app PID file from grails.cli.pid.file when it is supplied, and have stop-app use the same resolution path before falling back to build/run-app.pid.

Assisted-by: opencode:gpt-5.5 oracle
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Add configuration metadata for grails.cli.pid.file and include the Command Line section in the generated application properties ordering.

Assisted-by: opencode:gpt-5.5 oracle
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Let run-app and stop-app use grails.cli.pid.file from application configuration after command-line and CLI JVM system properties.

Assisted-by: opencode:gpt-5.5 oracle
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
@jamesfredley

Copy link
Copy Markdown
Contributor Author

Completed the configuration metadata follow-up.

  • Added grails.cli.pid.file to the Spring configuration metadata with default build/run-app.pid.
  • Added the Command Line metadata group to the generated application properties ordering.
  • Made run-app and stop-app honor the same configured PID path from command-line system properties, CLI JVM system properties, or application config.
  • Added PID path precedence and custom stop-path coverage.

Verification:

  • ./gradlew :grails-shell-cli:test --tests org.grails.cli.gradle.RunningApplicationProcessSpec
  • ./gradlew :grails-core:test --tests grails.dev.commands.ConfigReportCommandSpec

@testlens-app

testlens-app Bot commented Jun 11, 2026

Copy link
Copy Markdown

🚨 TestLens detected 38 failed tests 🚨

Here is what you can do:

  1. Inspect the test failures carefully.
  2. If you are convinced that some of the tests are flaky, you can mute them below.
  3. Finally, trigger a rerun by checking the rerun checkbox.

Test Summary

Check Project/Task Test Runs
CI / Functional Tests (17) :grails-test-examples-hibernate5-grails-hibernate:integrationTest BookControllerSpec
CI / Functional Tests (17) :grails-test-examples-mongodb-hibernate5:test BookFongoSpec
CI / Functional Tests (17) :grails-test-examples-mongodb-base:test BookUnitSpec
CI / Functional Tests (17) :grails-test-examples-geb:integrationTest ChildPreferenceInheritedConfigSpec
CI / Functional Tests (17) :grails-test-examples-geb:integrationTest ContainerFileDetectorAnnotationSpec
CI / Functional Tests (17) :grails-test-examples-geb:integrationTest ContainerFileDetectorDefaultSpec
CI / Functional Tests (17) :grails-test-examples-geb:integrationTest ContainerFileDetectorSpockSpec
CI / Functional Tests (17) :grails-test-examples-geb:integrationTest DownloadSupportSpec
CI / Functional Tests (17) :grails-test-examples-gsp-layout:integrationTest EndToEndSpec
CI / Functional Tests (17) :grails-test-examples-gsp-sitemesh3:integrationTest EndToEndSpec
CI / Functional Tests (17) :grails-test-examples-gorm:integrationTest FieldsValidationSpec
CI / Functional Tests (17) :grails-test-examples-hyphenated:integrationTest FooBarControllerSpec
CI / Functional Tests (17) :grails-test-examples-geb-gebconfig:integrationTest GebConfigSpec
CI / Functional Tests (17) :grails-test-examples-gsp-layout:integrationTest GrailsLayoutSpec
CI / Functional Tests (17) :grails-test-examples-gsp-sitemesh3:integrationTest GrailsLayoutSpec
CI / Functional Tests (17) :grails-test-examples-gsp-layout:integrationTest GspTagLibSpec
CI / Functional Tests (17) :grails-test-examples-hyphenated:integrationTest HyphenateControllerSpec
CI / Functional Tests (17) :grails-test-examples-geb:integrationTest InheritedConfigSpec
CI / Functional Tests (17) :grails-test-examples-jetty:integrationTest JettySessionSpec
CI / Functional Tests (17) :grails-test-examples-exploded:integrationTest LoadAfterSpec
CI / Functional Tests (17) :grails-test-examples-mongodb-base:test LocalMongoUnitSpec
CI / Functional Tests (17) :grails-test-examples-geb:integrationTest MultipleInheritanceSpec
CI / Functional Tests (17) :grails-test-examples-hyphenated:integrationTest NameSpacedControllerSpec
CI / Functional Tests (17) :grails-test-examples-geb:integrationTest NotInheritedConfigSpec
CI / Functional Tests (17) :grails-test-examples-datasources:integrationTest OsivGspRenderingSpec
CI / Functional Tests (17) :grails-test-examples-geb:integrationTest PageDelegateSpec
CI / Functional Tests (17) :grails-test-examples-geb:integrationTest PerTestRecordingSpec
CI / Functional Tests (17) :grails-test-examples-mongodb-base:test PersonSpec
CI / Functional Tests (17) :grails-test-examples-geb:integrationTest RootPageSpec
CI / Functional Tests (17) :grails-test-examples-gorm:integrationTest ScaffoldingFunctionalSpec
CI / Functional Tests (17) :grails-test-examples-geb:integrationTest ServerNameControllerSpec
CI / Functional Tests (17) :grails-test-examples-mongodb-test-data-service:integrationTest StudentServiceSpec > test regular service autowire by type in a Data Service
CI / Functional Tests (17) :grails-test-examples-mongodb-base:test TeamUnitSpec
CI / Functional Tests (17) :grails-test-examples-mongodb-test-data-service:integrationTest TestServiceSpec > test autowire by name works
CI / Functional Tests (17) :grails-test-examples-mongodb-test-data-service:integrationTest TestServiceSpec > test autowire by type
CI / Functional Tests (17) :grails-test-examples-mongodb-test-data-service:integrationTest TestServiceSpec > test data-service is loaded correctly
CI / Functional Tests (17) :grails-test-examples-mongodb-test-data-service:integrationTest TestServiceSpec > test that there is only one bookService
CI / Functional Tests (17) :grails-test-examples-geb:integrationTest UploadSpec

🏷️ Commit: 92957ff
▶️ Tests: 12880 executed
⚪️ Checks: 33/33 completed

Test Failures (first 10 of 38)

BookControllerSpec (:grails-test-examples-hibernate5-grails-hibernate:integrationTest in CI / Functional Tests (17))
org.testcontainers.containers.ContainerFetchException: Can't get Docker image: RemoteDockerImage(imageName=testcontainers/ryuk:0.12.0, imagePullPolicy=DefaultPullPolicy(), imageNameSubstitutor=org.testcontainers.utility.ImageNameSubstitutor$LogWrappedImageNameSubstitutor@f793f15)
	at org.testcontainers.containers.GenericContainer.getDockerImageName(GenericContainer.java:1364)
	at org.testcontainers.containers.GenericContainer.doStart(GenericContainer.java:351)
	at org.testcontainers.containers.GenericContainer.start(GenericContainer.java:322)
	at org.testcontainers.utility.RyukResourceReaper.maybeStart(RyukResourceReaper.java:78)
	at org.testcontainers.utility.RyukResourceReaper.init(RyukResourceReaper.java:42)
	at org.testcontainers.DockerClientFactory.client(DockerClientFactory.java:245)
	at org.testcontainers.DockerClientFactory$1.getDockerClient(DockerClientFactory.java:108)
	at com.github.dockerjava.api.DockerClientDelegate.authConfig(DockerClientDelegate.java:109)
	at org.testcontainers.containers.GenericContainer.start(GenericContainer.java:321)
	at grails.plugin.geb.WebDriverContainerHolder.startContainer(WebDriverContainerHolder.groovy:270)
	at grails.plugin.geb.WebDriverContainerHolder.reinitialize(WebDriverContainerHolder.groovy:163)
	at grails.plugin.geb.GrailsContainerGebExtension.visitSpec_closure2(GrailsContainerGebExtension.groovy:82)
	at groovy.lang.Closure.call(Closure.java:433)
	at org.spockframework.runtime.extension.MethodInvocation.proceed(MethodInvocation.java:101)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
Caused by: org.testcontainers.shaded.org.awaitility.core.ConditionTimeoutException: Condition with org.testcontainers.images.RemoteDockerImage was not fulfilled within 2 minutes.
	at org.testcontainers.shaded.org.awaitility.core.ConditionAwaiter.await(ConditionAwaiter.java:167)
	at org.testcontainers.shaded.org.awaitility.core.CallableCondition.await(CallableCondition.java:78)
	at org.testcontainers.shaded.org.awaitility.core.CallableCondition.await(CallableCondition.java:26)
	at org.testcontainers.shaded.org.awaitility.core.ConditionFactory.until(ConditionFactory.java:985)
	at org.testcontainers.shaded.org.awaitility.core.ConditionFactory.until(ConditionFactory.java:954)
	at org.testcontainers.images.RemoteDockerImage.resolve(RemoteDockerImage.java:109)
	at org.testcontainers.images.RemoteDockerImage.resolve(RemoteDockerImage.java:35)
	at org.testcontainers.utility.LazyFuture.getResolvedValue(LazyFuture.java:20)
	at org.testcontainers.utility.LazyFuture.get(LazyFuture.java:41)
	at org.testcontainers.containers.GenericContainer.getDockerImageName(GenericContainer.java:1362)
	... 14 more
BookFongoSpec (:grails-test-examples-mongodb-hibernate5:test in CI / Functional Tests (17))
org.testcontainers.containers.ContainerFetchException: Can't get Docker image: RemoteDockerImage(imageName=testcontainers/ryuk:0.12.0, imagePullPolicy=DefaultPullPolicy(), imageNameSubstitutor=org.testcontainers.utility.ImageNameSubstitutor$LogWrappedImageNameSubstitutor@5d2e6f62)
	at org.testcontainers.containers.GenericContainer.getDockerImageName(GenericContainer.java:1364)
	at org.testcontainers.containers.GenericContainer.doStart(GenericContainer.java:351)
	at org.testcontainers.containers.GenericContainer.start(GenericContainer.java:322)
	at org.testcontainers.utility.RyukResourceReaper.maybeStart(RyukResourceReaper.java:78)
	at org.testcontainers.utility.RyukResourceReaper.init(RyukResourceReaper.java:42)
	at org.testcontainers.DockerClientFactory.client(DockerClientFactory.java:245)
	at org.testcontainers.DockerClientFactory$1.getDockerClient(DockerClientFactory.java:108)
	at com.github.dockerjava.api.DockerClientDelegate.authConfig(DockerClientDelegate.java:109)
	at org.testcontainers.containers.GenericContainer.start(GenericContainer.java:321)
	at functional.tests.EmbeddedMongoClient$Trait$Helper.createMongoClient(EmbeddedMongoClient.groovy:33)
	at grails.test.mongodb.MongoSpec.setupSpec(MongoSpec.groovy:117)
Caused by: org.testcontainers.shaded.org.awaitility.core.ConditionTimeoutException: Condition with org.testcontainers.images.RemoteDockerImage was not fulfilled within 2 minutes.
	at org.testcontainers.shaded.org.awaitility.core.ConditionAwaiter.await(ConditionAwaiter.java:167)
	at org.testcontainers.shaded.org.awaitility.core.CallableCondition.await(CallableCondition.java:78)
	at org.testcontainers.shaded.org.awaitility.core.CallableCondition.await(CallableCondition.java:26)
	at org.testcontainers.shaded.org.awaitility.core.ConditionFactory.until(ConditionFactory.java:985)
	at org.testcontainers.shaded.org.awaitility.core.ConditionFactory.until(ConditionFactory.java:954)
	at org.testcontainers.images.RemoteDockerImage.resolve(RemoteDockerImage.java:109)
	at org.testcontainers.images.RemoteDockerImage.resolve(RemoteDockerImage.java:35)
	at org.testcontainers.utility.LazyFuture.getResolvedValue(LazyFuture.java:20)
	at org.testcontainers.utility.LazyFuture.get(LazyFuture.java:41)
	at org.testcontainers.containers.GenericContainer.getDockerImageName(GenericContainer.java:1362)
	... 10 more
BookUnitSpec (:grails-test-examples-mongodb-base:test in CI / Functional Tests (17))
org.testcontainers.containers.ContainerFetchException: Can't get Docker image: RemoteDockerImage(imageName=testcontainers/ryuk:0.12.0, imagePullPolicy=DefaultPullPolicy(), imageNameSubstitutor=org.testcontainers.utility.ImageNameSubstitutor$LogWrappedImageNameSubstitutor@fcd0e8d)
	at org.testcontainers.containers.GenericContainer.getDockerImageName(GenericContainer.java:1364)
	at org.testcontainers.containers.GenericContainer.doStart(GenericContainer.java:351)
	at org.testcontainers.containers.GenericContainer.start(GenericContainer.java:322)
	at org.testcontainers.utility.RyukResourceReaper.maybeStart(RyukResourceReaper.java:78)
	at org.testcontainers.utility.RyukResourceReaper.init(RyukResourceReaper.java:42)
	at org.testcontainers.DockerClientFactory.client(DockerClientFactory.java:245)
	at org.testcontainers.DockerClientFactory$1.getDockerClient(DockerClientFactory.java:108)
	at com.github.dockerjava.api.DockerClientDelegate.authConfig(DockerClientDelegate.java:109)
	at org.testcontainers.containers.GenericContainer.start(GenericContainer.java:321)
	at functional.tests.EmbeddedMongoClient$Trait$Helper.createMongoClient(EmbeddedMongoClient.groovy:33)
	at grails.test.mongodb.MongoSpec.setupSpec(MongoSpec.groovy:104)
Caused by: org.testcontainers.shaded.org.awaitility.core.ConditionTimeoutException: Condition with org.testcontainers.images.RemoteDockerImage was not fulfilled within 2 minutes.
	at org.testcontainers.shaded.org.awaitility.core.ConditionAwaiter.await(ConditionAwaiter.java:167)
	at org.testcontainers.shaded.org.awaitility.core.CallableCondition.await(CallableCondition.java:78)
	at org.testcontainers.shaded.org.awaitility.core.CallableCondition.await(CallableCondition.java:26)
	at org.testcontainers.shaded.org.awaitility.core.ConditionFactory.until(ConditionFactory.java:985)
	at org.testcontainers.shaded.org.awaitility.core.ConditionFactory.until(ConditionFactory.java:954)
	at org.testcontainers.images.RemoteDockerImage.resolve(RemoteDockerImage.java:109)
	at org.testcontainers.images.RemoteDockerImage.resolve(RemoteDockerImage.java:35)
	at org.testcontainers.utility.LazyFuture.getResolvedValue(LazyFuture.java:20)
	at org.testcontainers.utility.LazyFuture.get(LazyFuture.java:41)
	at org.testcontainers.containers.GenericContainer.getDockerImageName(GenericContainer.java:1362)
	... 10 more
ChildPreferenceInheritedConfigSpec (:grails-test-examples-geb:integrationTest in CI / Functional Tests (17))
org.testcontainers.containers.ContainerFetchException: Can't get Docker image: RemoteDockerImage(imageName=testcontainers/ryuk:0.12.0, imagePullPolicy=DefaultPullPolicy(), imageNameSubstitutor=org.testcontainers.utility.ImageNameSubstitutor$LogWrappedImageNameSubstitutor@351ede23)
	at org.testcontainers.containers.GenericContainer.getDockerImageName(GenericContainer.java:1364)
	at org.testcontainers.containers.GenericContainer.doStart(GenericContainer.java:351)
	at org.testcontainers.containers.GenericContainer.start(GenericContainer.java:322)
	at org.testcontainers.utility.RyukResourceReaper.maybeStart(RyukResourceReaper.java:78)
	at org.testcontainers.utility.RyukResourceReaper.init(RyukResourceReaper.java:42)
	at org.testcontainers.DockerClientFactory.client(DockerClientFactory.java:245)
	at org.testcontainers.DockerClientFactory$1.getDockerClient(DockerClientFactory.java:108)
	at com.github.dockerjava.api.DockerClientDelegate.authConfig(DockerClientDelegate.java:109)
	at org.testcontainers.containers.GenericContainer.start(GenericContainer.java:321)
	at grails.plugin.geb.WebDriverContainerHolder.startContainer(WebDriverContainerHolder.groovy:270)
	at grails.plugin.geb.WebDriverContainerHolder.reinitialize(WebDriverContainerHolder.groovy:163)
	at grails.plugin.geb.GrailsContainerGebExtension.visitSpec_closure2(GrailsContainerGebExtension.groovy:82)
	at groovy.lang.Closure.call(Closure.java:433)
	at org.spockframework.runtime.extension.MethodInvocation.proceed(MethodInvocation.java:101)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
Caused by: org.testcontainers.shaded.org.awaitility.core.ConditionTimeoutException: Condition with org.testcontainers.images.RemoteDockerImage was not fulfilled within 2 minutes.
	at org.testcontainers.shaded.org.awaitility.core.ConditionAwaiter.await(ConditionAwaiter.java:167)
	at org.testcontainers.shaded.org.awaitility.core.CallableCondition.await(CallableCondition.java:78)
	at org.testcontainers.shaded.org.awaitility.core.CallableCondition.await(CallableCondition.java:26)
	at org.testcontainers.shaded.org.awaitility.core.ConditionFactory.until(ConditionFactory.java:985)
	at org.testcontainers.shaded.org.awaitility.core.ConditionFactory.until(ConditionFactory.java:954)
	at org.testcontainers.images.RemoteDockerImage.resolve(RemoteDockerImage.java:109)
	at org.testcontainers.images.RemoteDockerImage.resolve(RemoteDockerImage.java:35)
	at org.testcontainers.utility.LazyFuture.getResolvedValue(LazyFuture.java:20)
	at org.testcontainers.utility.LazyFuture.get(LazyFuture.java:41)
	at org.testcontainers.containers.GenericContainer.getDockerImageName(GenericContainer.java:1362)
	... 14 more
ContainerFileDetectorAnnotationSpec (:grails-test-examples-geb:integrationTest in CI / Functional Tests (17))
org.testcontainers.containers.ContainerFetchException: Can't get Docker image: RemoteDockerImage(imageName=testcontainers/ryuk:0.12.0, imagePullPolicy=DefaultPullPolicy(), imageNameSubstitutor=org.testcontainers.utility.ImageNameSubstitutor$LogWrappedImageNameSubstitutor@351ede23)
	at org.testcontainers.containers.GenericContainer.getDockerImageName(GenericContainer.java:1364)
	at org.testcontainers.containers.GenericContainer.doStart(GenericContainer.java:351)
	at org.testcontainers.containers.GenericContainer.start(GenericContainer.java:322)
	at org.testcontainers.utility.RyukResourceReaper.maybeStart(RyukResourceReaper.java:78)
	at org.testcontainers.utility.RyukResourceReaper.init(RyukResourceReaper.java:42)
	at org.testcontainers.DockerClientFactory.client(DockerClientFactory.java:245)
	at org.testcontainers.DockerClientFactory$1.getDockerClient(DockerClientFactory.java:108)
	at com.github.dockerjava.api.DockerClientDelegate.authConfig(DockerClientDelegate.java:109)
	at org.testcontainers.containers.GenericContainer.start(GenericContainer.java:321)
	at grails.plugin.geb.WebDriverContainerHolder.startContainer(WebDriverContainerHolder.groovy:270)
	at grails.plugin.geb.WebDriverContainerHolder.reinitialize(WebDriverContainerHolder.groovy:163)
	at grails.plugin.geb.GrailsContainerGebExtension.visitSpec_closure2(GrailsContainerGebExtension.groovy:82)
	at groovy.lang.Closure.call(Closure.java:433)
	at org.spockframework.runtime.extension.MethodInvocation.proceed(MethodInvocation.java:101)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
Caused by: org.testcontainers.shaded.org.awaitility.core.ConditionTimeoutException: Condition with org.testcontainers.images.RemoteDockerImage was not fulfilled within 2 minutes.
	at org.testcontainers.shaded.org.awaitility.core.ConditionAwaiter.await(ConditionAwaiter.java:167)
	at org.testcontainers.shaded.org.awaitility.core.CallableCondition.await(CallableCondition.java:78)
	at org.testcontainers.shaded.org.awaitility.core.CallableCondition.await(CallableCondition.java:26)
	at org.testcontainers.shaded.org.awaitility.core.ConditionFactory.until(ConditionFactory.java:985)
	at org.testcontainers.shaded.org.awaitility.core.ConditionFactory.until(ConditionFactory.java:954)
	at org.testcontainers.images.RemoteDockerImage.resolve(RemoteDockerImage.java:109)
	at org.testcontainers.images.RemoteDockerImage.resolve(RemoteDockerImage.java:35)
	at org.testcontainers.utility.LazyFuture.getResolvedValue(LazyFuture.java:20)
	at org.testcontainers.utility.LazyFuture.get(LazyFuture.java:41)
	at org.testcontainers.containers.GenericContainer.getDockerImageName(GenericContainer.java:1362)
	... 14 more
ContainerFileDetectorDefaultSpec (:grails-test-examples-geb:integrationTest in CI / Functional Tests (17))
org.testcontainers.containers.ContainerFetchException: Can't get Docker image: RemoteDockerImage(imageName=testcontainers/ryuk:0.12.0, imagePullPolicy=DefaultPullPolicy(), imageNameSubstitutor=org.testcontainers.utility.ImageNameSubstitutor$LogWrappedImageNameSubstitutor@351ede23)
	at org.testcontainers.containers.GenericContainer.getDockerImageName(GenericContainer.java:1364)
	at org.testcontainers.containers.GenericContainer.doStart(GenericContainer.java:351)
	at org.testcontainers.containers.GenericContainer.start(GenericContainer.java:322)
	at org.testcontainers.utility.RyukResourceReaper.maybeStart(RyukResourceReaper.java:78)
	at org.testcontainers.utility.RyukResourceReaper.init(RyukResourceReaper.java:42)
	at org.testcontainers.DockerClientFactory.client(DockerClientFactory.java:245)
	at org.testcontainers.DockerClientFactory$1.getDockerClient(DockerClientFactory.java:108)
	at com.github.dockerjava.api.DockerClientDelegate.authConfig(DockerClientDelegate.java:109)
	at org.testcontainers.containers.GenericContainer.start(GenericContainer.java:321)
	at grails.plugin.geb.WebDriverContainerHolder.startContainer(WebDriverContainerHolder.groovy:270)
	at grails.plugin.geb.WebDriverContainerHolder.reinitialize(WebDriverContainerHolder.groovy:163)
	at grails.plugin.geb.GrailsContainerGebExtension.visitSpec_closure2(GrailsContainerGebExtension.groovy:82)
	at groovy.lang.Closure.call(Closure.java:433)
	at org.spockframework.runtime.extension.MethodInvocation.proceed(MethodInvocation.java:101)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
Caused by: org.testcontainers.shaded.org.awaitility.core.ConditionTimeoutException: Condition with org.testcontainers.images.RemoteDockerImage was not fulfilled within 2 minutes.
	at org.testcontainers.shaded.org.awaitility.core.ConditionAwaiter.await(ConditionAwaiter.java:167)
	at org.testcontainers.shaded.org.awaitility.core.CallableCondition.await(CallableCondition.java:78)
	at org.testcontainers.shaded.org.awaitility.core.CallableCondition.await(CallableCondition.java:26)
	at org.testcontainers.shaded.org.awaitility.core.ConditionFactory.until(ConditionFactory.java:985)
	at org.testcontainers.shaded.org.awaitility.core.ConditionFactory.until(ConditionFactory.java:954)
	at org.testcontainers.images.RemoteDockerImage.resolve(RemoteDockerImage.java:109)
	at org.testcontainers.images.RemoteDockerImage.resolve(RemoteDockerImage.java:35)
	at org.testcontainers.utility.LazyFuture.getResolvedValue(LazyFuture.java:20)
	at org.testcontainers.utility.LazyFuture.get(LazyFuture.java:41)
	at org.testcontainers.containers.GenericContainer.getDockerImageName(GenericContainer.java:1362)
	... 14 more
ContainerFileDetectorSpockSpec (:grails-test-examples-geb:integrationTest in CI / Functional Tests (17))
org.testcontainers.containers.ContainerFetchException: Can't get Docker image: RemoteDockerImage(imageName=testcontainers/ryuk:0.12.0, imagePullPolicy=DefaultPullPolicy(), imageNameSubstitutor=org.testcontainers.utility.ImageNameSubstitutor$LogWrappedImageNameSubstitutor@351ede23)
	at org.testcontainers.containers.GenericContainer.getDockerImageName(GenericContainer.java:1364)
	at org.testcontainers.containers.GenericContainer.doStart(GenericContainer.java:351)
	at org.testcontainers.containers.GenericContainer.start(GenericContainer.java:322)
	at org.testcontainers.utility.RyukResourceReaper.maybeStart(RyukResourceReaper.java:78)
	at org.testcontainers.utility.RyukResourceReaper.init(RyukResourceReaper.java:42)
	at org.testcontainers.DockerClientFactory.client(DockerClientFactory.java:245)
	at org.testcontainers.DockerClientFactory$1.getDockerClient(DockerClientFactory.java:108)
	at com.github.dockerjava.api.DockerClientDelegate.authConfig(DockerClientDelegate.java:109)
	at org.testcontainers.containers.GenericContainer.start(GenericContainer.java:321)
	at grails.plugin.geb.WebDriverContainerHolder.startContainer(WebDriverContainerHolder.groovy:270)
	at grails.plugin.geb.WebDriverContainerHolder.reinitialize(WebDriverContainerHolder.groovy:163)
	at grails.plugin.geb.GrailsContainerGebExtension.visitSpec_closure2(GrailsContainerGebExtension.groovy:82)
	at groovy.lang.Closure.call(Closure.java:433)
	at org.spockframework.runtime.extension.MethodInvocation.proceed(MethodInvocation.java:101)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
Caused by: org.testcontainers.shaded.org.awaitility.core.ConditionTimeoutException: Condition with org.testcontainers.images.RemoteDockerImage was not fulfilled within 2 minutes.
	at org.testcontainers.shaded.org.awaitility.core.ConditionAwaiter.await(ConditionAwaiter.java:167)
	at org.testcontainers.shaded.org.awaitility.core.CallableCondition.await(CallableCondition.java:78)
	at org.testcontainers.shaded.org.awaitility.core.CallableCondition.await(CallableCondition.java:26)
	at org.testcontainers.shaded.org.awaitility.core.ConditionFactory.until(ConditionFactory.java:985)
	at org.testcontainers.shaded.org.awaitility.core.ConditionFactory.until(ConditionFactory.java:954)
	at org.testcontainers.images.RemoteDockerImage.resolve(RemoteDockerImage.java:109)
	at org.testcontainers.images.RemoteDockerImage.resolve(RemoteDockerImage.java:35)
	at org.testcontainers.utility.LazyFuture.getResolvedValue(LazyFuture.java:20)
	at org.testcontainers.utility.LazyFuture.get(LazyFuture.java:41)
	at org.testcontainers.containers.GenericContainer.getDockerImageName(GenericContainer.java:1362)
	... 14 more
DownloadSupportSpec (:grails-test-examples-geb:integrationTest in CI / Functional Tests (17))
org.testcontainers.containers.ContainerFetchException: Can't get Docker image: RemoteDockerImage(imageName=testcontainers/ryuk:0.12.0, imagePullPolicy=DefaultPullPolicy(), imageNameSubstitutor=org.testcontainers.utility.ImageNameSubstitutor$LogWrappedImageNameSubstitutor@351ede23)
	at org.testcontainers.containers.GenericContainer.getDockerImageName(GenericContainer.java:1364)
	at org.testcontainers.containers.GenericContainer.doStart(GenericContainer.java:351)
	at org.testcontainers.containers.GenericContainer.start(GenericContainer.java:322)
	at org.testcontainers.utility.RyukResourceReaper.maybeStart(RyukResourceReaper.java:78)
	at org.testcontainers.utility.RyukResourceReaper.init(RyukResourceReaper.java:42)
	at org.testcontainers.DockerClientFactory.client(DockerClientFactory.java:245)
	at org.testcontainers.DockerClientFactory$1.getDockerClient(DockerClientFactory.java:108)
	at com.github.dockerjava.api.DockerClientDelegate.authConfig(DockerClientDelegate.java:109)
	at org.testcontainers.containers.GenericContainer.start(GenericContainer.java:321)
	at grails.plugin.geb.WebDriverContainerHolder.startContainer(WebDriverContainerHolder.groovy:270)
	at grails.plugin.geb.WebDriverContainerHolder.reinitialize(WebDriverContainerHolder.groovy:163)
	at grails.plugin.geb.GrailsContainerGebExtension.visitSpec_closure2(GrailsContainerGebExtension.groovy:82)
	at groovy.lang.Closure.call(Closure.java:433)
	at org.spockframework.runtime.extension.MethodInvocation.proceed(MethodInvocation.java:101)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
Caused by: org.testcontainers.shaded.org.awaitility.core.ConditionTimeoutException: Condition with org.testcontainers.images.RemoteDockerImage was not fulfilled within 2 minutes.
	at org.testcontainers.shaded.org.awaitility.core.ConditionAwaiter.await(ConditionAwaiter.java:167)
	at org.testcontainers.shaded.org.awaitility.core.CallableCondition.await(CallableCondition.java:78)
	at org.testcontainers.shaded.org.awaitility.core.CallableCondition.await(CallableCondition.java:26)
	at org.testcontainers.shaded.org.awaitility.core.ConditionFactory.until(ConditionFactory.java:985)
	at org.testcontainers.shaded.org.awaitility.core.ConditionFactory.until(ConditionFactory.java:954)
	at org.testcontainers.images.RemoteDockerImage.resolve(RemoteDockerImage.java:109)
	at org.testcontainers.images.RemoteDockerImage.resolve(RemoteDockerImage.java:35)
	at org.testcontainers.utility.LazyFuture.getResolvedValue(LazyFuture.java:20)
	at org.testcontainers.utility.LazyFuture.get(LazyFuture.java:41)
	at org.testcontainers.containers.GenericContainer.getDockerImageName(GenericContainer.java:1362)
	... 14 more
EndToEndSpec (:grails-test-examples-gsp-sitemesh3:integrationTest in CI / Functional Tests (17))
org.testcontainers.containers.ContainerFetchException: Can't get Docker image: RemoteDockerImage(imageName=testcontainers/ryuk:0.12.0, imagePullPolicy=DefaultPullPolicy(), imageNameSubstitutor=org.testcontainers.utility.ImageNameSubstitutor$LogWrappedImageNameSubstitutor@18483b8b)
	at org.testcontainers.containers.GenericContainer.getDockerImageName(GenericContainer.java:1364)
	at org.testcontainers.containers.GenericContainer.doStart(GenericContainer.java:351)
	at org.testcontainers.containers.GenericContainer.start(GenericContainer.java:322)
	at org.testcontainers.utility.RyukResourceReaper.maybeStart(RyukResourceReaper.java:78)
	at org.testcontainers.utility.RyukResourceReaper.init(RyukResourceReaper.java:42)
	at org.testcontainers.DockerClientFactory.client(DockerClientFactory.java:245)
	at org.testcontainers.DockerClientFactory$1.getDockerClient(DockerClientFactory.java:108)
	at com.github.dockerjava.api.DockerClientDelegate.authConfig(DockerClientDelegate.java:109)
	at org.testcontainers.containers.GenericContainer.start(GenericContainer.java:321)
	at grails.plugin.geb.WebDriverContainerHolder.startContainer(WebDriverContainerHolder.groovy:270)
	at grails.plugin.geb.WebDriverContainerHolder.reinitialize(WebDriverContainerHolder.groovy:163)
	at grails.plugin.geb.GrailsContainerGebExtension.visitSpec_closure2(GrailsContainerGebExtension.groovy:82)
	at groovy.lang.Closure.call(Closure.java:433)
	at org.spockframework.runtime.extension.MethodInvocation.proceed(MethodInvocation.java:101)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
Caused by: org.testcontainers.shaded.org.awaitility.core.ConditionTimeoutException: Condition with org.testcontainers.images.RemoteDockerImage was not fulfilled within 2 minutes.
	at org.testcontainers.shaded.org.awaitility.core.ConditionAwaiter.await(ConditionAwaiter.java:167)
	at org.testcontainers.shaded.org.awaitility.core.CallableCondition.await(CallableCondition.java:78)
	at org.testcontainers.shaded.org.awaitility.core.CallableCondition.await(CallableCondition.java:26)
	at org.testcontainers.shaded.org.awaitility.core.ConditionFactory.until(ConditionFactory.java:985)
	at org.testcontainers.shaded.org.awaitility.core.ConditionFactory.until(ConditionFactory.java:954)
	at org.testcontainers.images.RemoteDockerImage.resolve(RemoteDockerImage.java:109)
	at org.testcontainers.images.RemoteDockerImage.resolve(RemoteDockerImage.java:35)
	at org.testcontainers.utility.LazyFuture.getResolvedValue(LazyFuture.java:20)
	at org.testcontainers.utility.LazyFuture.get(LazyFuture.java:41)
	at org.testcontainers.containers.GenericContainer.getDockerImageName(GenericContainer.java:1362)
	... 14 more
EndToEndSpec (:grails-test-examples-gsp-layout:integrationTest in CI / Functional Tests (17))
org.testcontainers.containers.ContainerFetchException: Can't get Docker image: RemoteDockerImage(imageName=testcontainers/ryuk:0.12.0, imagePullPolicy=DefaultPullPolicy(), imageNameSubstitutor=org.testcontainers.utility.ImageNameSubstitutor$LogWrappedImageNameSubstitutor@5d800a56)
	at org.testcontainers.containers.GenericContainer.getDockerImageName(GenericContainer.java:1364)
	at org.testcontainers.containers.GenericContainer.doStart(GenericContainer.java:351)
	at org.testcontainers.containers.GenericContainer.start(GenericContainer.java:322)
	at org.testcontainers.utility.RyukResourceReaper.maybeStart(RyukResourceReaper.java:78)
	at org.testcontainers.utility.RyukResourceReaper.init(RyukResourceReaper.java:42)
	at org.testcontainers.DockerClientFactory.client(DockerClientFactory.java:245)
	at org.testcontainers.DockerClientFactory$1.getDockerClient(DockerClientFactory.java:108)
	at com.github.dockerjava.api.DockerClientDelegate.authConfig(DockerClientDelegate.java:109)
	at org.testcontainers.containers.GenericContainer.start(GenericContainer.java:321)
	at grails.plugin.geb.WebDriverContainerHolder.startContainer(WebDriverContainerHolder.groovy:270)
	at grails.plugin.geb.WebDriverContainerHolder.reinitialize(WebDriverContainerHolder.groovy:163)
	at grails.plugin.geb.GrailsContainerGebExtension.visitSpec_closure2(GrailsContainerGebExtension.groovy:82)
	at groovy.lang.Closure.call(Closure.java:433)
	at org.spockframework.runtime.extension.MethodInvocation.proceed(MethodInvocation.java:101)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
Caused by: org.testcontainers.shaded.org.awaitility.core.ConditionTimeoutException: Condition with org.testcontainers.images.RemoteDockerImage was not fulfilled within 2 minutes.
	at org.testcontainers.shaded.org.awaitility.core.ConditionAwaiter.await(ConditionAwaiter.java:167)
	at org.testcontainers.shaded.org.awaitility.core.CallableCondition.await(CallableCondition.java:78)
	at org.testcontainers.shaded.org.awaitility.core.CallableCondition.await(CallableCondition.java:26)
	at org.testcontainers.shaded.org.awaitility.core.ConditionFactory.until(ConditionFactory.java:985)
	at org.testcontainers.shaded.org.awaitility.core.ConditionFactory.until(ConditionFactory.java:954)
	at org.testcontainers.images.RemoteDockerImage.resolve(RemoteDockerImage.java:109)
	at org.testcontainers.images.RemoteDockerImage.resolve(RemoteDockerImage.java:35)
	at org.testcontainers.utility.LazyFuture.getResolvedValue(LazyFuture.java:20)
	at org.testcontainers.utility.LazyFuture.get(LazyFuture.java:41)
	at org.testcontainers.containers.GenericContainer.getDockerImageName(GenericContainer.java:1362)
	... 14 more

Muted Tests (first 20 of 38)

Select tests to mute in this pull request:

  • BookControllerSpec
  • BookFongoSpec
  • BookUnitSpec
  • ChildPreferenceInheritedConfigSpec
  • ContainerFileDetectorAnnotationSpec
  • ContainerFileDetectorDefaultSpec
  • ContainerFileDetectorSpockSpec
  • DownloadSupportSpec
  • EndToEndSpec
  • FieldsValidationSpec
  • FooBarControllerSpec
  • GebConfigSpec
  • GrailsLayoutSpec
  • GspTagLibSpec
  • HyphenateControllerSpec
  • InheritedConfigSpec
  • JettySessionSpec
  • LoadAfterSpec
  • LocalMongoUnitSpec
  • MultipleInheritanceSpec

Reuse successful test results:

  • ♻️ Only rerun the tests that failed or were muted before

Click the checkbox to trigger a rerun:

  • Rerun jobs

Learn more about TestLens at testlens.app.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: In Progress

Development

Successfully merging this pull request may close these issues.

Fix stop-app in grails cli

5 participants