How to use GAE's dispatch.yaml with multiple development environments?
I know this is an old question, but I just discovered something interesting that will help everyone wanting to deploy to different environments.
After a lot of trial and error, I figured out that gcloud
requires the dispatch file given as parameter to be called dispatch.yaml
. If you call it anything else, like dispatch-staging.yaml
or dev-dispatch.yaml
it won't work.
However, and this is the trick I found, the file doesn't have to be in your project's root folder.
So, in our project I did this:
<project_root>/dispatch.yaml
- for production<project_root>/deploy-staging/dispatch.yaml
- for staging
And now I can do cd <project_root>
and then:
gcloud --project <production> app deploy ./dispatch.yaml
gcloud --project <staging> app deploy ./deploy-staging/dispatch.yaml
In other words, gcloud
doesn't care in what directory the dispatch.yaml
file is located as long as it is called dispatch.yaml
.
The way I approached this problem is by using different repo branches for the application code.
- the
master
branch version is deployed tomy_app-dev
- the development environment app - the
production
branch version is deployed tomy_app
- the production environment app
This way the file is always named dispatch.yaml
. The service names don't change between environments, but the custom domain names associated to them do - and that's reflected in the content of the dispatch.yaml
file in the 2 branches:
$ git diff production master -- dispatch.yaml
diff --git a/dispatch.yaml b/dispatch.yaml
index 0768a6a..c1326cf 100644
--- a/dispatch.yaml
+++ b/dispatch.yaml
@@ -1,14 +1,14 @@
-application: my_app
+application: my_app-dev
dispatch:
- - url: "service1.my_app.com/*"
+ - url: "service1-dev.my_app.com/*"
module: service1
- - url: "service1-dot-my_app.appspot.com/*"
+ - url: "service1-dot-my_app-dev.appspot.com/*"
module: service1
- url: "*/service1/*"
module: service1
- - url: "service2.my_app.com/*"
+ - url: "service2-dev.my_app.com/*"
module: service2
- - url: "service2-dot-my_app.appspot.com/*"
+ - url: "service2-dot-my_app-dev.appspot.com/*"
module: service2
Note: I'm implementing the different environments at the app level (as opposed to the service level, see Advantages of implementing CI/CD environments at GAE project/app level vs service/module level?). A service-level implementation cannot use this approach.