refactor(release-cleanup): 將清理邏輯由 bash 改寫為 Node.js 模組
依功能分組為 logger/validate/config/gitea-client/releases/tags 模組, entrypoint.sh 改為呼叫 node /app/index.js,Dockerfile 改用 node:20-alpine 基底。 對外行為(清理舊 release 與未指定 release 的 tag)維持不變。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.8
parent
b478872c5f
commit
b1aa8730a2
@@ -0,0 +1,53 @@
|
||||
// 與 Gitea API 溝通的 HTTP 客戶端,封裝認證標頭、分頁讀取與刪除請求。
|
||||
// 對應原本 entrypoint.sh 的 fetch_all_pages 與 curl DELETE 呼叫。
|
||||
|
||||
export class GiteaClient {
|
||||
/**
|
||||
* @param {{ token?: string | null }} options 認證設定;有 token 時帶上 Authorization 標頭
|
||||
*/
|
||||
constructor({ token = null } = {}) {
|
||||
this.headers = {}
|
||||
if (token) {
|
||||
this.headers.Authorization = `token ${token}`
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 逐頁讀取分頁式清單 API,直到回傳空陣列為止,合併成單一陣列。
|
||||
* @param {string} baseUrl 不含 query string 的 API 位址
|
||||
* @returns {Promise<any[]>} 所有頁面合併後的項目
|
||||
*/
|
||||
async fetchAllPages(baseUrl) {
|
||||
const all = []
|
||||
let page = 1
|
||||
|
||||
while (true) {
|
||||
const url = `${baseUrl}?page=${page}`
|
||||
const res = await fetch(url, { headers: this.headers })
|
||||
|
||||
if (!res.ok) {
|
||||
throw new Error(`GET ${url} failed: HTTP ${res.status}`)
|
||||
}
|
||||
|
||||
const items = await res.json()
|
||||
if (!Array.isArray(items) || items.length === 0) {
|
||||
break
|
||||
}
|
||||
|
||||
all.push(...items)
|
||||
page += 1
|
||||
}
|
||||
|
||||
return all
|
||||
}
|
||||
|
||||
/**
|
||||
* 對指定資源發出 DELETE 請求。
|
||||
* @param {string} url 目標資源位址
|
||||
* @returns {Promise<number>} HTTP 狀態碼
|
||||
*/
|
||||
async deleteResource(url) {
|
||||
const res = await fetch(url, { method: 'DELETE', headers: this.headers })
|
||||
return res.status
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user