Skip to content

Check for the command in the path before running the analysis #182

Open
@ruromero

Description

@ruromero

When inspecting Docker file, i got the following exception in the log :

java.lang.RuntimeException: Failed to execute command 'syft registry.access.redhat.com/ubi8/nodejs-18-minimal:latest@sha256:d015728a742ea9d2113885216f9e9d863fbe51705e2825464ca2c14417fe04a2 -s all-layers -o cyclonedx-json -q' 
	at com.redhat.exhort.tools.Operations.runProcessGetFullOutput(Operations.java:227)
	at com.redhat.exhort.image.ImageUtils.execSyft(ImageUtils.java:155)
	at com.redhat.exhort.image.ImageUtils.generateImageSBOM(ImageUtils.java:105)
	at com.redhat.exhort.impl.ExhortApi.lambda$getBatchImageSboms$11(ExhortApi.java:436)
	at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
	at java.base/java.util.HashMap$KeySpliterator.forEachRemaining(HashMap.java:1715)
	at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)
	at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
	at java.base/java.util.stream.ReduceOps$ReduceTask.doLeaf(ReduceOps.java:960)
	at java.base/java.util.stream.ReduceOps$ReduceTask.doLeaf(ReduceOps.java:934)
	at java.base/java.util.stream.AbstractTask.compute(AbstractTask.java:327)
	at java.base/java.util.concurrent.CountedCompleter.exec(CountedCompleter.java:759)
	at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:507)
	at java.base/java.util.concurrent.ForkJoinTask.invoke(ForkJoinTask.java:676)
	at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateParallel(ReduceOps.java:927)
	at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:233)
	at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:682)
	at com.redhat.exhort.impl.ExhortApi.getBatchImageSboms(ExhortApi.java:440)
	at com.redhat.exhort.impl.ExhortApi.lambda$imageAnalysis$8(ExhortApi.java:412)
	at com.redhat.exhort.impl.ExhortApi.performBatchAnalysis(ExhortApi.java:476)
	at com.redhat.exhort.impl.ExhortApi.imageAnalysis(ExhortApi.java:411)
	at org.jboss.tools.intellij.image.ApiService.getImageAnalysis(ApiService.java:71)
	at org.jboss.tools.intellij.image.ImageService.performAnalysis(ImageService.java:209)
	at org.jboss.tools.intellij.image.DockerfileAnnotator.lambda$doAnnotate$15(DockerfileAnnotator.java:262)
	at com.intellij.openapi.application.impl.ApplicationImpl$2.run(ApplicationImpl.java:265)
	at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:572)
	at com.intellij.util.concurrency.ContextCallable.lambda$call$1(ContextCallable.java:86)
	at com.intellij.util.concurrency.ContextCallable.call(ContextCallable.java:95)
	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317)
	at com.intellij.util.concurrency.ChildContext$runInChildContext$1.invoke(propagation.kt:102)
	at com.intellij.util.concurrency.ChildContext$runInChildContext$1.invoke(propagation.kt:102)
	at com.intellij.util.concurrency.ChildContext.runInChildContext(propagation.kt:108)
	at com.intellij.util.concurrency.ChildContext.runInChildContext(propagation.kt:102)
	at com.intellij.util.concurrency.ContextRunnable.run(ContextRunnable.java:27)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)
	at java.base/java.util.concurrent.Executors$PrivilegedThreadFactory$1$1.run(Executors.java:735)
	at java.base/java.util.concurrent.Executors$PrivilegedThreadFactory$1$1.run(Executors.java:732)
	at java.base/java.security.AccessController.doPrivileged(AccessController.java:400)
	at java.base/java.util.concurrent.Executors$PrivilegedThreadFactory$1.run(Executors.java:732)
	at java.base/java.lang.Thread.run(Thread.java:1583)
Caused by: java.io.IOException: Cannot run program "syft": error=2, Aucun fichier ou dossier de ce nom
	at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1170)
	at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1089)
	at java.base/java.lang.Runtime.exec(Runtime.java:681)
	at java.base/java.lang.Runtime.exec(Runtime.java:491)
	at java.base/java.lang.Runtime.exec(Runtime.java:366)
	at com.redhat.exhort.tools.Operations.runProcessGetFullOutput(Operations.java:194)
	... 40 more
Caused by: java.io.IOException: error=2, Aucun fichier ou dossier de ce nom
	at java.base/java.lang.ProcessImpl.forkAndExec(Native Method)
	at java.base/java.lang.ProcessImpl.<init>(ProcessImpl.java:295)
	at java.base/java.lang.ProcessImpl.start(ProcessImpl.java:225)
	at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1126)
	... 45 more

I know i don't have the CLI on the PATH as expected, but for the user it can be wrongly assuming the extension's not working properly ( as it throws exception ).
A solution should be to first try to run the CLI, catch the exception and inform the user that the CLI is not present on the PATH. it can also point to the documentation, or the settings, or even try to download it ?
for example we use a common lib to perform this on our other IDEA extensions : https://github.com/redhat-developer/intellij-common/blob/main/src/main/java/com/redhat/devtools/intellij/common/utils/DownloadHelper.java

Originally posted by @sbouchet in #173

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions