Cloudflare 的 Wrangler CLI 是部署 Workers上传资源或发布静态网站的强大工具。在服务器容器或 CI/CD 中,我们常常不希望维护 wrangler.toml 配置文件,而是依赖环境变量和命令行参数来完成登录和部署。

本文详细介绍:

  • 两种 Wrangler 登录方式(无需配置文件)
  • 如何用命令行参数部署 Worker 或上传到 Cloudflare Pages
  • 一个完整的 Python 脚本示例:自动上传 HTML 文件到 Cloudflare Pages,并清理临时文件

1. Wrangler 登录方式(无需配置文件)

安装wrangler

npm install -g wrangler

1.1 浏览器交互式登录(本地开发)

适用于本地环境,需浏览器。

wrangler login
  • 会弹出浏览器窗口,登录成功后保存凭据。
  • 不适用于服务器/容器

1.2 API Token 登录(自动化首选)

适用于服务器DockerCI/CD,无需浏览器或交互。

创建 API Token

  1. 打开 Cloudflare API Tokens
  2. 创建自定义 Token,权限配置如下
权限 级别
用户 -> 成员资格 读取
账户 -> Cloudflare Pages 编辑
账户 -> Workers 脚本 编辑
  1. 保存 Token 字符串(不可恢复)。

设置环境变量

export CLOUDFLARE_API_TOKEN=你的token字符串

CI/CD 环境中建议在 .env 文件或环境配置中设置此变量。

验证登录成功

wrangler whoami

显示账户信息则认证成功。


2. 部署方式一:无 wrangler.toml 部署 Worker 脚本

使用命令行参数部署脚本:

wrangler deploy index.js \
  --name your-worker-name \
  --account-id 你的账户ID \
  --compatibility-date 2025-08-02

关键参数说明:

参数 说明
--name Worker 名称
--account-id Cloudflare 账户 ID,可从仪表板获取
--compatibility-date 推荐使用当天日期,确保最新兼容
脚本路径 直接传入入口 JS 文件路径

3. 部署方式二:上传到 Cloudflare Pages(无配置文件)

Cloudflare Pages 支持静态资源部署。无需配置文件,直接用 CLI 上传。

命令示例:

wrangler pages deploy ./dist \
  --project-name your-pages-project

必需参数:

参数 说明
路径 要上传的目录,例如 ./dist
--project-name Cloudflare Pages 项目名称,必须先在仪表板创建

4. Python 脚本:自动上传 HTML 文件到 Cloudflare Pages

适用于 CI/CD 自动上传,或容器中发布静态页面(如报告HTML 输出)。

✅ 支持功能:

  • 自动查找 wrangler 安装路径
  • 复制目标 HTML 为 index.html
  • 部署至指定 Cloudflare Pages 项目
  • 清理临时目录
  • 兼容无 GUI 的环境

🔧 需传入参数(可通过命令行或脚本默认值提供)

参数 说明 是否必需 示例
source_file 要上传的 HTML 文件路径,作为首页上传 python upload.py ./report.html

项目名 utils 默认写死在脚本内,如需更换请修改 project_name 变量。

上传命令: wrangler pages deploy temp_upload --project-name utils


📄 脚本内容(完整)

import os
import shutil
import subprocess
import sys

def check_wrangler_installed():
    """检查 wrangler 是否可以被系统找到"""
    try:
        subprocess.run(["wrangler" "--version"] capture_output=True text=True check=True)
        return True
    except FileNotFoundError:
        return False
    except subprocess.CalledProcessError:
        return False

def get_wrangler_path():
    """获取 wrangler 的安装路径"""
    try:
        result = subprocess.run(["where" "wrangler.cmd"] capture_output=True text=True check=True)
        return result.stdout.strip().split('\n')[0]
    except Exception:
        common_paths = [
            os.path.join(os.environ.get('USERPROFILE' '') 'AppData' 'Roaming' 'npm' 'wrangler.cmd')
            os.path.join(os.environ.get('APPDATA' '') 'npm' 'wrangler.cmd')
        ]
        for path in common_paths:
            if os.path.exists(path):
                return path
        return None

def upload_to_cloudflare(source_file):
    temp_dir = "temp_upload"
    temp_index = os.path.join(temp_dir "index.html")

    if not os.path.exists(source_file):
        print(f"❌ 源文件不存在: {source_file}")
        sys.exit(1)

    if not check_wrangler_installed():
        print("⚠️ 找不到 wrangler,尝试自动查找...")
        wrangler_path = get_wrangler_path()
        if not wrangler_path:
            print("❌ 无法找到 wrangler 安装路径,请手动指定")
            sys.exit(1)
        print(f"✅ 找到 wrangler 路径: {wrangler_path}")
    else:
        wrangler_path = "wrangler"

    if os.path.exists(temp_dir):
        shutil.rmtree(temp_dir)
    os.makedirs(temp_dir exist_ok=True)

    try:
        shutil.copyfile(source_file temp_index)
        print(f"✅ 复制到: {temp_index}")
    except Exception as e:
        print(f"❌ 复制失败: {str(e)}")
        sys.exit(1)

    project_name = "utils"
    cmd = [wrangler_path "pages" "deploy" temp_dir "--project-name" project_name]

    try:
        print("🚀 开始部署...")
        result = subprocess.run(cmd stdout=subprocess.PIPE stderr=subprocess.PIPE text=True check=True)
        print("✅ 上传成功!")
        print("🌐 地址: https://xxx.pages.dev/")
        print(result.stdout)
    except subprocess.CalledProcessError as e:
        print("❌ 上传失败:")
        print(e.stderr)
    finally:
        shutil.rmtree(temp_dir ignore_errors=True)
        print("🧹 清理完毕")

if __name__ == "__main__":
    if len(sys.argv) > 1:
        source_file = sys.argv[1]
    else:
        source_file = r"D:\mobile\plotculum\report.html"
    upload_to_cloudflare(source_file)

🧩 扩展建议

场景 建议
多文件部署 上传目录而非单个文件,支持 wrangler pages deploy ./output
CI/CD 用法 在 CI 配置中设定 CLOUDFLARE_API_TOKEN,调用 Python 脚本
参数灵活控制 argparse 支持传入 --project-name

总结

登录方式 适用场景 特点
浏览器 OAuth 本地开发 交互式,需浏览器,快捷
API Token 服务器CI/CD 脚本化,非交互式,支持环境变量认证
部署目标 命令行关键参数 说明
Worker --name--account-id脚本路径 可用命令行参数部署,无需 wrangler.toml
Cloudflare Pages --project-name资源目录路径 支持静态资源上传,适合报告站点等