Files
blog/content/post/auto-refresh-cdn.md
T

155 lines
4.6 KiB
Markdown
Raw Normal View History

2026-01-20 21:13:24 +08:00
---
pid: 125
2024-09-16 18:19:30 +08:00
title: "Hugo使用GitHub Action自动刷新多吉云CDN缓存"
date: "2024-09-16T14:48:42+08:00"
2026-01-20 21:13:24 +08:00
slug: 125
2026-01-21 12:34:55 +08:00
draft: true
2024-09-16 18:19:30 +08:00
categories: []
tags: []
author: "小赵同学"
layout: "post"
2024-09-19 23:11:46 +08:00
status: "hidden"
2024-09-18 23:02:12 +08:00
categories: ["生活"]
2024-09-16 18:19:30 +08:00
tags: []
---
博客目前使用的方案是多吉云全站cdn缓存,使用git将hugo文件推送到github
大概一分钟GitHub Action自动部署完成,还需要去多吉云控制台手动刷新cdn缓存,长时间以来,感觉很不方便
2024-09-16 18:28:23 +08:00
这里特别感谢博友[永恒末匕](https://likaijian.com/)提供的方案
原方案地址:https://blog.cpen.top/posts/6f7759e0.html
2024-09-16 18:19:30 +08:00
这个方案虽然可以实现自动刷新的效果,但是有个弊端,也就是多吉云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`
创建三个密钥键值对,分别为
2024-09-16 18:28:23 +08:00
`CDN_URL_LIST`:值为 URL 列表,使用逗号分隔
2024-09-16 18:19:30 +08:00
2024-09-18 08:29:42 +08:00
例如:https://usj.cc/,https://5b2.cn/
2024-09-16 18:19:30 +08:00
2024-09-16 18:44:46 +08:00
`DOGECLOUD_ACCESS_KEY`:填入你的 AccessKeys
2024-09-16 18:19:30 +08:00
2024-09-16 18:28:23 +08:00
`DOGECLOUD_SECRET_KEY`:填入你的 SecretKey
2024-09-16 18:19:30 +08:00
多吉云密钥获取请访问: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)
去多吉云控制台看看刷新预热,这样就是成功了