quarkusio / quarkus

Quarkus: Supersonic Subatomic Java.
https://quarkus.io
Apache License 2.0
13.56k stars 2.62k forks source link

Impossible to build a project with quarkus-kind in the classpath if kind not available? #38322

Open PierreBtz opened 7 months ago

PierreBtz commented 7 months ago

Describe the bug

See the linked discussion for the long version.

The kind extension forces to have kind in the PATH, there is no way to build on a machine without kind even when quarkus.kubernetes.deploy is false. This can be an issue, for instance in a CI environment.

Expected behavior

The build works even without kind in the path.

Actual behavior

The build fails with:

[ERROR] Failed to execute goal io.quarkus.platform:quarkus-maven-plugin:3.6.6:build (default) on project quarkus-kind-needed-bug: Failed to build quarkus application: io.quarkus.builder.BuildException: Build failure: Build failed due to errors
[ERROR]     [error]: Build step io.quarkus.kind.deployment.KindProcessor#postBuild threw an exception: java.lang.RuntimeException: Input/Output error while executing command.
[ERROR]     at io.quarkus.deployment.util.ExecUtil.startProcess(ExecUtil.java:227)
[ERROR]     at io.quarkus.deployment.util.ExecUtil.exec(ExecUtil.java:118)
[ERROR]     at io.quarkus.deployment.util.ExecUtil.exec(ExecUtil.java:87)
[ERROR]     at io.quarkus.deployment.util.ExecUtil.exec(ExecUtil.java:63)
[ERROR]     at io.quarkus.kind.deployment.KindProcessor.postBuild(KindProcessor.java:138)
[ERROR]     at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
[ERROR]     at java.base/java.lang.reflect.Method.invoke(Method.java:580)
[ERROR]     at io.quarkus.deployment.ExtensionLoader$3.execute(ExtensionLoader.java:849)
[ERROR]     at io.quarkus.builder.BuildContext.run(BuildContext.java:256)
[ERROR]     at org.jboss.threads.ContextHandler$1.runWith(ContextHandler.java:18)
[ERROR]     at org.jboss.threads.EnhancedQueueExecutor$Task.run(EnhancedQueueExecutor.java:2513)
[ERROR]     at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1538)
[ERROR]     at java.base/java.lang.Thread.run(Thread.java:1583)
[ERROR]     at org.jboss.threads.JBossThread.run(JBossThread.java:501)
[ERROR] Caused by: java.io.IOException: Cannot run program "kind" (in directory "."): error=2, No such file or directory
[ERROR]     at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1170)
[ERROR]     at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1089)
[ERROR]     at io.quarkus.deployment.util.ExecUtil.startProcess(ExecUtil.java:225)
[ERROR]     ... 13 more
[ERROR] Caused by: java.io.IOException: error=2, No such file or directory
[ERROR]     at java.base/java.lang.ProcessImpl.forkAndExec(Native Method)
[ERROR]     at java.base/java.lang.ProcessImpl.<init>(ProcessImpl.java:295)
[ERROR]     at java.base/java.lang.ProcessImpl.start(ProcessImpl.java:225)
[ERROR]     at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1126)
[ERROR]     ... 15 more

How to Reproduce?

To reproduce:

Prerequisites: java 21 (or modify the version in the pom...), docker

