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 是无法删除的。

正合我意。