- loadConfig 去除 GITEA_SERVER_URL 結尾的 /,避免拼出 //api/v1 錯誤路徑 - cleanupReleases 要求 id 為正整數,非整數一律略過(縱深防禦,不僅依賴編碼) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
64 lines
2.4 KiB
JavaScript
64 lines
2.4 KiB
JavaScript
// 讀取並驗證環境變數,組出後續流程所需的設定物件。
|
|
// 對應原本 entrypoint.sh 的「參數檢查」區段。
|
|
|
|
import {
|
|
isEmptyOrNull,
|
|
requireValue,
|
|
requireInteger,
|
|
requireUrl,
|
|
requireRepository,
|
|
} from './validate.js'
|
|
import { section, info, warn } from './logger.js'
|
|
|
|
/**
|
|
* 從環境變數載入設定並完成驗證,作為整個清理流程的設定來源。
|
|
*
|
|
* 讀取 `GITEA_SERVER_URL`、`GITEA_REPOSITORY`、`KEEP_COUNT`、`GITEA_TOKEN`,
|
|
* 其中前三者為必填(`KEEP_COUNT` 另須為非負整數);`GITEA_TOKEN` 為選填,
|
|
* 為空時改以匿名方式呼叫 API。驗證過程會將參數印出(token 以 `[redacted]` 遮蔽)。
|
|
*
|
|
* @param {NodeJS.ProcessEnv} env 環境變數來源,預設為 `process.env`,可於測試時注入假值
|
|
* @returns {{serverUrl: string, repository: string, token: string|null, keepCount: number, releaseApiUrl: string, tagApiUrl: string}}
|
|
* 設定物件:`token` 在環境變數為空時為 `null`;`keepCount` 為數值;
|
|
* `releaseApiUrl`/`tagApiUrl` 為依 server 與 repository 組出的 API 位址。
|
|
* @throws {Error} 任一必填項缺漏,或 `KEEP_COUNT` 非非負整數時拋出(由 [[validate]] 的檢查函式丟出)
|
|
*/
|
|
export function loadConfig(env = process.env) {
|
|
section('參數檢查')
|
|
|
|
// 去除結尾多餘的 /,避免後續拼接出 `https://host//api/v1/...` 這類錯誤路徑。
|
|
const rawServerUrl = env.GITEA_SERVER_URL
|
|
const serverUrl =
|
|
typeof rawServerUrl === 'string' ? rawServerUrl.replace(/\/+$/, '') : rawServerUrl
|
|
const repository = env.GITEA_REPOSITORY
|
|
const keepCountRaw = env.KEEP_COUNT
|
|
const token = env.GITEA_TOKEN
|
|
|
|
info(`GITEA_SERVER_URL=${serverUrl}`)
|
|
requireValue('GITEA_SERVER_URL', serverUrl)
|
|
requireUrl('GITEA_SERVER_URL', serverUrl)
|
|
|
|
info(`GITEA_REPOSITORY=${repository}`)
|
|
requireValue('GITEA_REPOSITORY', repository)
|
|
requireRepository('GITEA_REPOSITORY', repository)
|
|
|
|
info(`KEEP_COUNT=${keepCountRaw}`)
|
|
requireValue('KEEP_COUNT', keepCountRaw)
|
|
requireInteger('KEEP_COUNT', keepCountRaw)
|
|
|
|
if (isEmptyOrNull(token)) {
|
|
warn('GITEA_TOKEN is empty; release API calls will be anonymous')
|
|
} else {
|
|
info('GITEA_TOKEN=[redacted]')
|
|
}
|
|
|
|
return {
|
|
serverUrl,
|
|
repository,
|
|
token: isEmptyOrNull(token) ? null : token,
|
|
keepCount: Number(keepCountRaw),
|
|
releaseApiUrl: `${serverUrl}/api/v1/repos/${repository}/releases`,
|
|
tagApiUrl: `${serverUrl}/api/v1/repos/${repository}/tags`,
|
|
}
|
|
}
|