快速删除 Cloudflare Pages 的旧部署
CF Pages 虽然自动部署很爽,但部署次数多了以后,浩如烟海的旧部署实在是删不过来。
看了 CF 自家的 API 文档,不难,就是获取和删除罢了。
但是文档里面的鉴权方式似乎有点问题,然后从这里找到了线索。
前置准备
把 account ID 和 project name 定好以后,使用带有 workers 写权限的 API key 就可以操作了。
API Token 用这个模版就行了。
上面的 Token 能力不动,就不截图了,这边的范围自己调。
实现方式
其实就是下面两个 curl 指令。
可以一次获取所有部署的列表:
curl https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/pages/projects/$PROJECT_NAME/deployments \
-H "Authorization: Bearer $CLOUDFLARE_API_KEY" \
-H "Content-Type:application/json"
指定 id,删除单个部署:
curl https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/pages/projects/$PROJECT_NAME/deployments/$DEPLOYMENT_ID \
-X DELETE \
-H "Authorization: Bearer $CLOUDFLARE_API_KEY" \
-H "Content-Type:application/json"
拿到的 json 里面比较重要的部分长这样:

因为 response 是 json 格式,直接 shell 提取起来比较困难,那就用 py 写吧。
只要把 deployment 的 uuid,也就是打头的 id 给填上就可以了。
看起来所有 deployment 的列表是按提交时间排序的,最新的在最前面。

鉴权信息,事先加入到环境变量
export CLOUDFLARE_ACCOUNT_ID=<YOUR_ACCOUNT_ID>
export CLOUDFLARE_API_KEY=<YOUR_API_KEY>
#export CLOUDFLARE_PROJECT_NAME=<YOUR_PROJECT_NAME>
然后单文件 python 就行了
import requests
import os
account_id = os.environ.get("CLOUDFLARE_ACCOUNT_ID")
api_key = os.environ.get("CLOUDFLARE_API_KEY")
# project_name = os.environ.get("CLOUDFLARE_PROJECT_NAME")
project_names = [
"proj1",
"proj2",
]
for project_name in project_names:
print(f"Commencing {project_name}: ")
base_url = f"https://api.cloudflare.com/client/v4/accounts/{account_id}/pages/projects/{project_name}/deployments"
headers = {
"Authorization": f"Bearer {api_key}",
"Content-Type": "application/json"
}
# get all deployment ids
response = requests.get(base_url, headers=headers)
data = response.json()
deployment_ids = [entry["id"] for entry in data.get("result", [])]
# delete each deployment
for deployment_id in deployment_ids:
delete_url = f"{base_url}/{deployment_id}"
del_response = requests.delete(delete_url, headers=headers)
print(f"Deleted {deployment_id}: {del_response.status_code}")
结果
效果还不错,但是为什么有 400 呢?

当前 Production 或者 Preview 使用的 deployment 是无法删除的。
正合我意。

All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
Comment