自动化部署流程中如何集成 CDN 缓存刷新接口?

文章导读
在自动化部署流水线末尾调用 CDN 厂商提供的刷新预热 API,是解决静态资源更新后用户仍看到旧版本的最直接方案,适合静态资源频繁变动的站点。
📋 目录
  1. 核心难点:如何自动获取变更文件列表
  2. 厂商接口对接实战
  3. CI/CD 流水线集成 (GitHub Actions)
  4. 怎么验证是否生效
  5. 常见坑与风险
  6. 参考来源
A A

在自动化部署流水线末尾调用 CDN 厂商提供的刷新预热 API,是解决静态资源更新后用户仍看到旧版本的最直接方案,适合静态资源频繁变动的站点。

先说结论:部署脚本执行完毕后,立即触发 CDN 缓存清除接口。

  • 适合:静态资源(CSS/JS/图片)更新频繁的场景
  • 先准备:确认 CDN 厂商 API 权限密钥及调用频率限制
  • 验收:通过浏览器开发者工具检查响应头中的缓存状态

核心难点:如何自动获取变更文件列表

刷新全量域名成本高且风险大,最佳实践是仅刷新本次部署变更的文件。在 CI/CD 环境中,可以通过 Git 差异对比生成待刷新 URL 列表。

# 获取上一次提交到当前 HEAD 之间变更的文件路径
git diff `--name-only` HEAD~1 HEAD > changed_files.txt

# 过滤出静态资源并拼接为完整 URL (示例为 Bash)
while IFS= read -r file; do
  if [[ $file =~ \.(css|js|png|jpg)$ ]]; then
    echo "https://example.com/${file}"
  fi
done < changed_files.txt > purge_urls.txt

厂商接口对接实战

不同 CDN 厂商的认证机制差异较大。Cloudflare 支持直接通过 API Token 调用,而阿里云、腾讯云等国内厂商通常要求复杂的签名算法(HMAC-SHA1),强烈建议使用官方 SDK 而非直接 curl,以免签名错误导致鉴权失败或安全漏洞。

方案 A:Cloudflare (直接 API 调用)

curl -X POST "https://api.cloudflare.com/client/v4/zones/YOUR_ZONE_ID/purge_cache" \
  -H "Authorization: Bearer YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  `--data` '{"files": ["https://example.com/style.css"]}'

方案 B:阿里云 (Python SDK 示例)

from aliyunsdkcdn.request.v20180510.RefreshObjectCachesRequest import RefreshObjectCachesRequest
from aliyunsdkcore.client import AcsClient

client = AcsClient('', '', 'cn-hangzhou')
request = RefreshObjectCachesRequest()
request.set_ObjectPath(['https://example.com/style.css'])
request.set_ObjectType('File')
response = client.do_action_with_exception(request)

CI/CD 流水线集成 (GitHub Actions)

将刷新逻辑封装为独立 Step,确保部署成功后执行。注意将密钥配置为 Repository Secrets。

jobs:
  deploy:
    steps:
      - name: Purge CDN Cache
        if: success() && github.ref == 'refs/heads/main'
        run: |
          python purge_cdn.py
        env:
          CDN_API_KEY: ${{ secrets.CDN_API_KEY }}
          CDN_REGION: cn-hangzhou

怎么验证是否生效

1. 检查响应头
使用curl -I命令访问刚更新的资源。观察X-CacheCache-Control头。如果显示MISSbypass,说明请求已回源;如果显示HIT且内容已更新,说明刷新生效。

2. 强制刷新测试
在 incognito(无痕)模式下访问页面,避免本地浏览器缓存干扰。对比源站文件哈希值与 CDN 返回内容是否一致。

自动化部署流程中如何集成 CDN 缓存刷新接口?

3. 查看 CDN 控制台
部分厂商控制台提供“刷新任务”查询页面,可确认任务状态是否为“完成”。

常见坑与风险

1. 接口调用频率限制
不同厂商限流策略差异较大,例如阿里云单用户 QPS 限制通常为 100,具体请查阅对应文档并配置重试机制。如果在短时间内高频部署,可能触发限流导致刷新失败,需实现指数退避重试。

2. 刷新范围过大
尽量刷新具体 URL,不要习惯性地刷新整个域名(Directory 或 Domain 级别)。全量刷新会导致所有节点回源,可能引发源站压力激增甚至被误判为攻击。

3. 密钥泄露风险
CI/CD 日志中严禁打印密钥或完整请求头。确保脚本中涉及认证信息的变量不被echo出来。

4. 签名算法复杂度
国内厂商 API 通常涉及时间戳、nonce 及签名计算,自行实现 curl 请求极易出错。生产环境务必使用官方维护的 SDK,避免手动拼接签名参数。

5. 费用问题
部分 CDN 服务商对 API 刷新操作收费,尤其是高频调用或大目录刷新。建议先确认计费规则,避免产生意外账单。

参考来源

  • 阿里云 CDN API 文档 - RefreshObjectCaches,URL: https://help.aliyun.com/zh/cdn/developer-reference/refreshobjectcaches
  • 腾讯云 CDN API 文档 - PurgeUrlsCache,URL: https://cloud.tencent.com/document/api/228/17410
  • Cloudflare Cache Purge API,URL: https://developers.cloudflare.com/cache/how-to/purge-cache/