I am trying to understand the dispatch.yaml
file for Google App Engine.
We have a vanilla web app with a frontend and a backend. We also have a develop
The way I approached this problem is by using different repo branches for the application code.
master
branch version is deployed to my_app-dev
- the development environment appproduction
branch version is deployed to my_app
- the production environment appThis 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.
I also had the same problem as you and I come to offer you a 3rd solution. If you have several development environments, you may have an automatic deployment (for my part, with Gitlab-CI). I proceed as follows during my deployment internship, I copy (or rename) the dispatch file:
./gcp.dispatch.testing.yml
=> ./dispatch.yml
./gcp.dispatch.production.yml
=> ./dispatch.yml
Here is an example of a stage from my gitlab-ci.yml
file (for testing):
testing__deploy__gcp_dispatch:
stage: dispatch
image: google/cloud-sdk:alpine
script:
- cd ${CI_PROJECT_DIR}
- gcloud auth activate-service-account --key-file ${GCP_SERVICE_KEY_FILE}
- cp ./gcp.dispatch.testing.yml ./dispatch.yml
- gcloud --quiet --project ${GCP_PROJECT_ID} app deploy ./dispatch.yml
There you go !
PS:
I understood that after, where the error Unexpected attribute 'dispatch' for object of type AppInfoExternal.
came from. gcloud
does not accept that the file is named differently than dispatch.yml
...
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 stagingAnd 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
.