9

I am struggling with Google App Engine. All I want to do is this:

I am following the exact steps of the tutorials. I have tried several times now. The app builds fine in Jenkins (I manage to get it running) however the deployment fails.

+ gcloud --project=MyProject preview app deploy target/guestbook-1.0-SNAPSHOT.war
ERROR: File [/var/jenkins/workspace/MyProject/target/guestbook-1.0-SNAPSHOT.war] is not a valid deployable item.
ERROR: (gcloud.preview.app.deploy) Errors occurred while parsing the App Engine app configuration: 
Build step 'Execute shell' marked build as failure
Finished: FAILURE

It all works fine on the local development web server. The MyProject is the project id (I just changed it for the example). What am I doing wrong. I mean have I forgotten to do something? I have been doing Java for over five years now, I can't understand why it should be so hard to do something so basic. Please help me

From Jenkins:

Started by user User Name
Building remotely on cloud-dev-java in workspace /var/jenkins/workspace/MyGuestbook
 > git rev-parse --is-inside-work-tree # timeout=10
Fetching changes from the remote Git repository
 > git config remote.origin.url https://source.developers.google.com/p/MyProject # timeout=10
Fetching upstream changes from https://source.developers.google.com/p/MyProject
 > git --version # timeout=10
using .gitcredentials to set credentials
 > git config --local credential.helper store --file=/tmp/git7191806817673001841.credentials # timeout=10
 > git fetch --tags --progress https://source.developers.google.com/p/MyProject +refs/heads/*:refs/remotes/origin/*
 > git config --local --remove-section credential # timeout=10
 > git rev-parse refs/remotes/origin/master^{commit} # timeout=10
 > git rev-parse refs/remotes/origin/origin/master^{commit} # timeout=10
Checking out Revision 2bf8419a93275dc87adb7be00d1fda9e6efc773b (refs/remotes/origin/master)
 > git config core.sparsecheckout # timeout=10
 > git checkout -f 2bf8419a93275dc87adb7be00d1fda9e6efc773b
 > git rev-list 9d2cd477ad8fcb6f210bd2418e8f708e5c5167f9 # timeout=10
