GoogleCloudPlatform / app-gradle-plugin

The library has moved to https://github.com/GoogleCloudPlatform/appengine-plugins/tree/main/app-gradle-plugin

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Bad installation of cloud sdk throws nullpointer exception when looking for components.

anbuck opened this issue · comments

I'm getting an exception when running the downloadCloudSdk task with 2.0.0-rc5. I also tried rc4, but got the same error. However, it works fine if I switch back to 1.3.5. I pasted the full stack trace below, but it seems like ManagedCloudSdk.hasComponent() is blowing up.

`java.lang.NullPointerException (no error message)

  • Try:
    Run with --info or --debug option to get more log output. Run with --scan to get full insights.

  • Exception is:

org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':downloadCloudSdk'.
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$2.accept(ExecuteActionsTaskExecuter.java:121)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$2.accept(ExecuteActionsTaskExecuter.java:117)
        at org.gradle.internal.Try$Failure.ifSuccessfulOrElse(Try.java:184)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:110)
        at org.gradle.api.internal.tasks.execution.ResolveIncrementalChangesTaskExecuter.execute(ResolveIncrementalChangesTaskExecuter.java:84)
        at org.gradle.api.internal.tasks.execution.ResolveTaskOutputCachingStateExecuter.execute(ResolveTaskOutputCachingStateExecuter.java:91)
        at org.gradle.api.internal.tasks.execution.ResolveBeforeExecutionStateTaskExecuter.execute(ResolveBeforeExecutionStateTaskExecuter.java:74)
        at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:58)
        at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:109)
        at org.gradle.api.internal.tasks.execution.ResolveBeforeExecutionOutputsTaskExecuter.execute(ResolveBeforeExecutionOutputsTaskExecuter.java:67)
        at org.gradle.api.internal.tasks.execution.ResolveAfterPreviousExecutionStateTaskExecuter.execute(ResolveAfterPreviousExecutionStateTaskExecuter.java:46)
        at org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute(CleanupStaleOutputsExecuter.java:93)
        at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:45)
        at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:94)
        at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:57)
        at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:56)
        at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:63)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:49)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:46)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:416)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:406)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$1.execute(DefaultBuildOperationExecutor.java:165)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:250)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:158)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:102)
        at org.gradle.internal.operations.DelegatingBuildOperationExecutor.call(DelegatingBuildOperationExecutor.java:36)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:46)
        at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:43)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:355)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:343)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:336)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:322)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker$1.execute(DefaultPlanExecutor.java:134)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker$1.execute(DefaultPlanExecutor.java:129)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:202)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.executeNextNode(DefaultPlanExecutor.java:193)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:129)
        at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:63)
        at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:46)
        at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:55)
Caused by: java.lang.NullPointerException
        at com.google.cloud.tools.managedcloudsdk.ManagedCloudSdk.hasComponent(ManagedCloudSdk.java:123)
        at com.google.cloud.tools.gradle.appengine.core.DownloadCloudSdkTask.downloadCloudSdkAction(DownloadCloudSdkTask.java:72)
        at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:103)
        at org.gradle.api.internal.project.taskfactory.StandardTaskAction.doExecute(StandardTaskAction.java:48)
        at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:41)
        at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:28)
        at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:705)
        at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:672)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$4.run(ExecuteActionsTaskExecuter.java:338)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:402)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:394)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$1.execute(DefaultBuildOperationExecutor.java:165)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:250)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:158)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:92)
        at org.gradle.internal.operations.DelegatingBuildOperationExecutor.run(DelegatingBuildOperationExecutor.java:31)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:327)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:312)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.access$200(ExecuteActionsTaskExecuter.java:75)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$TaskExecution.execute(ExecuteActionsTaskExecuter.java:158)
        at org.gradle.internal.execution.impl.steps.ExecuteStep.execute(ExecuteStep.java:46)
        at org.gradle.internal.execution.impl.steps.CancelExecutionStep.execute(CancelExecutionStep.java:34)
        at org.gradle.internal.execution.impl.steps.TimeoutStep.executeWithoutTimeout(TimeoutStep.java:69)
        at org.gradle.internal.execution.impl.steps.TimeoutStep.execute(TimeoutStep.java:49)
        at org.gradle.internal.execution.impl.steps.CatchExceptionStep.execute(CatchExceptionStep.java:34)
        at org.gradle.internal.execution.impl.steps.CreateOutputsStep.execute(CreateOutputsStep.java:49)
        at org.gradle.internal.execution.impl.steps.SnapshotOutputStep.execute(SnapshotOutputStep.java:42)
        at org.gradle.internal.execution.impl.steps.SnapshotOutputStep.execute(SnapshotOutputStep.java:28)
        at org.gradle.internal.execution.impl.steps.CacheStep.executeWithoutCache(CacheStep.java:133)
        at org.gradle.internal.execution.impl.steps.CacheStep.lambda$execute$5(CacheStep.java:83)
        at org.gradle.internal.execution.impl.steps.CacheStep.execute(CacheStep.java:82)
        at org.gradle.internal.execution.impl.steps.CacheStep.execute(CacheStep.java:37)
        at org.gradle.internal.execution.impl.steps.PrepareCachingStep.execute(PrepareCachingStep.java:33)
        at org.gradle.internal.execution.impl.steps.StoreSnapshotsStep.execute(StoreSnapshotsStep.java:38)
        at org.gradle.internal.execution.impl.steps.StoreSnapshotsStep.execute(StoreSnapshotsStep.java:23)
        at org.gradle.internal.execution.impl.steps.SkipUpToDateStep.executeBecause(SkipUpToDateStep.java:95)
        at org.gradle.internal.execution.impl.steps.SkipUpToDateStep.lambda$execute$0(SkipUpToDateStep.java:88)
        at org.gradle.internal.execution.impl.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:52)
        at org.gradle.internal.execution.impl.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:36)
        at org.gradle.internal.execution.impl.DefaultWorkExecutor.execute(DefaultWorkExecutor.java:34)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:109)
        ... 37 more
commented

That's interesting, yeah so only 2.0.0+ automatically downloads the SDK dependency. But it's hard to tell from this stacktrace why that might be happening.

For now, if you already have your own cloud sdk installed, you can point to it using the

appengine {
  tools {
    cloudSdkHome = "<path to my sdk>"
  }
  ...
}

What version of gradle are you using? And what environment (windows/mac/?)?

I am using Gradle 5.2.1 and am on Ubuntu Linux 18.10.

I can't set the cloudSdkHome variable in my build.gradle because it is checked into source control and shared with other people who may have the SDK in a different location. So, for now I will go back to version 1.3.5 of the plugin. Let me know if there are any further tests I can do to help figure out what is going on.

I just tested it on a computer running Ubuntu 18.04 and it seems to work there, but there could be other differences between the two systems.

commented

Hrmm... okay I'll try to see if I can reproduce. One thing to try is to see what the cloud sdk is returning, it's a little involved.

  1. First find the managed-cloud-sdk directory. Our default is:
~/.cache/google-cloud-tools-java/managed-cloud-sdk
  1. go into LATEST/google-cloud-sdk to get into the cloud sdk home directory.
  2. From there you can run the same command we use to see if a component is installed:
./bin/gcloud components list --only-local-state --format=json --filter=id:app-engine-java

Can you include the output for that in the broken build?

Our expectation is that it will print something like this for a component that is not installed:

Your current Cloud SDK version is: 238.0.0
[]

but maybe your system is printing one that isn't valid parseable json?

If the component is installed it will print something like:

Your current Cloud SDK version is: 238.0.0
[
  {
    "current_version_string": "1.9.72",
    "id": "app-engine-java",
    "is_configuration": false,
    "is_hidden": false,
    "name": "gcloud app Java Extensions",
    "size": null
  }
]

When I do that, I get no output. If I run the same command, except use the version that is installed in /usr/bin, then I get the expected output.

I looked at what's in the bin directory of the version in LATEST, and all of the files are zero bytes.

~/.cache/google-cloud-tools-java/managed-cloud-sdk/LATEST/google-cloud-sdk/bin$ ls -l
total 4
drwxr-xr-x 2 anbuck anbuck 4096 Mar 17 23:52 bootstrapping
-rwxr-xr-x 1 anbuck anbuck 0 Sep 24 11:42 bq
-rwxr-xr-x 1 anbuck anbuck 0 Mar 17 23:52 dev_appserver.py
-rwxr-xr-x 1 anbuck anbuck 0 Sep 24 11:42 docker-credential-gcloud
-rwxr-xr-x 1 anbuck anbuck 0 Mar 17 23:52 endpointscfg.py
-rwxr-xr-x 1 anbuck anbuck 0 Mar 17 23:52 gcloud
-rwxr-xr-x 1 anbuck anbuck 0 Sep 24 11:42 git-credential-gcloud.sh
-rwxr-xr-x 1 anbuck anbuck 0 Sep 24 11:42 gsutil
-rwxr-xr-x 1 anbuck anbuck 0 Mar 17 23:52 java_dev_appserver.sh

commented

Oh wow, must have been a botched installation or botched update? Can you delete LATEST and try again?

Yep, it works now. Maybe I hit Ctrl-C at just the right time the first time I ran the build? I don't remember. I still don't understand why those files in the LATEST directory are zero bytes though. Why would they all be created first and then populated with data later?

commented

we mostly delegate to the cloud sdk here. Maybe @vilasj might have some insight. Eitherway, we shouldn't be throwing a null pointer exception. Will mark this as a bug for now, so we can error more gracefully.

commented

I am using Gradle 5.2.1 on Ubuntu Linux 18.10 too and stuck with the same issue.

Seems like my installation is ok:

gcloud components list --only-local-state --format=json --filter=id:app-engine-java

Your current Cloud SDK version is: 239.0.0
[
  {
    "current_version_string": "1.9.72",
    "id": "app-engine-java",
    "is_configuration": false,
    "is_hidden": false,
    "name": "gcloud app Java Extensions",
    "size": null
  }
]
gcloud info

Google Cloud SDK [239.0.0]

Platform: [Linux, x86_64] ('Linux', 'ltp-e480', '4.18.0-16-generic', '#17-Ubuntu SMP Fri Feb 8 00:06:57 UTC 2019', 'x86_64', 'x86_64')
Python Version: [2.7.15+ (default, Oct  2 2018, 22:12:08)  [GCC 8.2.0]]
Python Location: [/usr/bin/python2]
Site Packages: [Disabled]

Installation Root: [/home/username/bin/google-cloud-sdk]
Installed Components:
  core: [2019.03.17]
  app-engine-python: [1.9.84]
  app-engine-java: [1.9.72]
  datalab: [20190116]
  app-engine-python-extras: [1.9.74]
  beta: [2019.02.22]
  gsutil: [4.37]
  cloud-datastore-emulator: [2.1.0]
  cbt: []
  alpha: [2019.02.22]
  bq: [2.0.42]
System PATH: [/home/username/.sdkman/candidates/visualvm/current/bin:/home/username/.sdkman/candidates/vertx/current/bin:/home/username/.sdkman/candidates/spark/current/bin:/home/username/.sdkman/candidates/kscript/current/bin:/home/username/.sdkman/candidates/kotlin/current/bin:/home/username/.sdkman/candidates/java/current/bin:/home/username/.sdkman/candidates/gradle/current/bin:/home/username/bin/google-cloud-sdk/bin:/home/username/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin]
Python PATH: [/home/username/bin/google-cloud-sdk/lib/third_party:/home/username/bin/google-cloud-sdk/lib:/usr/lib/python2.7:/usr/lib/python2.7/plat-x86_64-linux-gnu:/usr/lib/python2.7/lib-tk:/usr/lib/python2.7/lib-old:/usr/lib/python2.7/lib-dynload]
Cloud SDK on PATH: [True]
Kubectl on PATH: [False]

Installation Properties: [/home/username/bin/google-cloud-sdk/properties]
User Config Directory: [/home/username/.config/gcloud]
Active Configuration Name: [default]
Active Configuration Path: [/home/username/.config/gcloud/configurations/config_default]

Account: [*******@*******.iam.gserviceaccount.com]
Project: [*******]

Current Properties:
  [core]
    project: [*******]
    account: [*******@*******.iam.gserviceaccount.com]
    disable_usage_reporting: [True]
  [compute]
    region: [us-west1]
    zone: [us-west1-a]

Logs Directory: [/home/username/.config/gcloud/logs]
Last Log File: [/home/username/.config/gcloud/logs/2019.03.20/12.30.07.867981.log]

git: [git version 2.19.1]
ssh: [OpenSSH_7.7p1 Ubuntu-4ubuntu0.3, OpenSSL 1.0.2n  7 Dec 2017]

I noticed that my IDE (IntelliJ IDEA) highlights run block inside appengine { tools { ... } } with warning:

'run' in 'goovy.lang.Closure' cannot be applied to '(goovy.lang.Closure<java.lang.Void>)'

If I comment it out it I no longer get NPE from Gradle but it seems to be wrong an inconsistent with current 2.0.0-rc5 documentation.

IntelliJ IDEA info
IntelliJ IDEA 2019.1 Beta (Ultimate Edition)
Build #IU-191.6183.20, built on March 13, 2019
JRE: 1.8.0_202-release-1483-b39 amd64
JVM: OpenJDK 64-Bit Server VM by JetBrains s.r.o
Linux 4.18.0-16-generic
commented

@slavaatsig if you still have an issue, please open as a new one. It doesn't seem related to this.