quarkus icon indicating copy to clipboard operation
quarkus copied to clipboard

Failure to resolve encrypted configuration properties with the Gradle plugin

Open michaeldimchuk opened this issue 1 year ago • 12 comments

Describe the bug

As of Quarkus 3.5.0 (and also 3.6.4 as I have the same error there), using the encrypted configuration properties as described in the docs https://quarkus.io/guides/config-reference#secret-keys-expressions causes the build to fail when resolving properties, and the application fails to start locally. The exact code linked in the reproducer section works with 3.4.3.

Expected behavior

The build should succeed and correctly resolve configuration properties, given that the appropriate configuration dependencies are available on the class path.

Actual behavior

When running ./gradlew test, the build fails with the following error:

./gradlew test
> Task :api:quarkusGenerateCode FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':api:quarkusGenerateCode'.
> Error while evaluating property 'cachingRelevantInput' of task ':api:quarkusGenerateCode'.
   > SRCFG00046: Could not find a secret key handler for aes-gcm-nopadding

Even though the smallrye-config-crypto dependency is on the class path and the aes-gcm-nopadding key is configured.

The full stack trace can be seen here:
> Task :api:quarkusGenerateCode FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':api:quarkusGenerateCode'.
> Error while evaluating property 'cachingRelevantInput' of task ':api:quarkusGenerateCode'.
   > SRCFG00046: Could not find a secret key handler for aes-gcm-nopadding

* Try:
> Run with --info or --debug option to get more log output.
> Run with --scan to get full insights.
> Get more help at https://help.gradle.org.

* Exception is:
org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':api:quarkusGenerateCode'.
        at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:38)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:77)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:55)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:199)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:73)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:52)
        at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:42)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:331)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:318)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.lambda$execute$0(DefaultTaskExecutionGraph.java:314)
        at org.gradle.internal.operations.CurrentBuildOperationRef.with(CurrentBuildOperationRef.java:80)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:314)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:303)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:463)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:380)
        at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
        at org.gradle.internal.concurrent.AbstractManagedExecutor$1.run(AbstractManagedExecutor.java:47)
Caused by: org.gradle.api.internal.tasks.properties.PropertyEvaluationException: Error while evaluating property 'cachingRelevantInput' of task ':api:quarkusGenerateCode'.
        at org.gradle.api.internal.tasks.properties.InputParameterUtils.prepareInputParameterValue(InputParameterUtils.java:32)
        at org.gradle.api.internal.tasks.execution.TaskExecution.lambda$visitRegularInputs$1(TaskExecution.java:321)
        at org.gradle.internal.execution.impl.DefaultInputFingerprinter$InputCollectingVisitor.visitInputProperty(DefaultInputFingerprinter.java:103)
        at org.gradle.api.internal.tasks.execution.TaskExecution.visitRegularInputs(TaskExecution.java:319)
        at org.gradle.internal.execution.impl.DefaultInputFingerprinter.fingerprintInputProperties(DefaultInputFingerprinter.java:63)
        at org.gradle.internal.execution.steps.CaptureStateBeforeExecutionStep.captureExecutionStateWithOutputs(CaptureStateBeforeExecutionStep.java:123)
        at org.gradle.internal.execution.steps.CaptureStateBeforeExecutionStep.lambda$captureExecutionState$1(CaptureStateBeforeExecutionStep.java:82)
        at org.gradle.internal.execution.steps.BuildOperationStep$1.call(BuildOperationStep.java:37)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:199)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:73)
        at org.gradle.internal.execution.steps.BuildOperationStep.operation(BuildOperationStep.java:34)
        at org.gradle.internal.execution.steps.CaptureStateBeforeExecutionStep.captureExecutionState(CaptureStateBeforeExecutionStep.java:76)
        at org.gradle.internal.execution.steps.CaptureStateBeforeExecutionStep.lambda$execute$0(CaptureStateBeforeExecutionStep.java:70)
        at org.gradle.internal.execution.steps.CaptureStateBeforeExecutionStep.execute(CaptureStateBeforeExecutionStep.java:70)
        at org.gradle.internal.execution.steps.CaptureStateBeforeExecutionStep.execute(CaptureStateBeforeExecutionStep.java:45)
        at org.gradle.internal.execution.steps.SkipEmptyWorkStep.executeWithNonEmptySources(SkipEmptyWorkStep.java:177)
        at org.gradle.internal.execution.steps.SkipEmptyWorkStep.execute(SkipEmptyWorkStep.java:81)
        at org.gradle.internal.execution.steps.SkipEmptyWorkStep.execute(SkipEmptyWorkStep.java:53)
        at org.gradle.internal.execution.steps.RemoveUntrackedExecutionStateStep.execute(RemoveUntrackedExecutionStateStep.java:32)
        at org.gradle.internal.execution.steps.RemoveUntrackedExecutionStateStep.execute(RemoveUntrackedExecutionStateStep.java:21)
        at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsStartedStep.execute(MarkSnapshottingInputsStartedStep.java:38)
        at org.gradle.internal.execution.steps.LoadPreviousExecutionStateStep.execute(LoadPreviousExecutionStateStep.java:36)
        at org.gradle.internal.execution.steps.LoadPreviousExecutionStateStep.execute(LoadPreviousExecutionStateStep.java:23)
        at org.gradle.internal.execution.steps.CleanupStaleOutputsStep.execute(CleanupStaleOutputsStep.java:75)
        at org.gradle.internal.execution.steps.CleanupStaleOutputsStep.execute(CleanupStaleOutputsStep.java:41)
        at org.gradle.internal.execution.steps.ExecuteWorkBuildOperationFiringStep.lambda$execute$2(ExecuteWorkBuildOperationFiringStep.java:66)
        at org.gradle.internal.execution.steps.ExecuteWorkBuildOperationFiringStep.execute(ExecuteWorkBuildOperationFiringStep.java:66)
        at org.gradle.internal.execution.steps.ExecuteWorkBuildOperationFiringStep.execute(ExecuteWorkBuildOperationFiringStep.java:38)
        at org.gradle.internal.execution.steps.AssignWorkspaceStep.lambda$execute$0(AssignWorkspaceStep.java:32)
        at org.gradle.api.internal.tasks.execution.TaskExecution$4.withWorkspace(TaskExecution.java:293)
        at org.gradle.internal.execution.steps.AssignWorkspaceStep.execute(AssignWorkspaceStep.java:30)
        at org.gradle.internal.execution.steps.AssignWorkspaceStep.execute(AssignWorkspaceStep.java:21)
        at org.gradle.internal.execution.steps.IdentityCacheStep.execute(IdentityCacheStep.java:37)
        at org.gradle.internal.execution.steps.IdentityCacheStep.execute(IdentityCacheStep.java:27)
        at org.gradle.internal.execution.steps.IdentifyStep.execute(IdentifyStep.java:47)
        at org.gradle.internal.execution.steps.IdentifyStep.execute(IdentifyStep.java:34)
        at org.gradle.internal.execution.impl.DefaultExecutionEngine$1.execute(DefaultExecutionEngine.java:64)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeIfValid(ExecuteActionsTaskExecuter.java:145)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:134)
        at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46)
        at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:51)
        at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:57)
        at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:74)
        at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:77)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:55)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:199)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:73)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:52)
        at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:42)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:331)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:318)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.lambda$execute$0(DefaultTaskExecutionGraph.java:314)
        at org.gradle.internal.operations.CurrentBuildOperationRef.with(CurrentBuildOperationRef.java:80)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:314)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:303)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:463)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:380)
        at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
        at org.gradle.internal.concurrent.AbstractManagedExecutor$1.run(AbstractManagedExecutor.java:47)
