refactor(calculate-version): 將版本計算邏輯由 bash 改寫為 Node.js 並依功能分檔

保留 entrypoint.sh 作為容器進入點,改為啟動 app/ 下的 Node.js 程式;
依功能拆分為 logger/config/version/releases/output/index,並更新 Dockerfile 改用 node:lts-alpine。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Jeffery
2026-06-26 10:41:34 +08:00
co-authored by Claude Opus 4.8
parent 4983a72524
commit bd6b6017ab
13 changed files with 734 additions and 264 deletions
+60
View File
@@ -0,0 +1,60 @@
'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() 載入設定(失敗則以 logger.fail
* 回報並結束);印出設定值(token 以 *** 或「未提供」顯示);組出 release URL 並
* 以 fetchReleases() 取得 release 清單(失敗則以 logger.fail 回報並結束);以
* calculateVersion() 計算最新版與新版號,最後以 writeOutput('version', version)
* 寫出 version 輸出。
*
* Side effects:透過 logger 輸出至 stdout/stderr、失敗時使 process 以失敗狀態
* 結束、並寫入 GITHUB_OUTPUT。此函式於模組載入時即被呼叫。
*
* @returns {Promise<void>}
*/
async function main() {
logger.section('參數檢查');
let config;
try {
config = loadConfig();
} catch (error) {
logger.fail(error.message);
return;
}
logger.info(`GITEA_SERVER_URL=${config.serverUrl}`);
logger.info(`GITEA_REPOSITORY=${config.repository}`);
logger.info(config.token ? 'GITEA_TOKEN=***' : 'GITEA_TOKEN=未提供');
logger.info(`IS_BETA=${config.isBeta}`);
logger.section('取得版本資料');
const releaseUrl = `${config.serverUrl}/api/v1/repos/${config.repository}/releases`;
logger.info(`RELEASE_URL=${releaseUrl}`);
let releases;
try {
releases = await fetchReleases(releaseUrl, { token: config.token, logger });
} catch (error) {
logger.fail(error.message);
return;
}
const { latest, version } = calculateVersion(releases, config.isBeta);
logger.info(`LATEST_VERSION=${latest}`);
logger.section('計算版本號');
logger.info(`NEW_VERSION=${version}`);
writeOutput('version', version);
}
main();