新增發佈到 Gitea Releases 的腳本
摘要: scripts/release.js 建立 tag v<版本> 的 release 並上傳 dist 的 .exe / .zip, 附帶 --dry-run 與伺服器設定預檢。 根本原因: 產物有 345 MB 且不進版控,需要一個散布管道。Gitea 有 Releases 與附件 API, 但目前伺服器設定會擋下全部三個檔: - [attachment] max_size 為 100 MB,portable 101.7 / setup 102.0 / zip 141.3 都超過 - allowed_types 白名單只有文件與圖片類,沒有 .exe 另外 .npmrc 裡現有的 token 只有套件庫權限,呼叫 repo API 會回 403。 影響: 沒有腳本就得手動上傳三個上百 MB 的檔;直接上傳也會因上述設定而失敗。 修法: - 新增 scripts/release.js 與 npm script release: owner/repo 由 git remote 推導,網址可用 GITEA_URL 覆寫(SSH 埠與網頁埠不同時)。 release 說明取自上一個 tag 之後的 commit 標題;沒有舊 tag 就取最近 30 筆。 release 已存在則重用,同名附件先刪再傳,可重複執行。 - 上傳採用手動組裝的 multipart 並以串流送出,不把上百 MB 的檔案讀進記憶體。 - 發佈前先讀 /api/v1/settings/attachment 做預檢,超過上限或副檔名不允許時 直接列出是哪個檔案卡在哪一條並中止,不會傳到一半才失敗。 - --dry-run 只做讀取,印出將建立或重用的 release 與變更說明。 - git() 關閉 stderr:releaseNotes 會刻意 describe 一個可能不存在的舊 tag, 否則 git 的 fatal 訊息會被誤認成發佈失敗。 - README 新增「發佈到 Gitea Releases」一節,寫明所需的 app.ini 設定與 token 權限。 驗證: - 對真實伺服器執行 --dry-run:正確推導出 AI/claude-pet 與 tag v2.0.3, 並列出三個檔各自違反的限制後中止,全程只有 GET。 - 另寫一個假的 Gitea(本機 http)跑完整流程:建立 release 的 tag、名稱、 target_commitish 與說明皆正確;三個附件的 Content-Length 與實收位元組相符、 multipart 邊界與 Content-Disposition 正確、結尾正確, 且收到的檔案內容 SHA256 與磁碟上的完全一致(共 345 MB)。 未執行: 實際發佈需要伺服器調整設定與一個有 write:repository 權限的 token,兩者都在使用者手上。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -23,6 +23,7 @@
|
||||
- [與 Codex 的對照](#與-codex-的對照)
|
||||
- [HTTP API](#http-api)
|
||||
- [打包成 exe](#打包成-exe)
|
||||
- [發佈到 Gitea Releases](#發佈到-gitea-releases)
|
||||
- [疑難排解](#疑難排解)
|
||||
- [移除](#移除)
|
||||
|
||||
@@ -229,7 +230,7 @@ Claude Code ──hook(stdin JSON)──▶ hook/claude-pet-hook.js ──PO
|
||||
| `lib/hooks-installer.js` | 安全地合併 / 移除 `~/.claude/settings.json` 的 hooks(保留其他設定與其他 hooks,先備份) |
|
||||
| `lib/autostart.js` | `HKCU\Software\Microsoft\Windows\CurrentVersion\Run\ClaudePet` 登錄值;開發時指向 `electron.exe + 專案路徑`,打包後直接指向那顆 exe |
|
||||
| `lib/paths.js` | 開發/安裝版/portable 三種情境的路徑解析(`app.asar` → `app.asar.unpacked`、是否打包、portable 的真實 exe 位置) |
|
||||
| `scripts/*.js` | 上述兩者的 CLI 包裝 |
|
||||
| `scripts/*.js` | 上述兩者的 CLI 包裝,以及 `release.js`(發佈到 Gitea Releases) |
|
||||
| `pets/` | 內附寵物 |
|
||||
| `docs/` | README 用圖 |
|
||||
| `build/icon.ico` | exe 與安裝檔的圖示,取自小念 spritesheet 第 0 列第 6 欄(中立正面)的頭肩方形裁切 |
|
||||
@@ -370,6 +371,41 @@ NSIS 的 portable 外殼**每次啟動**都會把整包解壓到 `%TEMP%\ClaudeP
|
||||
|
||||
換圖示就換掉 `build/icon.ico`(要含 256×256)。目前這顆是從 `pets/xiao-nian/spritesheet.webp` 第 0 列第 6 欄(中立正面)取頭肩方形裁切產生的。
|
||||
|
||||
## 發佈到 Gitea Releases
|
||||
|
||||
```powershell
|
||||
$env:GITEA_TOKEN = "<token>"
|
||||
npm run release -- --dry-run # 只檢查:產物、附件限制、release 是否已存在,不做任何寫入
|
||||
npm run release # 實際發佈
|
||||
```
|
||||
|
||||
會建立 tag `v<版本>` 的 release(說明自動取自上一個 tag 之後的 commit 標題),
|
||||
並上傳 `dist\` 裡的 `.exe` 與 `.zip`。同名附件會先刪再傳,所以可以重跑。
|
||||
`.blockmap` 不上傳——那是 electron-updater 的差分更新才需要,本專案沒有用到。
|
||||
|
||||
**前置一:伺服器設定。** Gitea 預設的附件上限是 100 MB,而且 `ALLOWED_TYPES` 白名單沒有 `.exe`,
|
||||
三個產物全部會被擋下。在 `app.ini` 調整後重啟 Gitea:
|
||||
|
||||
```ini
|
||||
[attachment]
|
||||
MAX_SIZE = 300
|
||||
ALLOWED_TYPES = */*
|
||||
```
|
||||
|
||||
腳本會先讀 `/api/v1/settings/attachment` 做預檢,設定不足時會直接列出哪個檔案卡在哪一條、
|
||||
不會傳到一半才失敗。
|
||||
|
||||
**前置二:token。** 到 Gitea 的「設定 → 應用程式 → 產生新的權杖」,
|
||||
勾選 `write:repository`(只有套件庫權限的 token 不行,repo API 會回 403)。
|
||||
放環境變數就好,不要寫進檔案。
|
||||
|
||||
**其他環境變數**
|
||||
|
||||
| 變數 | 用途 |
|
||||
|---|---|
|
||||
| `GITEA_TOKEN` | 必填,需 `write:repository` |
|
||||
| `GITEA_URL` | 網頁網址與 remote 主機不同時覆寫(預設 `https://<remote 主機>`)。SSH 走 8022 埠不影響,腳本只取主機名 |
|
||||
|
||||
## 疑難排解
|
||||
|
||||
### Electron 裝完沒有 `electron.exe`
|
||||
|
||||
Reference in New Issue
Block a user