[MyGuestbook] $ mvn clean test package
[INFO] Scanning for projects...
[INFO]                                                                         
[INFO] ------------------------------------------------------------------------
[INFO] Building myapp 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ myapp ---
[INFO] Deleting /var/jenkins/workspace/MyGuestbook/target
[INFO] 
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ myapp ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory /var/jenkins/workspace/MyGuestbook/src/main/resources
[INFO] 
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ myapp ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 2 source files to /var/jenkins/workspace/MyGuestbook/target/myapp-1.0-SNAPSHOT/WEB-INF/classes
[INFO] 
[INFO] --- versions-maven-plugin:2.1:display-dependency-updates (default) @ myapp ---
[INFO] The following dependencies in Dependencies have newer versions:
[INFO]   com.google.appengine:appengine-api-1.0-sdk ......... 1.9.17 -> 1.9.17a
[INFO]   com.google.appengine:appengine-api-stubs ........... 1.9.17 -> 1.9.17a
[INFO]   com.google.appengine:appengine-testing ............. 1.9.17 -> 1.9.17a
[INFO]   javax.servlet:servlet-api ......................... 2.5 -> 3.0-alpha-1
[INFO]   junit:junit ...................................... 4.12-beta-1 -> 4.12
[INFO]   org.mockito:mockito-all ............................. 1.9.5 -> 1.10.17
[INFO] 
[INFO] 
[INFO] --- versions-maven-plugin:2.1:display-plugin-updates (default) @ myapp ---
[INFO] 
[INFO] The following plugin updates are available:
[INFO]   com.google.appengine:appengine-maven-plugin ....... 1.9.17 -> 1.9.17a
[INFO]   maven-compiler-plugin .................................... 3.1 -> 3.2
[INFO]   maven-war-plugin ......................................... 2.4 -> 2.5
[INFO] 
[WARNING] The following plugins do not have their version specified:
[WARNING]   maven-clean-plugin ........................ (from super-pom) 2.6.1
[WARNING]   maven-deploy-plugin ....................... (from super-pom) 2.8.2
[WARNING]   maven-install-plugin ...................... (from super-pom) 2.5.2
[WARNING]   maven-resources-plugin ...................... (from super-pom) 2.7
[WARNING]   maven-site-plugin ........................... (from super-pom) 3.4
[WARNING]   maven-surefire-plugin ...................... (from super-pom) 2.18
[INFO] 
[INFO] Project defines minimum Maven version as: 3.1.0
[INFO] Plugins require minimum Maven version of: 3.1.0
[INFO] Note: the super-pom from Maven 3.1.0 defines some of the plugin
[INFO]       versions and may be influencing the plugins required minimum Maven
[INFO]       version.
[INFO] 
[INFO] No plugins require a newer version of Maven than specified by the pom.
[INFO] 
[INFO] 
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ myapp ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory /var/jenkins/workspace/MyGuestbook/src/test/resources
[INFO] 
[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ myapp ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 2 source files to /var/jenkins/workspace/MyGuestbook/target/test-classes
[WARNING] /var/jenkins/workspace/MyGuestbook/src/test/java/com/mycompany/myapp/GuestbookServletTest.java: Some input files use or override a deprecated API.
[WARNING] /var/jenkins/workspace/MyGuestbook/src/test/java/com/mycompany/myapp/GuestbookServletTest.java: Recompile with -Xlint:deprecation for details.
[INFO] 
[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ myapp ---
[INFO] Surefire report directory: /var/jenkins/workspace/MyGuestbook/target/surefire-reports

-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running com.mycompany.myapp.GuestbookServletTest
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.702 sec
Running com.mycompany.myapp.SignGuestbookServletTest
Dec 22, 2014 5:32:44 PM com.google.appengine.api.datastore.dev.LocalDatastoreService init
INFO: Local Datastore initialized: 
    Type: Master/Slave
    Storage: In-memory
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.456 sec

Results :

Tests run: 2, Failures: 0, Errors: 0, Skipped: 0

[INFO] 
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ myapp ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory /var/jenkins/workspace/MyGuestbook/src/main/resources
[INFO] 
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ myapp ---
[INFO] Nothing to compile - all classes are up to date
[INFO] 
[INFO] --- versions-maven-plugin:2.1:display-dependency-updates (default) @ myapp ---
[INFO] The following dependencies in Dependencies have newer versions:
[INFO]   com.google.appengine:appengine-api-1.0-sdk ......... 1.9.17 -> 1.9.17a
[INFO]   com.google.appengine:appengine-api-stubs ........... 1.9.17 -> 1.9.17a
[INFO]   com.google.appengine:appengine-testing ............. 1.9.17 -> 1.9.17a
[INFO]   javax.servlet:servlet-api ......................... 2.5 -> 3.0-alpha-1
[INFO]   junit:junit ...................................... 4.12-beta-1 -> 4.12
[INFO]   org.mockito:mockito-all ............................. 1.9.5 -> 1.10.17
[INFO] 
[INFO] 
[INFO] --- versions-maven-plugin:2.1:display-plugin-updates (default) @ myapp ---
[INFO] 
[INFO] The following plugin updates are available:
[INFO]   com.google.appengine:appengine-maven-plugin ....... 1.9.17 -> 1.9.17a
[INFO]   maven-compiler-plugin .................................... 3.1 -> 3.2
[INFO]   maven-war-plugin ......................................... 2.4 -> 2.5
[INFO] 
[WARNING] The following plugins do not have their version specified:
[WARNING]   maven-clean-plugin ........................ (from super-pom) 2.6.1
[WARNING]   maven-deploy-plugin ....................... (from super-pom) 2.8.2
[WARNING]   maven-install-plugin ...................... (from super-pom) 2.5.2
[WARNING]   maven-resources-plugin ...................... (from super-pom) 2.7
[WARNING]   maven-site-plugin ........................... (from super-pom) 3.4
[WARNING]   maven-surefire-plugin ...................... (from super-pom) 2.18
[INFO] 
[INFO] Project defines minimum Maven version as: 3.1.0
[INFO] Plugins require minimum Maven version of: 3.1.0
[INFO] Note: the super-pom from Maven 3.1.0 defines some of the plugin
[INFO]       versions and may be influencing the plugins required minimum Maven
[INFO]       version.
[INFO] 
[INFO] No plugins require a newer version of Maven than specified by the pom.
[INFO] 
[INFO] 
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ myapp ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory /var/jenkins/workspace/MyGuestbook/src/test/resources
[INFO] 
[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ myapp ---
[INFO] Nothing to compile - all classes are up to date
[INFO] 
[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ myapp ---
[INFO] Skipping execution of surefire because it has already been run for this configuration
[INFO] 
[INFO] --- maven-war-plugin:2.4:war (default-war) @ myapp ---
[INFO] Packaging webapp
[INFO] Assembling webapp [myapp] in [/var/jenkins/workspace/MyGuestbook/target/myapp-1.0-SNAPSHOT]
[INFO] Processing war project
[INFO] Copying webapp webResources [/var/jenkins/workspace/MyGuestbook/src/main/webapp/WEB-INF] to [/var/jenkins/workspace/MyGuestbook/target/myapp-1.0-SNAPSHOT]
[INFO] Copying webapp resources [/var/jenkins/workspace/MyGuestbook/src/main/webapp]
[INFO] Webapp assembled in [154 msecs]
[INFO] Building war: /var/jenkins/workspace/MyGuestbook/target/myapp-1.0-SNAPSHOT.war
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 12.355s
[INFO] Finished at: Mon Dec 22 17:32:47 UTC 2014
[INFO] Final Memory: 20M/56M
[INFO] ------------------------------------------------------------------------
[MyGuestbook] $ /bin/sh -xe /tmp/hudson5523568617447680772.sh
+ gcloud --project=MyProject preview app deploy target/myapp-1.0-SNAPSHOT.war
ERROR: File [/var/jenkins/workspace/MyGuestbook/target/myapp-1.0-SNAPSHOT.war] is not a valid deployable item.
ERROR: (gcloud.preview.app.deploy) Errors occurred while parsing the App Engine app configuration: 
Build step 'Execute shell' marked build as failure
Finished: FAILURE

appengine-web.xml:

<?xml version="1.0" encoding="utf-8"?>
<appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
    <application>MyProject</application>
    <version>${appengine.app.version}</version>
    <threadsafe>true</threadsafe>

    <system-properties>
        <property name="java.util.logging.config.file" value="WEB-INF/logging.properties"/>
    </system-properties>
</appengine-web-app>

What am I doing wrong, am I missing something? I have followed the guides exactly as they say.

I have tried to using Google Source as repository and Github. Nothing works.

EDIT:

It works:

Updating module [default] from file [/tmp/appcfgpyASfUun/app.yaml]
09:15 PM Host: appengine.google.com
09:15 PM Application: esoteric-cab-803; version: 1
09:15 PM 
Starting update of app: esoteric-cab-803, version: 1
09:15 PM Getting current resource limits.
09:15 PM Scanning files on local disk.
09:15 PM Cloning 6 application files.
09:15 PM Uploading 3 files and blobs.
09:15 PM Uploaded 3 files and blobs.
09:15 PM Compilation starting.
09:15 PM Compilation completed.
09:15 PM Starting deployment.
09:15 PM Checking if deployment succeeded.
09:15 PM Deployment successful.
09:15 PM Checking if updated app version is serving.
09:15 PM Completed update of app: esoteric-cab-803, version: 1
Finished: SUCCESS

What a wonderful sight!

LuckyLuke
  • 47,771
  • 85
  • 270
  • 434

1 Answers1

5

It's failing to deploy because your jenkins build script is failing:

Build step 'Execute shell' marked build as failure

During the step "Execute shell", you have to make sure that the script returns with status 0. Anything else is considered failure. See this SO answer to a similar issue.

It appears that your "Execute shell" section is this one:

[MyGuestbook] $ /bin/sh -xe /tmp/hudson5523568617447680772.sh
+ gcloud --project=MyProject preview app deploy target/myapp-1.0-SNAPSHOT.war
ERROR: File [/var/jenkins/workspace/MyGuestbook/target/myapp-1.0-SNAPSHOT.war] is not a valid deployable item.
ERROR: (gcloud.preview.app.deploy) Errors occurred while parsing the App Engine app configuration: 
Build step 'Execute shell' marked build as failure
Finished: FAILURE

This "Execute shell" sections of the build is failing because the status code returned from the script seems to be the status code returned from gcloud command. If you check the docs here, you can see that it doesn't accept .war archives, but only unpacked war folders. You can simply change the line from

gcloud --project=MyProject preview app deploy target/myapp-1.0-SNAPSHOT.war

to

gcloud --project=MyProject preview app deploy target/myapp-1.0-SNAPSHOT

and at this point, the "Execute shell" section of the build will run properly, and so the jenkins build as a whole should complete correctly.

Gradle

If you're using gradle for the build, it is likely already producing an exploded app directory:

build/exploded-app
Community
  • 1
  • 1
Nick
  • 3,581
  • 1
  • 14
  • 36
  • 1
    Man of the year is: @anonymous4444! I have almost lost all my hair the past days because of this. Thank you so much. So the documentation is wrong at Google. – LuckyLuke Dec 23 '14 at 21:17
  • 1
    Ah great! I'm so glad to hear this worked out for you. Out of interest, could you link the docs page that referred you to use the `.war` file instead of the WAR-structured folder? (PS - send bounty plox?) – Nick Dec 23 '14 at 21:27
  • 1
    You will get the bounty (I have to wait 12 hours before I can give it to you). Yes; https://cloud.google.com/tools/repo/push-to-deploy Search for: `gcloud --project= preview app deploy target/*.war` – LuckyLuke Dec 23 '14 at 21:29
  • 2
    Thanks so much, yeah I'm gonna use the "report documentation issue" link to flag this. Thanks for the confirm on the bounty send (delicious internet points) and good luck with your app. – Nick Dec 23 '14 at 21:30
  • 1
    One question though; It now works, but it doesn't seem like pushing changes cause Jenkins to start a new build. Do I need to do something special? – LuckyLuke Dec 23 '14 at 23:34
  • 1
    It works when I use the poll option, but that runs on intervals. Should push to Git also start a build? – LuckyLuke Dec 23 '14 at 23:52
  • 1
    You will need to go into "Releases" in the Developers Console under "Source Code" and configure the release pipeline there. If you linked your git repo, and you have selected "Java: Use Maven to build, test, and deploy", there's nothing left to do. Each time you push, the jenkins GCE instance will be spawned/supplied with your work, and it will build, test, and finally deploy your app. If your jenkins instance is somehow blocked, you could always try to delete it in the compute engine instances section. – Nick Dec 23 '14 at 23:58
  • 1
    Ah, so the release pipeline also needs to be configured for use togehter with Jenkins? – LuckyLuke Dec 24 '14 at 00:23
  • 1
    Let us [continue this discussion in chat](http://chat.stackoverflow.com/rooms/67582/discussion-between-anonymous4444-and-luckyluke). – Nick Dec 24 '14 at 00:24
  • Did any of you face any problems with Google's Jenkins instances that compile JSPs with JDK8? I'm constantly facing this error after deploying to GAE after building in their Jenkins: version 52.0, java.lang.UnsupportedClassVersionError: org/apache/jsp/index_jsp : Unsupported major.minor version 52.0] – the_marcelo_r Dec 26 '14 at 14:05
  • 1
    As far as I know Google App Engine requires that your code is compiled with Java 7. You need to change the JDK to 7 instead of 8. Optionally set the flag on JDK 8 to compile as 7. More info: http://stackoverflow.com/questions/16143684/can-java-8-code-be-compiled-to-run-on-java-7-jvm – LuckyLuke Dec 27 '14 at 20:19