--- layout: documentation title: Tutorial - Build the Backend Server --- # Tutorial - Build the Backend Server The backend server is a simple web application that runs on Google App Engine and responds to incoming HTTP requests from the sample Android and iOS apps. Here, you'll do the following: * Review the source files for the app * Update the `WORKSPACE` file * Create the `appengine.BUILD` file * Create a `BUILD` file * Run the build * Find the build outputs * Deploy to a local development server * Deploy to Google App Engine Bazel provides a set of [App Engine build rules](/docs/be/appengine.html) written using the [Skylark](/docs/skylark/index.html) framework. You'll use these in the steps below to build the application. ## Review the source files The source files for the backend server are located in `$WORKSPACE/backend/`. The key files and directories are:
Name Location
Source file directory src/main/java/com/google/bazel/example/app/
Web application metadata directory webapp/WEB-INF/
## Update the WORKSPACE file As with the Android app, you must add references to [external dependencies](http://bazel.io/docs/external.html) to your `WORKSPACE` file. For the backend server, these are references to the App Engine SDK, the Java Servlet SDK and other libraries needed to build the App Engine applications. ### Add a new\_http\_archive rule When you built the Android app, you added a reference to the location on your filesystem where you downloaded and installed the Android SDK. For the backend server, however, you'll give Bazel instructions for downloading the required App Engine SDK package from a remote server. This is optional. You can also download and install the SDK manually on your filesystem and reference it from that location as described in the [App Engine rule documentation](/docs/be/appengine.html). Add the following to your `WORKSPACE` file: ```python git_repository( name = "io_bazel_rules_appengine", remote = "https://github.com/bazelbuild/rules_appengine.git", tag = "0.0.2", ) load("@io_bazel_rules_appengine//appengine:appengine.bzl", "appengine_repositories") appengine_repositories() ``` [`git_repository`](/docs/be/workspace.html#git_repository) downloads the AppEngine rules from GitHub, then the next two lines use the `appengine_repostories` function defined in these rules to download the libraries and SDK needed to build AppEngine applications. Now, save and close the file. You can compare your `WORKSPACE` file to the [completed example](https://github.com/bazelbuild/examples//blob/master/tutorial/WORKSPACE) in the `master` branch of the GitHub repo. ## Create a BUILD file Now that you have set up the external dependencies, you can go ahead and create the `BUILD` file for the backend server, as you did previously for the sample Android and iOS apps. Open your new `BUILD` file for editing: ```bash $ vi $WORKSPACE/backend/BUILD ``` ### Add a java_binary rule Add the following to your `BUILD` file: ```python java_binary( name = "app", srcs = glob(["src/main/java/**/*.java"]), main_class = "does.not.exist", deps = [ "@io_bazel_rules_appengine//appengine:javax.servlet.api", ], ) ``` The [`java_binary`](/docs/be/java.html#java_binary) tells Bazel how to build a Java `.jar` library for your application, plus a wrapper shell script that launches the application code from the specified main class. Here, we're using this rule instead of the [`java_library`](/docs/be/java.html#java_library) because we need the `.jar` file to contain all the dependencies required to build the final App Engine `.war` file. For this reason, we specify a bogus class name for the `main_class` attribute. ### Add an appengine_war rule Add the following to your `BUILD` file: ```python load("@io_bazel_rules_appengine//appengine:appengine.bzl", "appengine_war") appengine_war( name = "backend", data = [":webapp"], data_path = "/backend/webapp", jars = [":app_deploy.jar"], ) filegroup( name = "webapp", srcs = glob(["webapp/**/*"]), ) ``` The [`appengine_war`](/docs/be/appengine.html#appengine_war) rule builds the final App Engine `war` file from the library `.jar` file and web application metadata files in the `webapp` directory. Save and close the file. Again, the [completed example](https://github.com/google/bazel-examples/blob/master/tutorial/backend/BUILD) is in the `master` branch of the GitHub repo. ## Run the build Make sure that your current working directory is inside your Bazel workspace: ```bash $ cd $WORKSPACE ``` Now, enter the following to build the sample app: ```bash $ bazel build //backend:backend ``` Bazel now launches and builds the sample app. During the build process, its output will appear similar to the following: ```bash INFO: Found 1 target... Target //backend:backend up-to-date: bazel-bin/backend/backend.war bazel-bin/backend/backend.deploy bazel-bin/backend/backend INFO: Elapsed time: 56.867s, Critical Path: 2.72s ``` ## Find the build outputs The `.war` file and other outputs are located in the `$WORKSPACE/bazel-bin/backend` directory. ## Deploy to a local development server The `appengine_war` rule generates an upload script that you can use to deploy your backend server on Google App Engine. Here, you'll start a local App Engine development server in your environment and deploy your application there. To deploy the application, enter the following: ```bash $ bazel-bin/backend/backend --port=12345 ``` Your application URL will be `http://localhost:12345` ## Deploy to Google App Engine You can also deploy the application to the live App Engine serving environment on Google Cloud Platform. For this scenario, you must first create a project in the [Google Developers Console](https://console.developers.google.com). To deploy the application, enter the following: ```bash $ $WORKSPACE/bazel-bin/backend/backend.deploy ``` The deployment script prompts you to authorize access to Google Cloud Platform. After you have authorized access the first time, you can deploy the application using the `bazel` command and the following rule target: ```bash $ bazel run //backend:backend.deploy ``` Your application URL will be `http://.appspot.com`. ## What's next Now let's [review](review.md) the tutorial steps.