简体   繁体   中英

App Engine: Static Files Not Updating on Deploy

I pushed an HTML static file containing an Angular SPA as catch-all handler for my custom domain with this settings:

- url: /(api|activate|associate|c|close_fb|combine|import|password|sitemap)($|/.*)
  script: gae.php

- url: /.*
  static_files: public/static/app/v248/es/app.html
  upload: public/static/app/v248/es/app.html
  expiration: "1h"

That worked fine, but if I push a new app.html it doesn't update. I've tried to change the local path, deploy a new app version, even replacing the catch-all handler with a custom php endpoint, but it doesn't work, the response still is the first version of app.html I uploaded.

Other people has had the same problem ( CSS File Not Updating on Deploy (Google AppEngine) ), and it looks like is related to Google CDN cache but, as far as I know, there isn't any way to flush it.

There is a way to flush static files cached by your app on Google Cloud.

Head to your Google Cloud Console and open your project. Under the left hamburger menu, head to Storage -> Browser. There you should find at least one Bucket: your-project-name.appspot.com. Under the Lifecycle column, click on the link with respect to your-project-name.appspot.com. Delete any existing rules, since they may conflict with the one you will create now.

Create a new rule by clicking on the 'Add rule' button. For the object conditions, choose only the 'Newer version' option and set it to 1. Don't forget to click on the 'Continue' button. For the action, select 'Delete' and click on the 'Continue' button. Save your new rule.

This new rule will take up to 24 hours to take effect, but at least for my project it took only a few minutes. Once it is up and running, the version of the files being served by your app under your-project-name.appspot.com will always be the latest deployed , solving the problem. Also, if you are routinely editing your static files, you should remove any expiration element from handlers related to those static files and the default_expiration element from the app.yaml file, which will help avoid unintended caching by other servers.

When performing changes in static files in an App Engine application, changes will not be available immediately, due to cache , as you already imagined. The cache in Google Cloud cannot be manually flushed, so instead I would recommend you to change the expiration time to a shorter period (by default it is 10 minutes) if you want to test how it works, and later setting an appropriate expiration time according to your requirements.

Bear in mind that you can change the static cache expiration time both for all static files or for just the ones you choose , just by setting the proper element in the app.yaml file.

2020 Update:

For my application I found that App Engine started failing to detect my latest app deployments once I reached 50 Versions in my Versions list.

See (Burger Menu) -> App Engine -> Versions

After deleting a bunch of old versions on next deploy it picked up my latest changes immediately. Not sure if this is specific to my account or billing settings but that solved it for me.

I had my static files over a service in Google Cloud Platform. My problem was that I didn't execute

gcloud app deploy dispatch.yaml

Once executed, everything was fine. I hope it helps

Another problem that could be causing this is caching in Google's frontend, which depends on the cache header returned by your application. In my case, I opened Firefox's inspector on the Network tab, and saw that the stale file had a cache-control setting of 43200 seconds, ie 12 hours:

检查器选项卡的屏幕截图

This was for a file returned from Flask, so I fixed this by explicitly specifying max-age in the Flask response from my GAE code:

return flask.send_from_directory(directory, filename, max_age=600)

This causes intermediate caches such as Google's frontend to only cache the file for a period of 600 seconds (10 minutes).

Unfortunately, once a file has been caches there is no way to flush it, so you will have to wait out the 12 hours. But it will solve the problem for the next time.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM