Files
calculate-version/app/index.js
T
JefferyandClaude Opus 4.8 fdf33b41d8 fix(calculate-version): 修復 AI 審查的安全與健全性問題
- Dockerfile 移除 --no-check-certificate,恢復 TLS 憑證檢查以防中間人攻擊
- config 對 GITEA_SERVER_URL 加入 http/https URL 格式驗證
- logger.fail 改為 logger.error(僅輸出不終止行程),退出移至 index 頂層處理
- index.main 改用相依注入並於頂層攔截錯誤後 exit 1,避免 library 內呼叫 process.exit
- releases 將 response.text() 包入 try-catch 並附帶頁碼

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-26 10:52:19 +08:00

66 lines
2.4 KiB
JavaScript

'use strict';
const logger = require('./logger');
const { loadConfig } = require('./config');
const { fetchReleases } = require('./releases');
const { calculateVersion } = require('./version');
const { writeOutput } = require('./output');
/**
* Action 進入點:協調設定載入、release 取得、版本號計算與輸出寫出。
*
* 失敗時(loadConfig 或 fetchReleases 拋錯)直接向外拋出例外,由呼叫端決定如何結束,
* 以利單元測試覆蓋失敗路徑。相依模組可透過 deps 注入,預設使用各兄弟模組的實作。
*
* @param {Object} [deps={}] - 可注入的相依,供測試替換。
* @param {Function} [deps.loadConfig] - 載入設定的函式。
* @param {Function} [deps.fetchReleases] - 取得 release 的函式。
* @param {Function} [deps.calculateVersion] - 計算版本號的函式。
* @param {Function} [deps.writeOutput] - 寫出 output 的函式。
* @param {{section:Function, info:Function, error:Function}} [deps.log] - log 記錄器。
* @returns {Promise<string>} 計算出的版本號。
*/
async function main(deps = {}) {
const {
loadConfig: loadConfigFn = loadConfig,
fetchReleases: fetchReleasesFn = fetchReleases,
calculateVersion: calculateVersionFn = calculateVersion,
writeOutput: writeOutputFn = writeOutput,
log = logger,
} = deps;
log.section('參數檢查');
const config = loadConfigFn();
log.info(`GITEA_SERVER_URL=${config.serverUrl}`);
log.info(`GITEA_REPOSITORY=${config.repository}`);
log.info(config.token ? 'GITEA_TOKEN=***' : 'GITEA_TOKEN=未提供');
log.info(`IS_BETA=${config.isBeta}`);
log.section('取得版本資料');
const releaseUrl = `${config.serverUrl}/api/v1/repos/${config.repository}/releases`;
log.info(`RELEASE_URL=${releaseUrl}`);
const releases = await fetchReleasesFn(releaseUrl, { token: config.token, logger: log });
const { latest, version } = calculateVersionFn(releases, config.isBeta);
log.info(`LATEST_VERSION=${latest}`);
log.section('計算版本號');
log.info(`NEW_VERSION=${version}`);
writeOutputFn('version', version);
return version;
}
// 僅在被直接執行時啟動(被 require/測試載入時不自動執行),失敗則在頂層回報並以狀態碼 1 結束
if (require.main === module) {
main().catch((error) => {
logger.error(error.message);
process.exit(1);
});
}
module.exports = { main };