--- pid: 125 title: "Hugo使用GitHub Action自动刷新多吉云CDN缓存" date: "2024-09-16T14:48:42+08:00" slug: 125 draft: true categories: [] tags: [] author: "小赵同学" layout: "post" status: "hidden" categories: ["生活"] tags: [] --- 博客目前使用的方案是多吉云全站cdn缓存,使用git将hugo文件推送到github 大概一分钟GitHub Action自动部署完成,还需要去多吉云控制台手动刷新cdn缓存,长时间以来,感觉很不方便 这里特别感谢博友[永恒末匕](https://likaijian.com/)提供的方案 原方案地址:https://blog.cpen.top/posts/6f7759e0.html 这个方案虽然可以实现自动刷新的效果,但是有个弊端,也就是多吉云key令牌会直接暴露出来,只能把仓库设置为私有,不太灵活,今天下午花了点时间完善了一下,理论支持所有部署在GitHub的静态网站 ## 快速食用 在你的项目的根目录,新建一个`RefreshCDN.py`的文件,代码如下 ```python from hashlib import sha1 import hmac import requests import json import urllib import os def dogecloud_api(api_path, data={}, json_mode=False): """ 调用多吉云API。 :param api_path: 调用的 API 接口地址,包含 URL 请求参数 QueryString。 :param data: POST 的数据,字典格式。 :param json_mode: 数据 data 是否以 JSON 格式请求,默认为 false 则使用表单形式。 :return dict: 返回的数据。 """ access_key = os.environ.get('DOGECLOUD_ACCESS_KEY') # 从环境变量获取 AccessKey secret_key = os.environ.get('DOGECLOUD_SECRET_KEY') # 从环境变量获取 SecretKey if not access_key or not secret_key: raise ValueError("Access Key or Secret Key is not set in environment variables.") body = '' mime = '' if json_mode: body = json.dumps(data) mime = 'application/json' else: body = urllib.parse.urlencode(data) mime = 'application/x-www-form-urlencoded' sign_str = api_path + "\n" + body signed_data = hmac.new(secret_key.encode('utf-8'), sign_str.encode('utf-8'), sha1) sign = signed_data.digest().hex() authorization = 'TOKEN ' + access_key + ':' + sign response = requests.post('https://api.dogecloud.com' + api_path, data=body, headers={ 'Authorization': authorization, 'Content-Type': mime }) return response.json() # 从环境变量中获取 URL 列表,使用逗号分隔 url_list_env = os.environ.get('CDN_URL_LIST') if not url_list_env: raise ValueError("CDN_URL_LIST is not set in environment variables.") url_list = url_list_env.split(',') api = dogecloud_api('/cdn/refresh/add.json', { 'rtype': 'path', 'urls': json.dumps(url_list) }) if api['code'] == 200: print(api['data']['task_id']) else: print("API failed: " + api['msg']) ``` 创建你的 GitHub Actions 脚本,在项目根目录创建 `.github/workflows` 目录,如果有该目录请忽略 接下来在`.github/workflows` 目录下新建 `RefreshCDN.yml`文件 yml文件配置如下 ```yml name: Refresh CDN on: push: branches: - main jobs: refresh-cdn: runs-on: ubuntu-latest steps: - name: 检出代码 uses: actions/checkout@v2 - name: 安装 Python uses: actions/setup-python@v2 with: python-version: '3.x' - name: 安装依赖 run: pip install requests - name: 等待源站部署 run: sleep 1m # 这里用了个笨办法,等待 1 分钟后进行刷新 - name: 刷新 CDN run: python RefreshCDN.py env: DOGECLOUD_ACCESS_KEY: ${{ secrets.DOGECLOUD_ACCESS_KEY }} DOGECLOUD_SECRET_KEY: ${{ secrets.DOGECLOUD_SECRET_KEY }} CDN_URL_LIST: ${{ secrets.CDN_URL_LIST }} ``` 然后在你的GitHub项目仓库页面 依次进入 `Settings` -> `Secrets and variables` -> `Actions` -> `New repository secret` 创建三个密钥键值对,分别为 `CDN_URL_LIST`:值为 URL 列表,使用逗号分隔 例如:https://usj.cc/,https://5b2.cn/ `DOGECLOUD_ACCESS_KEY`:填入你的 AccessKeys `DOGECLOUD_SECRET_KEY`:填入你的 SecretKey 多吉云密钥获取请访问:https://console.dogecloud.com/user/keys 按照如上步骤,设置完毕,你的仓库得有如下三个字段 ![f2736183148b132aea6cb14908e8e86](/pics/hugo/dogeyun-auto-refresh-cdn/f2736183148b132aea6cb14908e8e86.png) 执行git提交,脚本就可以自动刷新多吉云缓存了 ![48dad6112a4e2110c95b04111084309](/pics/hugo/dogeyun-auto-refresh-cdn/48dad6112a4e2110c95b04111084309.png) 去多吉云控制台看看刷新预热,这样就是成功了