做前端和运维的兄弟们,肯定都踩过这个坑:前端刚发了新版,结果用户反馈页面还是旧的,一查发现是CDN缓存没更新!手动去控制台一条条刷新缓存不仅效率低,还容易漏掉关键目录。今天分享一个我最近写进Jenkins流水线的Python脚本,完美解决了360CDN的自动化缓存刷新问题。

核心痛点:发版与缓存更新的“时间差”

传统发版流程中,代码部署和CDN缓存刷新是割裂的。往往代码已经上线,但CDN节点上还存留着旧的JS、CSS或HTML文件。这不仅会导致线上样式错乱,严重时甚至会引发生产事故。

实战方案:基于Git事件的自动化刷新

我的思路很简单:监听Git的提交事件,自动提取变更的文件目录,然后调用360CDN的官方API进行缓存清除。

核心代码实现

1import requests
2import hashlib
3import time
4
5# 360CDN API 配置
6API_KEY = "your_api_key"
7SECRET_KEY = "your_secret_key"
8REFRESH_URL = "https://openapi.360.cn/cdn/cache/refresh"
9
10def generate_signature(params, secret_key):
11    # 按照360CDN API文档要求生成签名
12    sorted_params = sorted(params.items())
13    sign_str = "&".join([f"{k}={v}" for k, v in sorted_params]) + secret_key
14    return hashlib.md5(sign_str.encode('utf-8')).hexdigest()
15
16def refresh_cdn_cache(dir_list):
17    timestamp = str(int(time.time()))
18    params = {
19        "api_key": API_KEY,
20        "timestamp": timestamp,
21        "type": "dir",  # 支持目录刷新
22        "urls": "\n".join(dir_list)
23    }
24    params["sign"] = generate_signature(params, SECRET_KEY)
25    
26    response = requests.post(REFRESH_URL, data=params)
27    if response.json().get("code") == 0:
28        print(" CDN缓存刷新任务提交成功!")
29    else:
30        print(f" 刷新失败: {response.text}")
31
32# 结合Jenkins或Git Hook使用
33if __name__ == "__main__":
34    # 假设从Git diff中提取出了变更目录
35    changed_dirs = ["/static/js/", "/static/css/"]
36    refresh_cdn_cache(changed_dirs)
避坑指南
  • 频率限制:CDN API通常有调用频率限制,建议在脚本中加入重试机制。
  • 目录格式:刷新目录时,路径必须以“/”结尾,否则API会报错。
  • 权限控制:API密钥务必妥善保管,建议在Jenkins中使用加密凭证存储。

总结:将CDN缓存刷新集成到CI/CD流程中,是实现“发版即生效”的关键一步。几行Python代码,就能彻底解放运维的双手!

更多推荐