Caused by: java.util.NoSuchElementException: SRCFG00046: Could not find a secret key handler for aes-gcm-nopadding
        at io.smallrye.config.SecretKeysHandlerConfigSourceInterceptor.getHandler(SecretKeysHandlerConfigSourceInterceptor.java:38)
        at io.smallrye.config.SecretKeysHandlerConfigSourceInterceptor.getValue(SecretKeysHandlerConfigSourceInterceptor.java:29)
        at io.smallrye.config.SmallRyeConfigSourceInterceptorContext.proceed(SmallRyeConfigSourceInterceptorContext.java:20)
        at io.smallrye.config.FallbackConfigSourceInterceptor.getValue(FallbackConfigSourceInterceptor.java:24)
        at io.smallrye.config.SmallRyeConfigSourceInterceptorContext.proceed(SmallRyeConfigSourceInterceptorContext.java:20)
        at io.smallrye.config.SmallRyeConfig.getConfigValue(SmallRyeConfig.java:322)
        at io.quarkus.gradle.tasks.EffectiveConfig.lambda$generateFullConfigMap$1(EffectiveConfig.java:110)
        at io.quarkus.gradle.tasks.EffectiveConfig.generateFullConfigMap(EffectiveConfig.java:109)
        at io.quarkus.gradle.tasks.EffectiveConfig.<init>(EffectiveConfig.java:89)
        at io.quarkus.gradle.tasks.EffectiveConfig$Builder.build(EffectiveConfig.java:176)
        at io.quarkus.gradle.tasks.AbstractQuarkusExtension.buildEffectiveConfiguration(AbstractQuarkusExtension.java:130)
        at io.quarkus.gradle.tasks.AbstractQuarkusExtension.buildBaseConfig(AbstractQuarkusExtension.java:71)
        at org.gradle.api.internal.provider.DefaultProvider.calculateOwnValue(DefaultProvider.java:72)
        at org.gradle.api.internal.provider.AbstractMinimalProvider.calculateValue(AbstractMinimalProvider.java:115)
        at org.gradle.api.internal.provider.TransformBackedProvider.calculateOwnValue(TransformBackedProvider.java:82)
        at org.gradle.api.internal.provider.AbstractMinimalProvider.calculateValue(AbstractMinimalProvider.java:115)
        at org.gradle.api.internal.provider.AbstractMinimalProvider.withFinalValue(AbstractMinimalProvider.java:168)
        at org.gradle.api.internal.provider.DefaultProperty.finalValue(DefaultProperty.java:133)
        at org.gradle.api.internal.provider.DefaultProperty.finalValue(DefaultProperty.java:26)
        at org.gradle.api.internal.provider.AbstractProperty.finalizeNow(AbstractProperty.java:245)
        at org.gradle.api.internal.provider.AbstractProperty.finalizeValue(AbstractProperty.java:194)
        at io.quarkus.gradle.tasks.AbstractQuarkusExtension.baseConfig(AbstractQuarkusExtension.java:76)
        at io.quarkus.gradle.tasks.QuarkusGenerateCode.getCachingRelevantInput(QuarkusGenerateCode.java:70)
        at io.quarkus.gradle.tasks.QuarkusGenerateCode_Decorated.getCachingRelevantInput(Unknown Source)
        at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
        at org.gradle.internal.reflect.annotations.impl.DefaultPropertyAnnotationMetadata.getPropertyValue(DefaultPropertyAnnotationMetadata.java:97)
        at org.gradle.internal.properties.annotations.DefaultTypeMetadataStore$DefaultPropertyMetadata.getPropertyValue(DefaultTypeMetadataStore.java:288)
        at org.gradle.internal.properties.bean.DefaultPropertyWalker$1.lambda$visitLeaf$0(DefaultPropertyWalker.java:90)
        at org.gradle.internal.deprecation.DeprecationLogger.whileDisabled(DeprecationLogger.java:259)
        at org.gradle.internal.properties.bean.DefaultPropertyWalker$CachedPropertyValue.lambda$new$0(DefaultPropertyWalker.java:107)
        at com.google.common.base.Suppliers$NonSerializableMemoizingSupplier.get(Suppliers.java:181)
        at org.gradle.internal.properties.bean.DefaultPropertyWalker$CachedPropertyValue.call(DefaultPropertyWalker.java:149)
        at org.gradle.util.internal.GUtil.uncheckedCall(GUtil.java:437)
        at org.gradle.util.internal.DeferredUtil.unpackNestableDeferred(DeferredUtil.java:83)
        at org.gradle.util.internal.DeferredUtil.unpack(DeferredUtil.java:57)
        at org.gradle.util.internal.DeferredUtil.unpackOrNull(DeferredUtil.java:49)
        at org.gradle.api.internal.tasks.properties.InputParameterUtils.prepareInputParameterValue(InputParameterUtils.java:38)
        at org.gradle.api.internal.tasks.properties.InputParameterUtils.prepareInputParameterValue(InputParameterUtils.java:30)
        ... 72 more

