#!/usr/bin/env bash # 把 OTA 升级包 (bundle + latest.json) 上传到 Cloudflare R2 (公开桶, 前缀 store/ota/) # 用法: bash scripts/upload-ota-r2.sh # 默认 = ota-package # 说明: # - bundle 固定名 wardrobe-ota.tar.gz (与 build-ota.mjs 保持一致), 覆盖式上传 # - latest.json 一并上传, 便于把 R2 作为 OTA 静态存储 (配合 OTA_PUBLIC_BASE 使用) # # 依赖环境变量 (通常来自配置注册中心 CommonExternalService / cloudflare): # CF_API_TOKEN Cloudflare API token (r2/CF_API_TOKEN) # CF_R2_BUCKET (可选, 默认 store) # CF_R2_PUBLIC_URL (可选; 若设置, 同时输出可直接给 OTA_PUBLIC_BASE 使用的下载地址) set -euo pipefail OTA_DIR="${1:-ota-package}" BUNDLE="wardrobe-ota.tar.gz" HAS_BUNDLE=0 [ -f "$OTA_DIR/$BUNDLE" ] && HAS_BUNDLE=1 : "${CF_API_TOKEN:?缺少 CF_API_TOKEN (注册中心 key: r2/CF_API_TOKEN)}" export CLOUDFLARE_API_TOKEN="$CF_API_TOKEN" BUCKET="${CF_R2_BUCKET:-store}" CF_R2_PUBLIC_URL="${CF_R2_PUBLIC_URL:-https://pub-98ee77ce79984c2cad0dc1c300901158.r2.dev}" if ! command -v wrangler >/dev/null 2>&1; then echo "安装 wrangler ..." npm i -g wrangler fi if [ "$HAS_BUNDLE" = "1" ]; then echo "上传 ${BUCKET}/ota/${BUNDLE} ..." wrangler r2 object put "${BUCKET}/ota/${BUNDLE}" \ --file "$OTA_DIR/$BUNDLE" \ --content-type application/gzip \ --remote fi if [ -f "$OTA_DIR/latest.json" ]; then echo "上传 ${BUCKET}/ota/latest.json ..." wrangler r2 object put "${BUCKET}/ota/latest.json" \ --file "$OTA_DIR/latest.json" \ --content-type application/json \ --remote fi echo "已上传." echo "bundle 下载地址: ${CF_R2_PUBLIC_URL}/ota/${BUNDLE}" echo "可将 OTA_PUBLIC_BASE=${CF_R2_PUBLIC_URL} 传给赋予了 check 端点的 server, 让客户端直连 R2 下载 bundle."