How to set up a staging environment on Google App Engine

Viewed 16942

Having properly configured a Development server and a Production server, I would like to set up a Staging environment on Google App Engine useful to test new developed versions live before deploying them to production.

I know two different approaches:

A. The first option is by modifying the app.yaml version parameter.

version: app-staging

What I don't like of this approach is that Production data is polluted with my staging tests because (correct me if I'm wrong):

  1. Staging version and Production version share the same Datastore
  2. Staging version and Production version share the same logs

Regarding the first point, I don't know if it could be "fixed" using the new namespaces python API.

B. The second option is by modifying the app.yaml application parameter

application: foonamestaging

with this approach, I would create a second application totally independent from the Production version.
The only drawback I see is that I'm forced to configure a second application (administrators set up).
With a backup\restore tool like Gaebar this solution works well too.

What kind of approach are you using to set up a staging environment for your web application?
Also, do you have any automated script to change the yaml before deploying?

7 Answers

No need to create a separate project. You can use dispatch.yaml to route your staging URL to another service (staging) in the same project.

  1. Create a custom domain staging.yourdomain.com
  2. Create a separate app-staging.yaml, that specifies staging service.

    ... service: staging ...

  3. Create distpatch.yaml that contains something like

    ...

    • url: "*staging.mydomain.com/" service: staging

    • url: "*mydomain.com/" service: default ...

  4. gloud app deploy app-staging.yaml dispatch.yaml

Here is what the Google documentation says :

A general recommendation is to have one project per application per environment. For example, if you have two applications, "app1" and "app2", each with a development and production environment, you would have four projects: app1-dev, app1-prod, app2-dev, app2-prod. This isolates the environments from each other, so changes to the development project do not accidentally impact production, and gives you better access control, since you can (for example) grant all developers access to development projects but restrict production access to your CI/CD pipeline

With this in mind, add a dispatch.yaml file at the root directory, and in each directory or repository that represents a single service and contain that service, add a app.yaml file along with the associated source code, as explained here : Structuring web services in App Engine

Edit, check out the equivalent link in the python section if you're using python.

Related