How to Reproduce?

Clone this project: https://github.com/michaeldimchuk/gradle-java-template

It's currently using Quarkus version 3.4.3, which is the latest version of Quarkus which still allows running tests / running the application locally without it crashing. The api/src/main/resources/application.yaml file contains the encrypted value that needs to be resolved, which will be loaded as the StoreSettings class in the services module. With this version of Quarkus, either running ./gradlew test or ./gradlew quarkusDev works perfectly fine.

To replicate this being broken, upgrade the following 3 locations to whatever version of Quarkus you want to test with, 3.5.0 is the earliest where this started happening, but I can also replicate this with the latest 3.6.4:

  • https://github.com/michaeldimchuk/gradle-java-template/blob/main/settings.gradle.kts#L12
  • https://github.com/michaeldimchuk/gradle-java-template/blob/main/api/build.gradle.kts#L9
  • https://github.com/michaeldimchuk/gradle-java-template/blob/main/services/build.gradle.kts#L9

Then run make lock to update the lock files and ensure all dependencies are synchronized.

After this, running either ./gradlew test or ./gradlew quarkusDev will fail.

Output of uname -a or ver

Darwin Michaels-MacBook-Air.local 22.2.0 Darwin Kernel Version 22.2.0: Fri Nov 11 02:04:44 PST 2022; root:xnu-8792.61.2~4/RELEASE_ARM64_T8103 arm64

Output of java -version

openjdk version "21.0.1" 2023-10-17 OpenJDK Runtime Environment Homebrew (build 21.0.1) OpenJDK 64-Bit Server VM Homebrew (build 21.0.1, mixed mode, sharing)

Quarkus version or git rev

3.5.0 || 3.6.4

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

------------------------------------------------------------ Gradle 8.5 ------------------------------------------------------------ Build time: 2023-11-29 14:08:57 UTC Revision: 28aca86a7180baa17117e0e5ba01d8ea9feca598 Kotlin: 1.9.20 Groovy: 3.0.17 Ant: Apache Ant(TM) version 1.10.13 compiled on January 4 2023 JVM: 21.0.1 (Homebrew 21.0.1) OS: Mac OS X 13.1 aarch64

Additional information

No response

michaeldimchuk avatar Jan 03 '24 16:01 michaeldimchuk

/cc @geoand (kotlin), @glefloch, @quarkusio/devtools

quarkus-bot[bot] avatar Jan 03 '24 16:01 quarkus-bot[bot]

cc @radcortez

geoand avatar Jan 03 '24 16:01 geoand

I think we completely broke the Gradle plugin config handling. We have a constant stream of issues with things that worked before and do not work anymore.

I'm wondering if we should just revert the optimizations that were done as I think that's what is causing all these issues.

@snazy @radcortez what's your take on this?

gsmet avatar Jan 03 '24 17:01 gsmet

probably a duplicate of #37984

sberyozkin avatar Jan 03 '24 17:01 sberyozkin

@snazy @radcortez what's your take on this?

Not totally sure if this one is caused by the big changes in the Gradle config. The CodeGenerator is tricky to handle because the current project may declare config services to include, which are not compiled yet, so these have to be excluded. This code should be common between Maven and Gradle, and I believe it should work for the secret handlers, but let me have a look.

On a separate note, the way the config is currently handled in Gradle is quite different from how we handle it in Quarkus internally or in Maven. I'm not sure if it is possible to roll back these changes at this point, but we should definitely work to make it more consistent. @gsmet do you have any proposal as to what should be reverted?

radcortez avatar Jan 03 '24 17:01 radcortez

This is strange, because it happens while the Gradle plugin's evaluating the Quarkus config. The plugin doesn't need any of the user properties, but needs a bunch of the Quarkus properties. Discovery of secret key handlers is been disabled since Quarkus 3.2.0, so it seems we need a way to tell smallrye-config to disable config encryption entirely (which would only be effective for the plugin - not the application).

snazy avatar Jan 04 '24 09:01 snazy

If only Quarkus specific properties need to be resolved, can they be filtered out in EffectiveConfig#generateFullConfigMap? I don't have full context so could be wrong, but it looks like it's trying to get all configurations, which would always fail if a handler isn't available for a defined property.

michaeldimchuk avatar Jan 19 '24 18:01 michaeldimchuk

Correct. If we add that filter, it will still fail if someone sets a secret key for a quarkus property.

I believe we need to question the Gradle plugin requirement to evaluate all keys, regardless of whether the key is being used or not. We don't do that in the Maven plugin, so for me, it is unclear why we need that for Gradle. Maybe because it is caching the values to determine if a rebuild is required? If that is the case, values could be retrieved without expanding them, and the cache would work.

radcortez avatar Jan 22 '24 17:01 radcortez

Maybe because it is caching the values to determine if a rebuild is required?

That's the reason, yes (also affects the Gradle cache).

If that is the case, values could be retrieved without expanding them, and the cache would work.

I doubt that not expanding properties works - that would also prevent a property expansion like quarkus.application.name=myapp-${some.variant}.

I think, it would be easier to just disable decryption when evaluating the configuration.

snazy avatar Jan 23 '24 10:01 snazy

What if the keys evaluation is only used for cache purposes, and when you need an actual config value we query the SmallRyeConfig instance? It seems that in some cases, we just query the resulting Map with all evaluated properties.

radcortez avatar Jan 23 '24 13:01 radcortez

Looks like this could be a regression from older Quarkus 3.x releases. Not sure how and why.

Anyway, as @radcortez pointed out we need to be able to disable crypto processing entirely for the Gradle plugin's purposes.

snazy avatar Feb 08 '24 17:02 snazy

I have also the same error with Jasypt encryption, as stated in this link https://docs.quarkiverse.io/quarkus-config-extensions/dev/jasypt.html . I currently use the Quarkus version of 3.7.1 and Gradle version 8.6 for building. With Quarkus version of 3.4.3 it works normally.

pengxo avatar Feb 13 '24 17:02 pengxo

Same with the following gradle.properties

org.gradle.jvmargs=-Xms1024m -Xmx2048m

# daemon will cache info in background between builds and will keep the JVM warm for further builds
org.gradle.daemon=true

# build cache
org.gradle.caching=true

# configuration cache
org.gradle.configuration-cache=true
org.gradle.configuration-cache.problems=warn

# client and scheduler will be built in parallel after core has been builtorg.gradle.jvmargs=-Xms1024m -Xmx2048m

# daemon will cache info in background between builds and will keep the JVM warm for further builds
org.gradle.daemon=true

# build cache
org.gradle.caching=true

# configuration cache
org.gradle.configuration-cache=true
org.gradle.configuration-cache.problems=warn

# client and scheduler will be built in parallel after core has been built
org.gradle.parallel=true

# additional performance monitoring for
org.gradle.daemon.performance.enable-monitoring=true

#parallel build
org.gradle.parallel=true

# additional performance monitoring for
org.gradle.daemon.performance.enable-monitoring=true

breaking it down further, it's the Gradle Configuration Cache that causes this, using

org.gradle.configuration-cache=true

mklueh avatar Feb 20 '24 14:02 mklueh