From 2150e94ad5afded073542b171f97c2a971860c93 Mon Sep 17 00:00:00 2001 From: Jerry Date: Sat, 19 Apr 2025 11:14:34 +0800 Subject: [PATCH] =?UTF-8?q?=E8=87=AA=E5=8A=A8=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 1 + pnpm-lock.yaml | 28 +++++++++++++++++ src/main.ts | 8 ++++- src/utils/core/autoUpdater.ts | 58 +++++++++++++++++++++++++++++++++++ 4 files changed, 94 insertions(+), 1 deletion(-) create mode 100644 src/utils/core/autoUpdater.ts diff --git a/package.json b/package.json index 7e0973c..37a12da 100644 --- a/package.json +++ b/package.json @@ -13,6 +13,7 @@ "express": "^4.18.0", "ioredis": "^5.6.0", "mkdirp": "^3.0.1", + "simple-git": "^3.27.0", "ws": "^8.18.1" }, "devDependencies": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index cd111d4..77eaf72 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -26,6 +26,9 @@ importers: mkdirp: specifier: ^3.0.1 version: 3.0.1 + simple-git: + specifier: ^3.27.0 + version: 3.27.0 ws: specifier: ^8.18.1 version: 8.18.1 @@ -71,6 +74,12 @@ packages: '@jridgewell/trace-mapping@0.3.9': resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + '@kwsites/file-exists@1.1.1': + resolution: {integrity: sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==} + + '@kwsites/promise-deferred@1.1.1': + resolution: {integrity: sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==} + '@tsconfig/node10@1.0.11': resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} @@ -619,6 +628,9 @@ packages: resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} engines: {node: '>= 0.4'} + simple-git@3.27.0: + resolution: {integrity: sha512-ivHoFS9Yi9GY49ogc6/YAi3Fl9ROnF4VyubNylgCkA+RVqLaKWnDSzXOVzya8csELIaWaYNutsEuAhZrtOjozA==} + source-map-support@0.5.21: resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} @@ -756,6 +768,14 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.0 + '@kwsites/file-exists@1.1.1': + dependencies: + debug: 4.4.0 + transitivePeerDependencies: + - supports-color + + '@kwsites/promise-deferred@1.1.1': {} + '@tsconfig/node10@1.0.11': {} '@tsconfig/node12@1.0.11': {} @@ -1329,6 +1349,14 @@ snapshots: side-channel-map: 1.0.1 side-channel-weakmap: 1.0.2 + simple-git@3.27.0: + dependencies: + '@kwsites/file-exists': 1.1.1 + '@kwsites/promise-deferred': 1.1.1 + debug: 4.4.0 + transitivePeerDependencies: + - supports-color + source-map-support@0.5.21: dependencies: buffer-from: 1.1.2 diff --git a/src/main.ts b/src/main.ts index 396f3eb..292d5e3 100644 --- a/src/main.ts +++ b/src/main.ts @@ -2,13 +2,19 @@ import apps from './app'; import logger from './utils/core/logger'; import config from './utils/core/config'; import redis from './services/redis/redis'; +import autoUpdater from './utils/core/autoUpdater'; config.check(['PORT', 'DEBUG', 'RD_PORT', 'RD_ADD', 'WS_SECRET', 'WS_PORT']); const PORT = config.get('PORT') || 3000; apps .createApp() - .then((app) => { + .then(async (app) => { + const isUpdated = await autoUpdater.checkForUpdates(); + if (isUpdated) { + logger.warn(`检测到更新,正在自动重启..`); + process.exit(0); + } app.listen(PORT, () => { logger.info(`Crystelf-core listening on ${PORT}`); }); diff --git a/src/utils/core/autoUpdater.ts b/src/utils/core/autoUpdater.ts new file mode 100644 index 0000000..48aeaa2 --- /dev/null +++ b/src/utils/core/autoUpdater.ts @@ -0,0 +1,58 @@ +import simpleGit, { SimpleGit } from 'simple-git'; +import paths from './path'; +import logger from './logger'; + +class AutoUpdater { + private git: SimpleGit; + private repoPath: string; + + constructor() { + this.git = simpleGit(); + this.repoPath = paths.get('root'); + } + + /** + * 检查远程更新 + */ + public async checkForUpdates(): Promise { + try { + logger.info('检查仓库更新中..'); + + const status = await this.git.status(); + if (status.ahead > 0) { + logger.info('检测到当地仓库有未提交的更改,跳过更新..'); + return false; + } + + logger.info('正在获取远程仓库信息..'); + await this.git.fetch(); + + const localBranch = status.current; + const diffSummary = await this.git.diffSummary([`${localBranch}..origin/${localBranch}`]); + + if (diffSummary.files.length > 0) { + logger.info('检测到远程仓库有更新!'); + + logger.info('正在拉取更新..'); + if (localBranch) { + await this.git.pull('origin', localBranch); + } else { + logger.error('当前分支名称未知,无法执行拉取操作..'); + return false; + } + + logger.info('更新成功!'); + return true; + } else { + logger.info('远程仓库没有新变化..'); + return false; + } + } catch (error) { + logger.error('检查仓库更新失败: ', error); + return false; + } + } +} + +const autoUpdater = new AutoUpdater(); +export default autoUpdater;