diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index be796fd..9279a23 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -267,14 +267,51 @@ jobs: CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} run: | echo "检查并创建 Queue..." - QUEUE_LIST=$(bunx wrangler queues list --json --config apps/worker/wrangler.toml 2>/dev/null || echo "[]") - EXISTING_QUEUE=$(echo "$QUEUE_LIST" | jq -r '.[] | select(.name=="usage-events") | .name') + QUEUE_LIST_RAW=$(bunx wrangler queues list --json --config apps/worker/wrangler.toml 2>/dev/null || echo "[]") + QUEUE_EXISTS=$(QUEUE_LIST_RAW="$QUEUE_LIST_RAW" node - <<'NODE' + const raw = process.env.QUEUE_LIST_RAW || ""; + const target = "usage-events"; + const first = raw.search(/[\[{]/); + let jsonText = raw; + if (first >= 0) { + jsonText = raw.slice(first); + } + let list = null; + try { + list = JSON.parse(jsonText); + } catch { + const last = raw.lastIndexOf("]"); + if (first >= 0 && last > first) { + try { + list = JSON.parse(raw.slice(first, last + 1)); + } catch {} + } + } + if (!Array.isArray(list)) { + console.log("unknown"); + process.exit(0); + } + const exists = list.some((item) => item && item.name === target); + console.log(exists ? "true" : "false"); +NODE + ) - if [ -n "$EXISTING_QUEUE" ]; then + if [ "$QUEUE_EXISTS" = "true" ]; then echo "✅ Queue 已存在: usage-events" else echo "创建 Queue: usage-events" - bunx wrangler queues create usage-events --config apps/worker/wrangler.toml + CREATE_OUTPUT=$(bunx wrangler queues create usage-events --config apps/worker/wrangler.toml 2>&1) + CREATE_STATUS=$? + if [ $CREATE_STATUS -eq 0 ]; then + echo "✅ Queue 已创建: usage-events" + else + if echo "$CREATE_OUTPUT" | grep -qi "already exists"; then + echo "✅ Queue 已存在: usage-events" + else + echo "$CREATE_OUTPUT" + exit $CREATE_STATUS + fi + fi fi - name: Create D1 database (init only) @@ -383,14 +420,51 @@ jobs: CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} run: | echo "检查并创建 Queue..." - QUEUE_LIST=$(bunx wrangler queues list --json --config apps/worker/wrangler.toml 2>/dev/null || echo "[]") - EXISTING_QUEUE=$(echo "$QUEUE_LIST" | jq -r '.[] | select(.name=="usage-events") | .name') + QUEUE_LIST_RAW=$(bunx wrangler queues list --json --config apps/worker/wrangler.toml 2>/dev/null || echo "[]") + QUEUE_EXISTS=$(QUEUE_LIST_RAW="$QUEUE_LIST_RAW" node - <<'NODE' + const raw = process.env.QUEUE_LIST_RAW || ""; + const target = "usage-events"; + const first = raw.search(/[\[{]/); + let jsonText = raw; + if (first >= 0) { + jsonText = raw.slice(first); + } + let list = null; + try { + list = JSON.parse(jsonText); + } catch { + const last = raw.lastIndexOf("]"); + if (first >= 0 && last > first) { + try { + list = JSON.parse(raw.slice(first, last + 1)); + } catch {} + } + } + if (!Array.isArray(list)) { + console.log("unknown"); + process.exit(0); + } + const exists = list.some((item) => item && item.name === target); + console.log(exists ? "true" : "false"); +NODE + ) - if [ -n "$EXISTING_QUEUE" ]; then + if [ "$QUEUE_EXISTS" = "true" ]; then echo "✅ Queue 已存在: usage-events" else echo "创建 Queue: usage-events" - bunx wrangler queues create usage-events --config apps/worker/wrangler.toml + CREATE_OUTPUT=$(bunx wrangler queues create usage-events --config apps/worker/wrangler.toml 2>&1) + CREATE_STATUS=$? + if [ $CREATE_STATUS -eq 0 ]; then + echo "✅ Queue 已创建: usage-events" + else + if echo "$CREATE_OUTPUT" | grep -qi "already exists"; then + echo "✅ Queue 已存在: usage-events" + else + echo "$CREATE_OUTPUT" + exit $CREATE_STATUS + fi + fi fi - name: Create or verify D1 Database diff --git a/.helloagents/CHANGELOG.md b/.helloagents/CHANGELOG.md index 4320d87..b49eba9 100644 --- a/.helloagents/CHANGELOG.md +++ b/.helloagents/CHANGELOG.md @@ -190,6 +190,9 @@ ### 修复 +- **[deploy-workflow]**: 队列检查改为 Node 解析并容错非 JSON 输出 — by lsy + - 方案: [202603162220_deploy-queue-json-parse](archive/2026-03/202603162220_deploy-queue-json-parse/) + - 决策: deploy-queue-json-parse#D001(队列列表解析方式选择) - **[admin-ui]**: Toast 通知固定右上并带进度条,弹窗改为全屏遮罩,筛选标题横排 — by lsy - 方案: [202603160049_modal-toast-search-fixes](archive/2026-03/202603160049_modal-toast-search-fixes/) - 决策: modal-toast-search-fixes#D001(通知统一为右上 Toast)