diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 93aab01..733da2e 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -89,7 +89,13 @@ jobs: run: | pnpm install pnpm add @mihomo-party/sysproxy-win32-${{ matrix.arch }}-msvc - pnpm prepare --${{ matrix.arch }} + - name: Update Version for Dev Build + if: github.event_name == 'workflow_dispatch' + env: + GITHUB_EVENT_NAME: workflow_dispatch + run: node scripts/update-version.mjs + - name: Prepare + run: pnpm prepare --${{ matrix.arch }} - name: Build env: npm_config_arch: ${{ matrix.arch }} @@ -159,7 +165,13 @@ jobs: pnpm add @mihomo-party/sysproxy-win32-${{ matrix.arch }}-msvc pnpm add -D electron@22.3.27 (Get-Content electron-builder.yml) -replace 'windows', 'win7' | Set-Content electron-builder.yml - pnpm prepare --${{ matrix.arch }} + - name: Update Version for Dev Build + if: github.event_name == 'workflow_dispatch' + env: + GITHUB_EVENT_NAME: workflow_dispatch + run: node scripts/update-version.mjs + - name: Prepare + run: pnpm prepare --${{ matrix.arch }} - name: Build env: npm_config_arch: ${{ matrix.arch }} @@ -228,7 +240,13 @@ jobs: pnpm install pnpm add @mihomo-party/sysproxy-linux-${{ matrix.arch }}-gnu sed -i "s/productName: Clash Party/productName: mihomo-party/" electron-builder.yml - pnpm prepare --${{ matrix.arch }} + - name: Update Version for Dev Build + if: github.event_name == 'workflow_dispatch' + env: + GITHUB_EVENT_NAME: workflow_dispatch + run: node scripts/update-version.mjs + - name: Prepare + run: pnpm prepare --${{ matrix.arch }} - name: Build env: npm_config_arch: ${{ matrix.arch }} @@ -290,7 +308,13 @@ jobs: run: | pnpm install pnpm add @mihomo-party/sysproxy-darwin-${{ matrix.arch }} - pnpm prepare --${{ matrix.arch }} + - name: Update Version for Dev Build + if: github.event_name == 'workflow_dispatch' + env: + GITHUB_EVENT_NAME: workflow_dispatch + run: node scripts/update-version.mjs + - name: Prepare + run: pnpm prepare --${{ matrix.arch }} - name: Build env: npm_config_arch: ${{ matrix.arch }} @@ -376,7 +400,13 @@ jobs: pnpm install pnpm add @mihomo-party/sysproxy-darwin-${{ matrix.arch }} pnpm add -D electron@32.2.2 - pnpm prepare --${{ matrix.arch }} + - name: Update Version for Dev Build + if: github.event_name == 'workflow_dispatch' + env: + GITHUB_EVENT_NAME: workflow_dispatch + run: node scripts/update-version.mjs + - name: Prepare + run: pnpm prepare --${{ matrix.arch }} - name: Build env: npm_config_arch: ${{ matrix.arch }} @@ -451,6 +481,11 @@ jobs: run: npm install -g pnpm - name: Install Dependencies run: pnpm install + - name: Update Version for Dev Build + if: github.event_name == 'workflow_dispatch' + env: + GITHUB_EVENT_NAME: workflow_dispatch + run: node scripts/update-version.mjs - name: Telegram Notification if: startsWith(github.ref, 'refs/tags/v') env: diff --git a/package.json b/package.json index 3a94569..83683f4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "mihomo-party", - "version": "1.8.6-dev", + "version": "1.8.6", "description": "Clash Party", "main": "./out/main/index.js", "author": "mihomo-party-org", @@ -12,6 +12,7 @@ "typecheck:web": "tsc --noEmit -p tsconfig.web.json --composite false", "typecheck": "npm run typecheck:node && npm run typecheck:web", "prepare": "node scripts/prepare.mjs", + "prepare:dev": "node scripts/update-version.mjs && node scripts/prepare.mjs", "updater": "node scripts/updater.mjs", "checksum": "node scripts/checksum.mjs", "telegram": "node scripts/telegram.mjs release", @@ -20,8 +21,11 @@ "dev": "electron-vite dev", "postinstall": "electron-builder install-app-deps", "build:win": "electron-vite build && electron-builder --publish never --win", + "build:win:dev": "npm run prepare:dev && electron-vite build && electron-builder --publish never --win", "build:mac": "electron-vite build && electron-builder --publish never --mac", - "build:linux": "electron-vite build && electron-builder --publish never --linux" + "build:mac:dev": "npm run prepare:dev && electron-vite build && electron-builder --publish never --mac", + "build:linux": "electron-vite build && electron-builder --publish never --linux", + "build:linux:dev": "npm run prepare:dev && electron-vite build && electron-builder --publish never --linux" }, "dependencies": { "@electron-toolkit/preload": "^3.0.2", diff --git a/scripts/telegram.mjs b/scripts/telegram.mjs index a493817..79fac47 100644 --- a/scripts/telegram.mjs +++ b/scripts/telegram.mjs @@ -1,13 +1,16 @@ import axios from 'axios' import { readFileSync } from 'fs' +import { getProcessedVersion, isDevBuild, getDownloadUrl, generateDownloadLinksMarkdown, getGitCommitHash } from './version-utils.mjs' const chat_id = '@MihomoPartyChannel' const pkg = readFileSync('package.json', 'utf-8') const changelog = readFileSync('changelog.md', 'utf-8') -const { version } = JSON.parse(pkg) +const { version: packageVersion } = JSON.parse(pkg) +// 获取处理后的版本号 +const version = getProcessedVersion() const releaseType = process.env.RELEASE_TYPE || process.argv[2] || 'release' -const isDevRelease = releaseType === 'dev' +const isDevRelease = releaseType === 'dev' || isDevBuild() function convertMarkdownToTelegramHTML(content) { return content @@ -42,50 +45,34 @@ function convertMarkdownToTelegramHTML(content) { let content = ''; if (isDevRelease) { - - const commitSha = process.env.GITHUB_SHA || 'unknown' - const shortCommitSha = commitSha.substring(0, 7) + // 版本号中提取commit hash + const shortCommitSha = getGitCommitHash(true) + const commitSha = getGitCommitHash(false) - content = `🚧 Clash Party Dev Build 开发版本发布\n\n` + content = `🚧 Clash Party Dev Build 开发版本发布\n\n` content += `基于版本: ${version}\n` - content += `提交哈希: ${shortCommitSha}\n\n` + content += `提交哈希: ${shortCommitSha}\n\n` content += `更新日志:\n` content += convertMarkdownToTelegramHTML(changelog) content += '\n\n⚠️ 注意:这是开发版本,可能存在不稳定性,仅供测试使用\n' } else { // 正式版本通知 - content = `🌟 Clash Party v${version} 正式发布\n\n` + content = `🌟 Clash Party v${version} 正式发布\n\n` content += convertMarkdownToTelegramHTML(changelog) } // 构建下载链接 -const downloadUrl = isDevRelease - ? `https://github.com/mihomo-party-org/mihomo-party/releases/download/dev` - : `https://github.com/mihomo-party-org/mihomo-party/releases/download/v${version}` +const downloadUrl = getDownloadUrl(isDevRelease, version) -content += '\n下载地址:\nWindows10/11:\n' -content += `安装版:64位 | 32位 | ARM64\n` -content += `便携版:64位 | 32位 | ARM64\n` -content += '\nWindows7/8:\n' -content += `安装版:64位 | 32位\n` -content += `便携版:64位 | 32位\n` -content += '\nmacOS 11+:\n' -content += `PKG:Intel | Apple Silicon\n` -content += '\nmacOS 10.15+:\n' -content += `PKG:Intel | Apple Silicon\n` -content += '\nLinux:\n' -content += `DEB:64位 | ARM64\n` -content += `RPM:64位 | ARM64` +const downloadLinksMarkdown = generateDownloadLinksMarkdown(downloadUrl, version) +content += convertMarkdownToTelegramHTML(downloadLinksMarkdown) await axios.post(`https://api.telegram.org/bot${process.env.TELEGRAM_BOT_TOKEN}/sendMessage`, { chat_id, text: content, link_preview_options: { is_disabled: false, - url: 'https://github.com/mihomo-party-org/mihomo-party', + url: 'https://github.com/mihomo-party-org/clash-party', prefer_large_media: true }, parse_mode: 'HTML' diff --git a/scripts/update-version.mjs b/scripts/update-version.mjs new file mode 100644 index 0000000..8f758e1 --- /dev/null +++ b/scripts/update-version.mjs @@ -0,0 +1,34 @@ +import { readFileSync, writeFileSync } from 'fs' +import { getProcessedVersion, isDevBuild } from './version-utils.mjs' + +// 更新package.json中的版本号 +function updatePackageVersion() { + try { + const packagePath = 'package.json' + const packageContent = readFileSync(packagePath, 'utf-8') + const packageData = JSON.parse(packageContent) + + // 获取处理后的版本号 + const newVersion = getProcessedVersion() + + console.log(`当前版本: ${packageData.version}`) + console.log(`${isDevBuild() ? 'Dev构建' : '正式构建'} - 新版本: ${newVersion}`) + + packageData.version = newVersion + + // 写回package.json + writeFileSync(packagePath, JSON.stringify(packageData, null, 2) + '\n') + + console.log(`✅ package.json版本号已更新为: ${newVersion}`) + + } catch (error) { + console.error('❌ 更新package.json版本号失败:', error.message) + process.exit(1) + } +} + +if (import.meta.url === `file://${process.argv[1]}`) { + updatePackageVersion() +} + +export { updatePackageVersion } \ No newline at end of file diff --git a/scripts/updater.mjs b/scripts/updater.mjs index 4a180b8..de9e455 100644 --- a/scripts/updater.mjs +++ b/scripts/updater.mjs @@ -1,28 +1,23 @@ import yaml from 'yaml' import { readFileSync, writeFileSync } from 'fs' +import { getProcessedVersion, isDevBuild, getDownloadUrl, generateDownloadLinksMarkdown } from './version-utils.mjs' const pkg = readFileSync('package.json', 'utf-8') let changelog = readFileSync('changelog.md', 'utf-8') -const { version } = JSON.parse(pkg) -const downloadUrl = `https://github.com/mihomo-party-org/mihomo-party/releases/download/v${version}` +const { version: packageVersion } = JSON.parse(pkg) + +// 获取处理后的版本号 +const version = getProcessedVersion() +const isDev = isDevBuild() +const downloadUrl = getDownloadUrl(isDev, version) + const latest = { version, changelog } -changelog += '\n### 下载地址:\n\n#### Windows10/11:\n\n' -changelog += `- 安装版:[64位](${downloadUrl}/mihomo-party-windows-${version}-x64-setup.exe) | [32位](${downloadUrl}/mihomo-party-windows-${version}-ia32-setup.exe) | [ARM64](${downloadUrl}/mihomo-party-windows-${version}-arm64-setup.exe)\n\n` -changelog += `- 便携版:[64位](${downloadUrl}/mihomo-party-windows-${version}-x64-portable.7z) | [32位](${downloadUrl}/mihomo-party-windows-${version}-ia32-portable.7z) | [ARM64](${downloadUrl}/mihomo-party-windows-${version}-arm64-portable.7z)\n\n` -changelog += '\n#### Windows7/8:\n\n' -changelog += `- 安装版:[64位](${downloadUrl}/mihomo-party-win7-${version}-x64-setup.exe) | [32位](${downloadUrl}/mihomo-party-win7-${version}-ia32-setup.exe)\n\n` -changelog += `- 便携版:[64位](${downloadUrl}/mihomo-party-win7-${version}-x64-portable.7z) | [32位](${downloadUrl}/mihomo-party-win7-${version}-ia32-portable.7z)\n\n` -changelog += '\n#### macOS 11+:\n\n' -changelog += `- PKG:[Intel](${downloadUrl}/mihomo-party-macos-${version}-x64.pkg) | [Apple Silicon](${downloadUrl}/mihomo-party-macos-${version}-arm64.pkg)\n\n` -changelog += '\n#### macOS 10.15+:\n\n' -changelog += `- PKG:[Intel](${downloadUrl}/mihomo-party-catalina-${version}-x64.pkg) | [Apple Silicon](${downloadUrl}/mihomo-party-catalina-${version}-arm64.pkg)\n\n` -changelog += '\n#### Linux:\n\n' -changelog += `- DEB:[64位](${downloadUrl}/mihomo-party-linux-${version}-amd64.deb) | [ARM64](${downloadUrl}/mihomo-party-linux-${version}-arm64.deb)\n\n` -changelog += `- RPM:[64位](${downloadUrl}/mihomo-party-linux-${version}-x86_64.rpm) | [ARM64](${downloadUrl}/mihomo-party-linux-${version}-aarch64.rpm)` +// 使用统一的下载链接生成函数 +changelog += generateDownloadLinksMarkdown(downloadUrl, version) changelog += '\n\n### 机场推荐:\n- 高性能海外机场,稳定首选:[https://狗狗加速.com](https://party.dginv.click/#/register?code=ARdo0mXx)' diff --git a/scripts/version-utils.mjs b/scripts/version-utils.mjs new file mode 100644 index 0000000..4592e54 --- /dev/null +++ b/scripts/version-utils.mjs @@ -0,0 +1,86 @@ +import { execSync } from 'child_process' +import { readFileSync } from 'fs' + + // 获取Git commit hash +export function getGitCommitHash(short = true) { + try { + const command = short ? 'git rev-parse --short HEAD' : 'git rev-parse HEAD' + return execSync(command, { encoding: 'utf-8' }).trim() + } catch (error) { + console.warn('Failed to get git commit hash:', error.message) + return 'unknown' + } +} + + // 获取当前月份日期 +export function getCurrentMonthDate() { + const now = new Date() + const month = String(now.getMonth() + 1).padStart(2, '0') + const day = String(now.getDate()).padStart(2, '0') + return `${month}${day}` +} + + // 从package.json读取基础版本号 +export function getBaseVersion() { + try { + const pkg = readFileSync('package.json', 'utf-8') + const { version } = JSON.parse(pkg) + // 移除dev版本格式后缀 + return version.replace('-dev', '').replace(/-\d{4}-[a-f0-9]{7}$/, '') + } catch (error) { + console.error('Failed to read package.json:', error.message) + return '1.0.0' + } +} + + // 生成dev版本号 +export function getDevVersion() { + const baseVersion = getBaseVersion() + const monthDate = getCurrentMonthDate() + const commitHash = getGitCommitHash(true) + + return `${baseVersion}-${monthDate}-${commitHash}` +} + + // 检查当前环境是否为dev构建 +export function isDevBuild() { + return process.env.NODE_ENV === 'development' || + process.argv.includes('--dev') || + process.env.GITHUB_EVENT_NAME === 'workflow_dispatch' +} + + // 获取处理后的版本号 +export function getProcessedVersion() { + if (isDevBuild()) { + return getDevVersion() + } else { + return getBaseVersion() + } +} + + // 生成下载URL +export function getDownloadUrl(isDev, version) { + if (isDev) { + return 'https://github.com/mihomo-party-org/clash-party/releases/download/dev' + } else { + return `https://github.com/mihomo-party-org/clash-party/releases/download/v${version}` + } +} + +export function generateDownloadLinksMarkdown(downloadUrl, version) { + let links = '\n### 下载地址:\n\n#### Windows10/11:\n\n' + links += `- 安装版:[64位](${downloadUrl}/clash-party-windows-${version}-x64-setup.exe) | [32位](${downloadUrl}/clash-party-windows-${version}-ia32-setup.exe) | [ARM64](${downloadUrl}/clash-party-windows-${version}-arm64-setup.exe)\n\n` + links += `- 便携版:[64位](${downloadUrl}/clash-party-windows-${version}-x64-portable.7z) | [32位](${downloadUrl}/clash-party-windows-${version}-ia32-portable.7z) | [ARM64](${downloadUrl}/clash-party-windows-${version}-arm64-portable.7z)\n\n` + links += '\n#### Windows7/8:\n\n' + links += `- 安装版:[64位](${downloadUrl}/clash-party-win7-${version}-x64-setup.exe) | [32位](${downloadUrl}/clash-party-win7-${version}-ia32-setup.exe)\n\n` + links += `- 便携版:[64位](${downloadUrl}/clash-party-win7-${version}-x64-portable.7z) | [32位](${downloadUrl}/clash-party-win7-${version}-ia32-portable.7z)\n\n` + links += '\n#### macOS 11+:\n\n' + links += `- PKG:[Intel](${downloadUrl}/clash-party-macos-${version}-x64.pkg) | [Apple Silicon](${downloadUrl}/clash-party-macos-${version}-arm64.pkg)\n\n` + links += '\n#### macOS 10.15+:\n\n' + links += `- PKG:[Intel](${downloadUrl}/clash-party-catalina-${version}-x64.pkg) | [Apple Silicon](${downloadUrl}/clash-party-catalina-${version}-arm64.pkg)\n\n` + links += '\n#### Linux:\n\n' + links += `- DEB:[64位](${downloadUrl}/clash-party-linux-${version}-amd64.deb) | [ARM64](${downloadUrl}/clash-party-linux-${version}-arm64.deb)\n\n` + links += `- RPM:[64位](${downloadUrl}/clash-party-linux-${version}-x86_64.rpm) | [ARM64](${downloadUrl}/clash-party-linux-${version}-aarch64.rpm)` + + return links +} \ No newline at end of file