Describe the bug
It is not possible to build a gRPC-based Gradle project on Linux Alpine
Expected behavior
It should be possible to build gRPC-based Gradle projects on Linux Alpine
Actual behavior
Build fails with an exception:
#10 52.04 > Task :quarkusGenerateCode FAILED
#10 52.04 :quarkusGenerateCode (Thread[Execution worker for ':',5,main]) completed. Took 19.126 secs.
#10 52.04
#10 52.04 FAILURE: Build failed with an exception.
#10 52.04
#10 52.14 * What went wrong:
#10 52.14 Execution failed for task ':quarkusGenerateCode'.
#10 52.14 > Failed to generate sources in the QuarkusPrepare task
#10 52.14
#10 52.14 * Try:
#10 52.14 Run with --debug option to get more log output. Run with --scan to get full insights.
#10 52.14
#10 52.14 * Exception is:
#10 52.14 org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':quarkusGenerateCode'.
#10 52.14 at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.lambda$executeIfValid$1(ExecuteActionsTaskExecuter.java:207)
#10 52.14 at org.gradle.internal.Try$Failure.ifSuccessfulOrElse(Try.java:263)
#10 52.14 at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeIfValid(ExecuteActionsTaskExecuter.java:205)
#10 52.14 at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:186)
#10 52.14 at org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute(CleanupStaleOutputsExecuter.java:114)
#10 52.15 at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46)
#10 52.15 at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:62)
#10 52.15 at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:57)
#10 52.15 at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:56)
#10 52.15 at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36)
#10 52.15 at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:77)
#10 52.15 at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:55)
#10 52.15 at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52)
#10 52.15 at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:409)
#10 52.15 at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:399)
#10 52.15 at org.gradle.internal.operations.DefaultBuildOperationExecutor$1.execute(DefaultBuildOperationExecutor.java:157)
#10 52.15 at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:242)
#10 52.15 at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:150)
#10 52.15 at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:94)
#10 52.16 at org.gradle.internal.operations.DelegatingBuildOperationExecutor.call(DelegatingBuildOperationExecutor.java:36)
#10 52.16 at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:52)
#10 52.16 at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:41)
#10 52.16 at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:356)
#10 52.16 at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:343)
#10 52.16 at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:336)
#10 52.16 at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:322)
#10 52.16 at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.lambda$run$0(DefaultPlanExecutor.java:127)
#10 52.16 at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:191)
#10 52.16 at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.executeNextNode(DefaultPlanExecutor.java:182)
#10 52.16 at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:124)
#10 52.16 at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
#10 52.16 at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48)
#10 52.16 at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:56)
#10 52.16 Caused by: org.gradle.api.GradleException: Failed to generate sources in the QuarkusPrepare task
#10 52.17 at io.quarkus.gradle.tasks.QuarkusGenerateCode.prepareQuarkus(QuarkusGenerateCode.java:99)
#10 52.17 at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
#10 52.17 at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:64)
#10 52.17 at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
#10 52.17 at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:104)
#10 52.17 at org.gradle.api.internal.project.taskfactory.StandardTaskAction.doExecute(StandardTaskAction.java:49)
#10 52.17 at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:42)
#10 52.17 at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:28)
#10 52.17 at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:726)
#10 52.18 at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:693)
#10 52.18 at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$3.run(ExecuteActionsTaskExecuter.java:569)
#10 52.18 at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:395)
#10 52.18 at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:387)
#10 52.18 at org.gradle.internal.operations.DefaultBuildOperationExecutor$1.execute(DefaultBuildOperationExecutor.java:157)
#10 52.18 at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:242)
#10 52.18 at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:150)
#10 52.18 at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:84)
#10 52.18 at org.gradle.internal.operations.DelegatingBuildOperationExecutor.run(DelegatingBuildOperationExecutor.java:31)
#10 52.18 at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:554)
#10 52.18 at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:537)
#10 52.18 at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.access$300(ExecuteActionsTaskExecuter.java:108)
#10 52.18 at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$TaskExecution.executeWithPreviousOutputFiles(ExecuteActionsTaskExecuter.java:278)
#10 52.18 at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$TaskExecution.execute(ExecuteActionsTaskExecuter.java:267)
#10 52.18 at org.gradle.internal.execution.steps.ExecuteStep.lambda$execute$1(ExecuteStep.java:33)
#10 52.18 at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:33)
#10 52.18 at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:26)
#10 52.18 at org.gradle.internal.execution.steps.CleanupOutputsStep.execute(CleanupOutputsStep.java:67)
#10 52.18 at org.gradle.internal.execution.steps.CleanupOutputsStep.execute(CleanupOutputsStep.java:36)
#10 52.18 at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:49)
#10 52.18 at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:34)
#10 52.18 at org.gradle.internal.execution.steps.CancelExecutionStep.execute(CancelExecutionStep.java:43)
#10 52.18 at org.gradle.internal.execution.steps.TimeoutStep.executeWithoutTimeout(TimeoutStep.java:73)
#10 52.18 at org.gradle.internal.execution.steps.TimeoutStep.execute(TimeoutStep.java:54)
#10 52.18 at org.gradle.internal.execution.steps.CatchExceptionStep.execute(CatchExceptionStep.java:34)
#10 52.18 at org.gradle.internal.execution.steps.CreateOutputsStep.execute(CreateOutputsStep.java:44)
#10 52.18 at org.gradle.internal.execution.steps.SnapshotOutputsStep.execute(SnapshotOutputsStep.java:54)
#10 52.18 at org.gradle.internal.execution.steps.SnapshotOutputsStep.execute(SnapshotOutputsStep.java:38)
#10 52.18 at org.gradle.internal.execution.steps.BroadcastChangingOutputsStep.execute(BroadcastChangingOutputsStep.java:49)
#10 52.18 at org.gradle.internal.execution.steps.CacheStep.executeWithoutCache(CacheStep.java:159)
#10 52.18 at org.gradle.internal.execution.steps.CacheStep.execute(CacheStep.java:72)
#10 52.18 at org.gradle.internal.execution.steps.CacheStep.execute(CacheStep.java:43)
#10 52.18 at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:44)
#10 52.18 at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:33)
#10 52.18 at org.gradle.internal.execution.steps.RecordOutputsStep.execute(RecordOutputsStep.java:38)
#10 52.18 at org.gradle.internal.execution.steps.RecordOutputsStep.execute(RecordOutputsStep.java:24)
#10 52.18 at org.gradle.internal.execution.steps.SkipUpToDateStep.executeBecause(SkipUpToDateStep.java:92)
#10 52.18 at org.gradle.internal.execution.steps.SkipUpToDateStep.lambda$execute$0(SkipUpToDateStep.java:85)
#10 52.18 at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:55)
#10 52.18 at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:39)
#10 52.18 at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:76)
#10 52.18 at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:37)
#10 52.18 at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:36)
#10 52.18 at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:26)
#10 52.18 at org.gradle.internal.execution.steps.ResolveCachingStateStep.execute(ResolveCachingStateStep.java:94)
#10 52.18 at org.gradle.internal.execution.steps.ResolveCachingStateStep.execute(ResolveCachingStateStep.java:49)
#10 52.18 at org.gradle.internal.execution.steps.CaptureStateBeforeExecutionStep.execute(CaptureStateBeforeExecutionStep.java:79)
#10 52.18 at org.gradle.internal.execution.steps.CaptureStateBeforeExecutionStep.execute(CaptureStateBeforeExecutionStep.java:53)
#10 52.19 at org.gradle.internal.execution.steps.ValidateStep.execute(ValidateStep.java:74)
#10 52.19 at org.gradle.internal.execution.steps.SkipEmptyWorkStep.lambda$execute$2(SkipEmptyWorkStep.java:78)
#10 52.19 at org.gradle.internal.execution.steps.SkipEmptyWorkStep.execute(SkipEmptyWorkStep.java:78)
#10 52.19 at org.gradle.internal.execution.steps.SkipEmptyWorkStep.execute(SkipEmptyWorkStep.java:34)
#10 52.19 at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsStartedStep.execute(MarkSnapshottingInputsStartedStep.java:39)
#10 52.19 at org.gradle.internal.execution.steps.LoadExecutionStateStep.execute(LoadExecutionStateStep.java:40)
#10 52.19 at org.gradle.internal.execution.steps.LoadExecutionStateStep.execute(LoadExecutionStateStep.java:28)
#10 52.19 at org.gradle.internal.execution.impl.DefaultWorkExecutor.execute(DefaultWorkExecutor.java:33)
#10 52.19 at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeIfValid(ExecuteActionsTaskExecuter.java:194)
#10 52.19 at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:186)
#10 52.19 at org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute(CleanupStaleOutputsExecuter.java:114)
#10 52.19 at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46)
#10 52.19 at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:62)
#10 52.19 at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:57)
#10 52.19 at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:56)
#10 52.19 at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36)
#10 52.19 at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:77)
#10 52.19 at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:55)
#10 52.19 at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52)
#10 52.19 at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:409)
#10 52.19 at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:399)
#10 52.19 at org.gradle.internal.operations.DefaultBuildOperationExecutor$1.execute(DefaultBuildOperationExecutor.java:157)
#10 52.19 at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:242)
#10 52.20 at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:150)
#10 52.20 at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:94)
#10 52.20 at org.gradle.internal.operations.DelegatingBuildOperationExecutor.call(DelegatingBuildOperationExecutor.java:36)
#10 52.20 at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:52)
#10 52.20 at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:41)
#10 52.20 at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:356)
#10 52.20 at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:343)
#10 52.20 at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:336)
#10 52.20 at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:322)
#10 52.20 at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.lambda$run$0(DefaultPlanExecutor.java:127)
#10 52.20 at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:191)
#10 52.20 at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.executeNextNode(DefaultPlanExecutor.java:182)
#10 52.20 at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:124)
#10 52.20 at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
#10 52.20 at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48)
#10 52.20 at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:56)
#10 52.20 Caused by: java.lang.reflect.InvocationTargetException
#10 52.20 at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
#10 52.20 at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:64)
#10 52.20 at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
#10 52.20 at io.quarkus.gradle.tasks.QuarkusGenerateCode.prepareQuarkus(QuarkusGenerateCode.java:89)
#10 52.20 ... 95 more
#10 52.20 Caused by: io.quarkus.bootstrap.prebuild.CodeGenException: Failed to generate java files from proto file in /src/main/proto
#10 52.21 at io.quarkus.grpc.deployment.GrpcCodeGen.trigger(GrpcCodeGen.java:116)
#10 52.21 at io.quarkus.deployment.CodeGenerator.lambda$trigger$1(CodeGenerator.java:91)
#10 52.21 at io.quarkus.deployment.CodeGenerator.callWithClassloader(CodeGenerator.java:67)
#10 52.21 at io.quarkus.deployment.CodeGenerator.trigger(CodeGenerator.java:87)
#10 52.21 at io.quarkus.deployment.CodeGenerator.initAndRun(CodeGenerator.java:31)
#10 52.21 ... 99 more
#10 52.21 Caused by: java.io.IOException: Cannot run program "/build/com.google.protobuf-protoc-linux-x86_64-exe": error=2, No such file or directory
#10 52.21 at io.quarkus.deployment.util.ProcessUtil.launchProcess(ProcessUtil.java:38)
#10 52.21 at io.quarkus.grpc.deployment.GrpcCodeGen.trigger(GrpcCodeGen.java:106)
#10 52.21 ... 103 more
#10 52.21 Caused by: java.io.IOException: error=2, No such file or directory
#10 52.21 ... 105 more
To Reproduce
A repository with the bug: https://github.com/shpota/quarkus-grpc-alpine-issue
Steps to reproduce the behavior:
io.quarkus:quarkus-grpc dependency..proto file to src/main/proto./gradlew --stacktrace build on an Alpine Linux environment.Alternativelly:
Dockerfile reproducing the issue)docker build .Configuration
not applicable
Screenshots
not applicable
Environment (please complete the following information):
uname -a or ver: Linux buildkitsandbox 5.4.39-linuxkit #1 SMP Fri May 8 23:03:06 UTC 2020 x86_64 Linuxjava -version: openjdk 15-ea 2020-09-151.10.3.Finalmvnw --version or gradlew --version): Gradle 6.5.1
Build time: 2020-06-30 06:32:47 UTC
Revision: 66bc713f7169626a7f0134bf452abde51550ea0a
Kotlin: 1.3.72
Groovy: 2.5.11
Ant: Apache Ant(TM) version 1.10.7 compiled on September 1 2019
JVM: 15-ea (Oracle Corporation 15-ea+31)
OS: Linux 5.4.39-linuxkit amd64
Additional context
The build works well on a Debian-based distribution (eg. openjdk:15.0.1-jdk-slim), however it is important to be able to build it on a minimal distributions like Alpine because they reduce costs and build time when used in CI.
/cc @cescoffier, @evanchooly, @glefloch, @michalszynkiewicz, @quarkusio/devtools
It looks like the problem is not related to quarkus but to alpine. There is a similar issue in the protobuf-java repository: https://github.com/google/protobuf-gradle-plugin/issues/265
However, maybe we could add an option to allow specifying the protoc binary to use ? @cescoffier, @michalszynkiewicz WDYT ?
It would be a nice feature. WDYT @michalszynkiewicz ?
:+1: to adding an option to specify protoc's path.
The issue @glefloch linked says that installing glibc is an option to work around the problem.
@Shpota could you check if adding it makes it work for you?
Thanks for the report :)
@michalszynkiewicz thank you. Installing glibc helped.
For those who don't want to use a Debian-based image you can add the following instruction to your Dockerfile in order to work around the issue.
RUN wget -q -O /etc/apk/keys/sgerrand.rsa.pub https://alpine-pkgs.sgerrand.com/sgerrand.rsa.pub \
&& wget https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.32-r0/glibc-2.32-r0.apk \
&& apk add glibc-2.32-r0.apk && rm glibc-2.32-r0.apk
Most helpful comment
@michalszynkiewicz thank you. Installing
glibchelped.For those who don't want to use a Debian-based image you can add the following instruction to your
Dockerfilein order to work around the issue.