From ef11871ba44d3db6217a1ab2a29fd1fffb910244 Mon Sep 17 00:00:00 2001 From: richblack Date: Fri, 18 Sep 2026 19:44:40 +0800 Subject: [PATCH] =?UTF-8?q?=E9=9B=B2=E7=AB=AF=E7=92=B0=E5=A2=83=E8=AE=8A?= =?UTF-8?q?=E6=95=B8=E6=B8=85=E5=96=AE=E6=9C=89=E7=89=88=E6=9C=AC=E4=BA=86?= =?UTF-8?q?=EF=BC=9Adocs/cloud-env-versions.tsv=20=E8=A8=98=E6=AF=8F?= =?UTF-8?q?=E7=89=88=20key=EF=BC=8C=E7=94=A2=E7=94=9F=E5=99=A8=E5=8D=B0?= =?UTF-8?q?=E7=89=88=E6=9C=AC=E8=88=87=E5=B7=AE=E7=95=B0=E3=80=81=E6=94=B9?= =?UTF-8?q?=E6=B8=85=E5=96=AE=E6=B2=92=E5=8D=87=E7=89=88=E5=B0=B1=E6=8B=92?= =?UTF-8?q?=E7=B5=95=EF=BC=8C=E7=94=A2=E7=89=A9=E9=A0=90=E8=A8=AD=E6=94=BE?= =?UTF-8?q?=E6=A1=8C=E9=9D=A2=EF=BC=88v6=EF=BC=9A=EF=BC=8BARCRUN=5FNS=5FUN?= =?UTF-8?q?CLE6=EF=BC=8FGITHUB=5FMIRROR=5FTOKEN=EF=BC=8FGITHUB=5FACCOUNT?= =?UTF-8?q?=5FNAME=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit leo 2026-09-18:「你這裡記錄每版的 credential 的 key,但 value 自動產生,我就貼上去,你要有版本,因為這件事做了很多次,但你都沒記錄版本」 v1–v5 由 git 歷史還原(f855d82、ca9ea99、7aef943、cb310e9、dd86fef)。test-make-cloud-env.sh 13/13(新增 V1 檔頭版本、V2 不一致拒絕)。 (inkstone/ISEP#158、inkstone/InkStoneCo#98 c7739) Co-Authored-By: Claude Opus 5 --- docs/cloud-env-versions.tsv | 10 ++++++++ scripts/make-cloud-env.sh | 42 ++++++++++++++++++++++++++++------ scripts/test-make-cloud-env.sh | 8 +++++++ 3 files changed, 53 insertions(+), 7 deletions(-) create mode 100644 docs/cloud-env-versions.tsv diff --git a/docs/cloud-env-versions.tsv b/docs/cloud-env-versions.tsv new file mode 100644 index 0000000..8887304 --- /dev/null +++ b/docs/cloud-env-versions.tsv @@ -0,0 +1,10 @@ +# 雲端環境(claude.ai Cloud environment)變數清單的版本紀錄——**只記名字,不記值**。 +# leo 2026-09-18:「你這裡記錄每版的 credential 的 key,但 value 自動產生,我就貼上去,你要有版本,因為這件事做了很多次,但你都沒記錄版本」 +# 產生器 scripts/make-cloud-env.sh 讀本檔最後一版的號碼印在產物檔頭,並列出與前一版的差異。 +# 欄位:版本日期key(逗號分隔,順序=NEEDED)為什麼變 +v1 2026-08-20 GITEA_TOKEN_CLAUDE_CODE 首版:雲端 bootstrap 與 plugin 安裝(f855d82) +v2 2026-09-01 GITEA_TOKEN_CLAUDE_CODE,CLOUDFLARE_API_TOKEN_YOULIN_CC_USE 雲端拿得到 youlin 的 CF token(ISEP#115 c5526,ca9ea99) +v3 2026-09-01 GITEA_TOKEN_CLAUDE_CODE,CLOUDFLARE_API_TOKEN_YOULIN_CC_USE,CLOUDFLARE_ACCOUNT_ID_YOULIN,YOULIN_MCP_OWNER_SECRETS,STAGE_USERNAME_YOULIN,STAGE_PASSWORD_YOULIN,CLOUDFLARE_API_TOKEN_CC_SHIPPING_CORE,CLOUDFLARE_ACCOUNT_ID_GEEK6688 leo「youlin 和 geek6688 都全給」(ISEP#115 c5541/5542,7aef943) +v4 2026-09-01 GITEA_TOKEN_CLAUDE_CODE,CLOUDFLARE_API_TOKEN_YOULIN_CC_USE,CLOUDFLARE_ACCOUNT_ID_YOULIN,YOULIN_MCP_OWNER_SECRETS,STAGE_USERNAME_YOULIN,STAGE_PASSWORD_YOULIN,CLOUDFLARE_API_TOKEN_CC_SHIPPING_CORE,CLOUDFLARE_ACCOUNT_ID_GEEK6688,UNCLE6_CF_API_KEY 出貨三站實際部署到 uncle6(ISEP#115 c5577,cb310e9) +v5 2026-09-01 GITEA_TOKEN_CLAUDE_CODE,CLOUDFLARE_API_TOKEN_YOULIN_CC_USE,CLOUDFLARE_ACCOUNT_ID_YOULIN,YOULIN_MCP_OWNER_SECRETS,STAGE_USERNAME_YOULIN,STAGE_PASSWORD_YOULIN,CLOUDFLARE_API_TOKEN_CC_SHIPPING_CORE,CLOUDFLARE_ACCOUNT_ID_GEEK6688,UNCLE6_CF_API_KEY,ARCRUN_NS_YOULIN 出貨線實例座標(Arcrun#195,dd86fef/v0.21.0) +v6 2026-09-18 GITEA_TOKEN_CLAUDE_CODE,CLOUDFLARE_API_TOKEN_YOULIN_CC_USE,CLOUDFLARE_ACCOUNT_ID_YOULIN,YOULIN_MCP_OWNER_SECRETS,STAGE_USERNAME_YOULIN,STAGE_PASSWORD_YOULIN,CLOUDFLARE_API_TOKEN_CC_SHIPPING_CORE,CLOUDFLARE_ACCOUNT_ID_GEEK6688,UNCLE6_CF_API_KEY,ARCRUN_NS_YOULIN,ARCRUN_NS_UNCLE6,GITHUB_MIRROR_TOKEN,GITHUB_ACCOUNT_NAME 雲端要能出 stage/prod:uncle6 namespace+GitHub 鏡像兩把(InkStoneCo#98 c7739;ISEP#158) diff --git a/scripts/make-cloud-env.sh b/scripts/make-cloud-env.sh index 60879da..7130d37 100755 --- a/scripts/make-cloud-env.sh +++ b/scripts/make-cloud-env.sh @@ -5,7 +5,7 @@ # 誤觸時怎麼關: 這支不擋任何東西。不想產生就別跑;產物在版控外,刪掉即可。 # # 用法:bash scripts/make-cloud-env.sh -# 產物:~/.claude/cloud-env/<日期>.txt(權限 600,**不在任何 repo 裡**) +# 產物:~/Desktop/cloud-env-<版本>-<日期>.txt(權限 600,**不在任何 repo 裡**);版本紀錄 docs/cloud-env-versions.tsv # 本腳本只寫「變數名字」,值在執行當下才從既有 .env 讀出來寫進產物 —— 值不進版控、不進對話。 set -euo pipefail @@ -44,6 +44,14 @@ NEEDED=( # 只有 namespace 是機敏 ⇒ 走環境變數。原本只住在 ~/.arcrun/config.yaml 的 api_key, # 那個檔在家目錄、不隨 clone 走 ⇒ 雲端永遠拿不到。 ARCRUN_NS_YOULIN # youlin 實例的 namespace(X-Arcrun-API-Key) + ARCRUN_NS_UNCLE6 # uncle6 實例的 namespace:出貨第 1、19、20 站派給 uncle6 工作流(inkstone/InkStoneCo#98 → comment 7739) + + # ── prod 出貨把產物推上 GitHub 鏡像(第 14、21、22 站)── + # 🔴 名字進清單 ≠ 雲端可以自由寫 GitHub:`github-contact-guard.sh` 照樣擋, + # 寫入仍要 D20 開閘(保險檔落在哪由 inkstone/ISEP#157 處理)。 + # 進清單是因為「拿不到這兩個名字」會讓 prod 那半在雲端**連開閘之後都走不下去**。 + GITHUB_MIRROR_TOKEN # GitHub 鏡像 repo 的寫入 token(走標頭,不進網址) + GITHUB_ACCOUNT_NAME # 上面那把的帳號名(組鏡像 repo 路徑用,不是機密) ) # # 🔴 這份清單的邊界——加一把之前先問「這把打得到哪個實例」,不是「這把方便嗎」 @@ -91,13 +99,30 @@ lookup() { # $1=變數名 → 印出值(找不到就空) return 1 } -# 預設丟 ~/.claude/cloud-env(權限 700)。要放別的地方= OUT_DIR=~/Desktop bash scripts/make-cloud-env.sh -OUT_DIR="${OUT_DIR:-$HOME/.claude/cloud-env}" +# ── 版本(leo 2026-09-18:「你要有版本,因為這件事做了很多次,但你都沒記錄版本」)── +# 真相源=docs/cloud-env-versions.tsv(只記 key,不記值)。最後一列=現行版。 +# 🔴 NEEDED 跟最後一列的 key 不一致 ⇒ 拒絕產生:改了清單就必須在 tsv 加一版。 +VERSIONS="$(cd "$(dirname "$0")/.." && pwd)/docs/cloud-env-versions.tsv" +[ -f "$VERSIONS" ] || { echo "🔴 找不到 $VERSIONS" >&2; exit 1; } +CUR_LINE=$(grep -v '^#' "$VERSIONS" | grep -v '^[[:space:]]*$' | tail -1) +PREV_LINE=$(grep -v '^#' "$VERSIONS" | grep -v '^[[:space:]]*$' | tail -2 | head -1) +VER=$(printf '%s' "$CUR_LINE" | cut -f1); VER_DATE=$(printf '%s' "$CUR_LINE" | cut -f2) +VER_KEYS=$(printf '%s' "$CUR_LINE" | cut -f3); VER_WHY=$(printf '%s' "$CUR_LINE" | cut -f4) +PREV_VER=$(printf '%s' "$PREV_LINE" | cut -f1); PREV_KEYS=$(printf '%s' "$PREV_LINE" | cut -f3) +NEEDED_JOINED=$(IFS=,; printf '%s' "${NEEDED[*]}") +if [ "$NEEDED_JOINED" != "$VER_KEYS" ]; then + echo "🔴 NEEDED 與 $VERSIONS 最後一版($VER)的 key 不一致——改了清單就要在 tsv 加一列新版本再跑。" >&2 + echo " NEEDED:$NEEDED_JOINED" >&2 + echo " $VER :$VER_KEYS" >&2 + exit 2 +fi +ADDED=$(comm -13 <(tr , '\n' <<<"$PREV_KEYS" | sort) <(tr , '\n' <<<"$VER_KEYS" | sort) | paste -sd, -) +REMOVED=$(comm -23 <(tr , '\n' <<<"$PREV_KEYS" | sort) <(tr , '\n' <<<"$VER_KEYS" | sort) | paste -sd, -) + +# 預設丟桌面(leo 2026-09-18 指定)。要放別的地方= OUT_DIR=<目錄> bash scripts/make-cloud-env.sh +OUT_DIR="${OUT_DIR:-$HOME/Desktop}" mkdir -p "$OUT_DIR" -# 只在「這個目錄是我們自己造的預設位置」時才收緊權限—— -# OUT_DIR 可被覆寫,不該對使用者指定的既有目錄(例如 ~/Desktop)動權限。 -[ "$OUT_DIR" = "$HOME/.claude/cloud-env" ] && chmod 700 "$OUT_DIR" -OUT="$OUT_DIR/$(date +%Y%m%d-%H%M%S).txt" +OUT="$OUT_DIR/cloud-env-${VER}-$(date +%Y%m%d-%H%M).txt" SETUP="$(cd "$(dirname "$0")/.." && pwd)/docs/cloud-setup-script.sh" [ -f "$SETUP" ] || { echo "🔴 找不到 $SETUP" >&2; exit 1; } @@ -105,6 +130,8 @@ SETUP="$(cd "$(dirname "$0")/.." && pwd)/docs/cloud-setup-script.sh" MISSING=() { echo "claude.ai → Cloud environments → 你的環境。下面兩塊各自貼進對應欄位。" + echo "版本:${VER}(${VER_DATE})——${VER_WHY}" + echo "比 ${PREV_VER} 多:${ADDED:-(無)}|少:${REMOVED:-(無)}" echo "產生時間:$(date '+%Y-%m-%d %H:%M')" echo echo "════════ ① Environment variables(一行一個,名字與值分開填)════════" @@ -123,5 +150,6 @@ MISSING=() chmod 600 "$OUT" echo "✅ 產生完成:$OUT" +echo " 版本:${VER}(比 ${PREV_VER} 多:${ADDED:-無}|少:${REMOVED:-無})" echo " 變數 ${#NEEDED[@]} 個|找不到值的 ${#MISSING[@]} 個 ${MISSING[*]:-}" echo " 🔴 這個檔含金鑰真身:貼完就刪(rm '$OUT'),它刻意不在任何 repo 裡。" diff --git a/scripts/test-make-cloud-env.sh b/scripts/test-make-cloud-env.sh index e28eea3..14505e7 100755 --- a/scripts/test-make-cloud-env.sh +++ b/scripts/test-make-cloud-env.sh @@ -59,6 +59,14 @@ chk 0 "$miss" "A3 每個名字都帶著值出現在 ① 區塊" printf '%s\n' "$OUT_LINE" | grep -q "找不到值的 0 個" \ && ok "A4 收尾那行說「找不到值的 0 個」" || bad "A4 收尾計數不對:$OUT_LINE" +# 版本(leo 2026-09-18):產物檔頭帶現行版本號;清單改了沒升版要拒絕 +grep -q "^版本:v[0-9]" "$F" && ok "V1 產物檔頭寫著版本號" || bad "V1 產物檔頭沒有版本號" +VT="$(cd "$(dirname "$S")/.." && pwd)/docs/cloud-env-versions.tsv"; VB="$VT.bak-test" +cp "$VT" "$VB"; printf 'v999\t2099-01-01\tNOPE_ONLY\t測試用\n' >> "$VT" +INKSTONE_ROOT="$FAKE" OUT_DIR="$OUTD" bash "$S" >/dev/null 2>&1; rc=$? +mv "$VB" "$VT" +chk 2 "$rc" "V2 清單與最後一版 key 不一致時拒絕產生(離開碼 2)" + # 缺值時不准假綠:拿掉第一個,它要變成 <🔴 …> 且計數變 1 grep -v "^${NEEDED[0]}=" "$FAKE/.env" > "$FAKE/.env.tmp" && mv "$FAKE/.env.tmp" "$FAKE/.env" OUT2=$(INKSTONE_ROOT="$FAKE" OUT_DIR="$OUTD" bash "$S" 2>&1)