blob: b22b8b571da559c33aa89d806187582456834cd7 [file] [log] [blame] [view]
---
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
* Run the application on 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:
<table class="table table-condensed table-striped">
<thead>
<tr>
<td>Name</td>
<td>Location</td>
</tr>
</thead>
<tbody>
<tr>
<td>Source file directory</td>
<td><code>src/main/java/com/google/bazel/example/app/</code></td>
</tr>
<tr>
<td>Web application metadata directory</td>
<td><code>webapp/WEB-INF/</code></td>
</tr>
</tbody>
</table>
## Update the WORKSPACE file
As with the Android app, you must add references to
[external dependencies](http://bazel.build/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 git\_repository 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
http_archive(
name = "io_bazel_rules_appengine",
sha256 = "f4fb98f31248fca5822a9aec37dc362105e57bc28e17c5611a8b99f1d94b37a4",
strip_prefix = "rules_appengine-0.0.6",
url = "https://github.com/bazelbuild/rules_appengine/archive/0.0.6.tar.gz",
)
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_repositories` 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.
In particular, the `appengine_war` rule generates scripts that you can use to
run your backend locally or deploy it to Google App Engine:
## Run the application on a local development server
Here, you'll start a local App Engine development server in your environment and
run your application on it.
To run the application, enter the following:
```bash
$ bazel-bin/backend/backend --port=12345
```
Your application will be available at `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 new Cloud Platform project and App Engine application using the Google Cloud
Platform Console.
Follow [this link](https://console.cloud.google.com/projectselector/appengine/create?lang=java&st=true)
to perform these actions.
To deploy the application, enter the following:
```bash
$ $WORKSPACE/bazel-bin/backend/backend.deploy <project-id>
```
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 <project-id>
```
Your application URL will be `http://<project-id>.appspot.com`.
## What's next
Now let's [review](review.md) the tutorial steps.