cleanup-release 動作重整與安全強化 #2

Merged
admin merged 22 commits from develop into master 2026-07-15 02:47:59 +00:00
Member

變更摘要

develop 上完成的 cleanup-release action 重整與多輪 AI review 修復合併回 master。內容涵蓋清理流程重寫、輸入驗證與安全強化、失敗回報語意修正、文件與 CI/CD 工作流整理。

重點變更

核心程式(src/index.js

  • 清理流程重寫:release 依 created_at 排序後保留前 KEEP_COUNT 筆、其餘刪除,再清除未對應保留 release 的 tag;批次並行刪除(DELETE_CONCURRENCY=4
  • 失敗語意:批次改用 Promise.allSettled,單筆網路例外不中止同批;任何刪除失敗或資料異常(release id 非正整數、tag 缺名稱)都會讓 job 以非 0 結束,CI 不再誤判成功
  • 輸入驗證GITEA_SERVER_URL 須為合法 HTTPS URL、GITEA_REPOSITORY 嚴格 owner/repo 格式並逐段編碼(防路徑注入)、KEEP_COUNT 為安全整數範圍內的正整數(下限 1,避免全刪)
  • 資訊保護:server URL 只記錄遮罩後 origin、API URL 清除 userinfo/query、RUNNER_TOKEN 遮罩、錯誤預設只輸出 message(RUNNER_DEBUG=1 才含 stack)、log 內容去除控制字元
  • 健壯性與效能:分頁抓取有上限(預設 1000 頁、可用 MAX_PAGES 環境變數覆寫)、共用 keep-alive 連線、DELETE 丟棄回應串流

設定與文件

  • action.yml:輸入參數註解化,KEEP_COUNT 預設 2,token 來源支援 inputs.RUNNER_TOKENsecrets.GITEA_TOKENsecrets.RUNNER_TOKEN 依序回退
  • Dockerfileentrypoint.sh:容器化執行環境整理,啟動時輸出 action 資訊橫幅
  • README.md.gitea/workflows/readme.md:重建專案說明與工作流文件
  • CI/CD workflow(ci.yamlmaster.yaml):版本輸出與流程整理
  • .gitea/ai-review/:歷輪 review 的 findings 已全數解決(目前為空),13 筆誤報判定登記於 exclusions

影響範圍

  • 使用此 action 的 workflow:行為更嚴格 —— 非法輸入會直接失敗、KEEP_COUNT=0 不再允許、任何刪除失敗都會使 job 失敗
  • 逾 3 萬筆 release/tag 的超大 repo 需以 MAX_PAGES 調高分頁上限

風險與注意事項

  • 失敗判定比舊版嚴格,先前「靜默略過」的壞資料情境現在會讓 job 變紅,屬預期行為
  • 僅支援 HTTPS Gitea 端點(刻意的安全限制)
## 變更摘要 將 `develop` 上完成的 cleanup-release action 重整與多輪 AI review 修復合併回 `master`。內容涵蓋清理流程重寫、輸入驗證與安全強化、失敗回報語意修正、文件與 CI/CD 工作流整理。 ## 重點變更 ### 核心程式(`src/index.js`) - **清理流程重寫**:release 依 `created_at` 排序後保留前 `KEEP_COUNT` 筆、其餘刪除,再清除未對應保留 release 的 tag;批次並行刪除(`DELETE_CONCURRENCY=4`) - **失敗語意**:批次改用 `Promise.allSettled`,單筆網路例外不中止同批;任何刪除失敗或資料異常(release id 非正整數、tag 缺名稱)都會讓 job 以非 0 結束,CI 不再誤判成功 - **輸入驗證**:`GITEA_SERVER_URL` 須為合法 HTTPS URL、`GITEA_REPOSITORY` 嚴格 `owner/repo` 格式並逐段編碼(防路徑注入)、`KEEP_COUNT` 為安全整數範圍內的正整數(下限 1,避免全刪) - **資訊保護**:server URL 只記錄遮罩後 origin、API URL 清除 userinfo/query、`RUNNER_TOKEN` 遮罩、錯誤預設只輸出 message(`RUNNER_DEBUG=1` 才含 stack)、log 內容去除控制字元 - **健壯性與效能**:分頁抓取有上限(預設 1000 頁、可用 `MAX_PAGES` 環境變數覆寫)、共用 keep-alive 連線、DELETE 丟棄回應串流 ### 設定與文件 - `action.yml`:輸入參數註解化,`KEEP_COUNT` 預設 2,token 來源支援 `inputs.RUNNER_TOKEN`/`secrets.GITEA_TOKEN`/`secrets.RUNNER_TOKEN` 依序回退 - `Dockerfile`/`entrypoint.sh`:容器化執行環境整理,啟動時輸出 action 資訊橫幅 - `README.md`/`.gitea/workflows/readme.md`:重建專案說明與工作流文件 - CI/CD workflow(`ci.yaml`、`master.yaml`):版本輸出與流程整理 - `.gitea/ai-review/`:歷輪 review 的 findings 已全數解決(目前為空),13 筆誤報判定登記於 exclusions ## 影響範圍 - 使用此 action 的 workflow:行為更嚴格 —— 非法輸入會直接失敗、`KEEP_COUNT=0` 不再允許、任何刪除失敗都會使 job 失敗 - 逾 3 萬筆 release/tag 的超大 repo 需以 `MAX_PAGES` 調高分頁上限 ## 風險與注意事項 - 失敗判定比舊版嚴格,先前「靜默略過」的壞資料情境現在會讓 job 變紅,屬預期行為 - 僅支援 HTTPS Gitea 端點(刻意的安全限制)
jiantw83 added 22 commits 2026-07-15 02:44:13 +00:00
fix(entrypoint): 恢復啟動腳本可執行權限
CI / 2. TEST (pull_request) Failing after 1s
CI / 3. RESULT (pull_request) Has been skipped
CI / 1. BUILD (pull_request) Successful in 2s
818532fda5
fix(工作流): 修正 CI/CD 版本輸出與縮排
CI / 1. BUILD (pull_request) Successful in 3s
CI / 2. TEST (pull_request) Failing after 10m13s
CI / 3. RESULT (pull_request) Has been skipped
abf96b5843
chore: update ai-review findings [ai-review-bot][failure]
CI / 1. BUILD (pull_request) Successful in 2s
CI / 2. TEST (pull_request) Failing after 31s
CI / 3. RESULT (pull_request) Has been skipped
29b3e37b79
fix(cleanup-release): harden API cleanup flow
CI / 1. BUILD (pull_request) Successful in 4s
CI / 2. TEST (pull_request) Failing after 6m52s
CI / 3. RESULT (pull_request) Has been skipped
d667c66726
chore: update ai-review findings [ai-review-bot][failure]
CI / 1. BUILD (pull_request) Successful in 2s
CI / 2. TEST (pull_request) Failing after 31s
CI / 3. RESULT (pull_request) Has been skipped
3109aa7923
chore(ai-review 狀態): 更新 findings 與 exclusions
CI / 1. BUILD (pull_request) Successful in 2s
CI / 2. TEST (pull_request) Successful in 7m24s
CI / 3. RESULT (pull_request) Successful in 1s
98abcf2363
chore(ai-review 狀態): 清空已處理 findings
CI / 1. BUILD (pull_request) Successful in 3s
CI / 2. TEST (pull_request) Failing after 6m46s
CI / 3. RESULT (pull_request) Has been skipped
73c2e5d171
chore: update ai-review findings [ai-review-bot][success]
CI / 1. BUILD (pull_request) Successful in 16s
CI / 2. TEST (pull_request) Failing after 13s
CI / 3. RESULT (pull_request) Has been skipped
4ea57ae1a9
chore: update ai-review findings [ai-review-bot][failure]
CI / 1. BUILD (pull_request) Successful in 2s
CI / 2. TEST (pull_request) Failing after 34s
CI / 3. RESULT (pull_request) Has been skipped
fb26de18d0
- tag 刪除失敗後補上 hadFailure 檢查,確保以非 0 結束
- GITEA_SERVER_URL 的 log 改為遮罩後 origin,API URL 清除 userinfo/query
- release id 驗證為正整數才組 DELETE URL
- isEmptyOrNull 不再把字串 'null' 當空值,改在環境變數來源正規化
- 共用 keep-alive https.Agent 減少重複建連線
- 分頁抓取加入 MAX_PAGES 上限避免無限迴圈
- 批次大小抽成 DELETE_CONCURRENCY 常數
- 錯誤處理保留 currentStage 階段上下文

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
chore(ai-review 狀態): 清空已全數解決的 findings.json
CI / 1. BUILD (pull_request) Successful in 2s
CI / 2. TEST (pull_request) Failing after 7m28s
CI / 3. RESULT (pull_request) Skipped
e10f9c95c4
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
chore: update ai-review findings [ai-review-bot][failure]
CI / 1. BUILD (pull_request) Successful in 2s
CI / 2. TEST (pull_request) Failing after 32s
CI / 3. RESULT (pull_request) Skipped
4f64e570e2
- processInBatches 改用 Promise.allSettled 並回傳結果集合,單筆例外不再中止同批,移除共享 hadFailure 狀態
- GITEA_REPOSITORY 嚴格驗證 owner/repo 格式並逐段 encodeURIComponent,拒絕 . / .. 路徑片段
- GITEA_SERVER_URL 於參數檢查階段驗證為合法 HTTPS 絕對 URL,錯誤不再留到中途才拋出
- KEEP_COUNT 下限改為 1 並限制在安全整數範圍,避免設 0 清空所有 release 或大數失真
- DELETE 請求改以 collectBody: false 丟棄回應串流,只保留狀態碼

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
chore(ai-review 狀態): 清空 findings 並登記排序 top-K 建議為誤報
CI / 1. BUILD (pull_request) Successful in 2s
CI / 2. TEST (pull_request) Successful in 7m14s
CI / 3. RESULT (pull_request) Successful in 1s
9137f67507
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
chore: update ai-review findings [ai-review-bot][success]
CI / 1. BUILD (pull_request) Successful in 2s
CI / 2. TEST (pull_request) Successful in 50s
CI / 3. RESULT (pull_request) Successful in 0s
62e20d361f
Reviewed-on: #1
- release id 非正整數、tag 缺少名稱時改視為失敗(fail + return false),壞資料不再被靜默當成功
- 分頁上限改為可用環境變數 MAX_PAGES 覆寫(預設 1000),超限錯誤訊息附調高方式
- 未捕捉錯誤預設只輸出 error.message,RUNNER_DEBUG=1 時才輸出完整 stack

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
chore(ai-review 狀態): 清空 findings 並登記回應摘要告警為誤報
CI / 1. BUILD (pull_request) Successful in 2s
CI / 2. TEST (pull_request) Skipped
CI / 3. RESULT (pull_request) Skipped
888d503d1d
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
admin merged commit 68d844bfae into master 2026-07-15 02:47:59 +00:00
Sign in to join this conversation.
No Reviewers
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: actions/cleanup-release#2