How to use GAE's dispatch.yaml with multiple development environments?

前端 未结 3 474
清歌不尽
清歌不尽 2020-12-19 15:44

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

相关标签:
3条回答
  • 2020-12-19 16:17

    The way I approached this problem is by using different repo branches for the application code.

    • the master branch version is deployed to my_app-dev - the development environment app
    • the production branch version is deployed to my_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.

    0 讨论(0)
  • 2020-12-19 16:20

    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:

    • Testing: ./gcp.dispatch.testing.yml => ./dispatch.yml
    • Production: ./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...

    0 讨论(0)
  • 2020-12-19 16:25

    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:

    1. <project_root>/dispatch.yaml - for production
    2. <project_root>/deploy-staging/dispatch.yaml - for staging

    And now I can do cd <project_root> and then:

    1. gcloud --project <production> app deploy ./dispatch.yaml
    2. 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.

    0 讨论(0)
提交回复
热议问题