[ERROR] Failed to execute goal io.quarkus.platform:quarkus-maven-plugin:3.6.6:build (default) on project quarkus-kind-needed-bug: Failed to build quarkus application: io.quarkus.builder.BuildException: Build failure: Build failed due to errors
[ERROR]     [error]: Build step io.quarkus.kind.deployment.KindProcessor#postBuild threw an exception: java.lang.RuntimeException: Input/Output error while executing command.
[ERROR]     at io.quarkus.deployment.util.ExecUtil.startProcess(ExecUtil.java:227)
[ERROR]     at io.quarkus.deployment.util.ExecUtil.exec(ExecUtil.java:118)
[ERROR]     at io.quarkus.deployment.util.ExecUtil.exec(ExecUtil.java:87)
[ERROR]     at io.quarkus.deployment.util.ExecUtil.exec(ExecUtil.java:63)
[ERROR]     at io.quarkus.kind.deployment.KindProcessor.postBuild(KindProcessor.java:138)
[ERROR]     at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
[ERROR]     at java.base/java.lang.reflect.Method.invoke(Method.java:580)
[ERROR]     at io.quarkus.deployment.ExtensionLoader$3.execute(ExtensionLoader.java:849)
[ERROR]     at io.quarkus.builder.BuildContext.run(BuildContext.java:256)
[ERROR]     at org.jboss.threads.ContextHandler$1.runWith(ContextHandler.java:18)
[ERROR]     at org.jboss.threads.EnhancedQueueExecutor$Task.run(EnhancedQueueExecutor.java:2513)
[ERROR]     at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1538)
[ERROR]     at java.base/java.lang.Thread.run(Thread.java:1583)
[ERROR]     at org.jboss.threads.JBossThread.run(JBossThread.java:501)
[ERROR] Caused by: java.io.IOException: Cannot run program "kind" (in directory "."): error=2, No such file or directory
[ERROR]     at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1170)
[ERROR]     at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1089)
[ERROR]     at io.quarkus.deployment.util.ExecUtil.startProcess(ExecUtil.java:225)
[ERROR]     ... 13 more
[ERROR] Caused by: java.io.IOException: error=2, No such file or directory
[ERROR]     at java.base/java.lang.ProcessImpl.forkAndExec(Native Method)
[ERROR]     at java.base/java.lang.ProcessImpl.<init>(ProcessImpl.java:295)
[ERROR]     at java.base/java.lang.ProcessImpl.start(ProcessImpl.java:225)
[ERROR]     at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1126)
[ERROR]     ... 15 more

Output of uname -a or ver

Darwin ***** 23.2.0 Darwin Kernel Version 23.2.0: Wed Nov 15 21:53:18 PST 2023; root:xnu-10002.61.3~2/RELEASE_ARM64_T6000 arm64

Output of java -version

openjdk version "21.0.1" 2023-10-17 LTS OpenJDK Runtime Environment Temurin-21.0.1+12 (build 21.0.1+12-LTS) OpenJDK 64-Bit Server VM Temurin-21.0.1+12 (build 21.0.1+12-LTS, mixed mode)

Quarkus version or git rev

3.6.6

Build tool (ie. output of mvnw --version or gradlew --version)

Apache Maven 3.9.6 (bc0240f3c744dd6b6ec2920b3cd08dcc295161ae) Maven home: /Users/pierrebeitz/.m2/wrapper/dists/apache-maven-3.9.6-bin/3311e1d4/apache-maven-3.9.6 Java version: 21.0.1, vendor: Eclipse Adoptium, runtime: /Users/pierrebeitz/.asdf/installs/java/temurin-21.0.1+12.0.LTS Default locale: en_FR, platform encoding: UTF-8 OS name: "mac os x", version: "14.2.1", arch: "aarch64", family: "mac"

Additional information

See my comments in the initial discussion.

Discussed in https://github.com/quarkusio/quarkus/discussions/38306

Originally posted by **PierreBtz** January 19, 2024 Hey folks! Quick question before I open an issue. I have a project using the `quarkus-kind` to deploy locally in a kind cluster, all good there I like it :) Now for the issue, when running on the CI, there is no kind available, which shouldn't be a problem since I don't want to deploy. However, I think that `quarkus-kind` unconditionally tries to load the image built in kind, even if `quarkus.kubernetes.deploy` is false, as evidenced by https://github.com/quarkusio/quarkus/blob/8bf9f63815b0f2f6dee9fae3db1ee2e306573ee3/extensions/kubernetes/kind/deployment/src/main/java/io/quarkus/kind/deployment/KindProcessor.java#L124-L130. I looked around in https://quarkus.io/guides/all-config but didn't find any property to modify this behavior. Am I missing something? Would it make sense to skip `kind load...` if `quarkus.kubernetes.deploy` is false? Or have a different settings to deactivate the load? Or catch the exception and just slip a warning "couldn't load the image into the kind cluster"? The only workaround I see is to hide the dependency behind a profile in Maven, obviously I don't like it :)
quarkus-bot[bot] commented 7 months ago

/cc @geoand (kubernetes), @iocanel (kubernetes)