From cec5bced1670530e9b8a85ffbc432b8c19e8469f Mon Sep 17 00:00:00 2001 From: ILoveBingLu Date: Tue, 7 Apr 2026 01:17:46 +0800 Subject: [PATCH] fix: generate update manifests during packaging --- .github/workflows/release.yml | 4 +- package.json | 6 +-- scripts/generate-update-manifest.js | 81 +++++++++++++++++++++++++++++ 3 files changed, 86 insertions(+), 5 deletions(-) create mode 100644 scripts/generate-update-manifest.js diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 7f98f29..a8ecbee 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -137,7 +137,7 @@ jobs: path: | release/CipherTalk-${{ needs.prepare-meta.outputs.version }}-Setup.exe release/latest.yml - if-no-files-found: warn + if-no-files-found: error build-macos: runs-on: macos-latest @@ -197,7 +197,7 @@ jobs: path: | release/CipherTalk-${{ needs.prepare-meta.outputs.version }}-Setup.dmg release/latest-mac.yml - if-no-files-found: warn + if-no-files-found: error generate-release-body: runs-on: windows-latest diff --git a/package.json b/package.json index c442c03..b32026c 100644 --- a/package.json +++ b/package.json @@ -12,9 +12,9 @@ "build:prepare": "node scripts/update-readme-version.js && node scripts/prepare-release-announcement.js", "prebuild": "node scripts/update-readme-version.js && node scripts/prepare-release-announcement.js", "build": "tsc && vite build && electron-builder && node scripts/add-size-to-yml.js", - "build:win": "npm run build:prepare && tsc && vite build && node scripts/run-electron-builder.cjs win && node scripts/add-size-to-yml.js", - "build:mac": "npm run build:prepare && npm run build:prepare:mac && tsc && vite build && node scripts/run-electron-builder.cjs mac && node scripts/add-size-to-yml.js", - "build:ci": "node scripts/prepare-release-announcement.js && tsc && vite build && electron-builder --publish never && node scripts/add-size-to-yml.js", + "build:win": "npm run build:prepare && tsc && vite build && node scripts/run-electron-builder.cjs win && node scripts/generate-update-manifest.js win && node scripts/add-size-to-yml.js", + "build:mac": "npm run build:prepare && npm run build:prepare:mac && tsc && vite build && node scripts/run-electron-builder.cjs mac && node scripts/generate-update-manifest.js mac && node scripts/add-size-to-yml.js", + "build:ci": "node scripts/prepare-release-announcement.js && tsc && vite build && electron-builder --publish never && node scripts/generate-update-manifest.js && node scripts/add-size-to-yml.js", "build:mcp": "tsc && vite build", "build:force-update-manifest": "node scripts/generate-force-update-manifest.js", "build:release-context": "node scripts/generate-release-context.js", diff --git a/scripts/generate-update-manifest.js b/scripts/generate-update-manifest.js new file mode 100644 index 0000000..69e195a --- /dev/null +++ b/scripts/generate-update-manifest.js @@ -0,0 +1,81 @@ +const fs = require('fs') +const path = require('path') +const crypto = require('crypto') + +const pkg = require('../package.json') + +const releaseDir = path.join(__dirname, '..', 'release') +const inputTarget = process.argv[2] + +const targetMap = { + win: { + artifactName: `CipherTalk-${pkg.version}-Setup.exe`, + manifestName: 'latest.yml' + }, + mac: { + artifactName: `CipherTalk-${pkg.version}-Setup.dmg`, + manifestName: 'latest-mac.yml' + } +} + +function toSha512Base64(filePath) { + const fileBuffer = fs.readFileSync(filePath) + return crypto.createHash('sha512').update(fileBuffer).digest('base64') +} + +function formatManifest({ version, artifactName, sha512, size, releaseDate }) { + return [ + `version: ${version}`, + 'files:', + ` - url: ${artifactName}`, + ` sha512: ${sha512}`, + ` size: ${size}`, + `path: ${artifactName}`, + `sha512: ${sha512}`, + `releaseDate: '${releaseDate}'`, + '' + ].join('\n') +} + +function generateManifest(target) { + const { artifactName, manifestName } = targetMap[target] + const artifactPath = path.join(releaseDir, artifactName) + + if (!fs.existsSync(artifactPath)) { + return false + } + + const sha512 = toSha512Base64(artifactPath) + const size = fs.statSync(artifactPath).size + const releaseDate = new Date().toISOString() + const content = formatManifest({ + version: pkg.version, + artifactName, + sha512, + size, + releaseDate + }) + + fs.writeFileSync(path.join(releaseDir, manifestName), content, 'utf8') + console.log(`✅ ${manifestName} 已生成`) + return true +} + +if (inputTarget) { + if (!targetMap[inputTarget]) { + console.error('Usage: node scripts/generate-update-manifest.js [win|mac]') + process.exit(1) + } + + if (!generateManifest(inputTarget)) { + console.error(`Artifact not found for target: ${inputTarget}`) + process.exit(1) + } + process.exit(0) +} + +const generatedCount = Object.keys(targetMap).filter(generateManifest).length +if (generatedCount === 0) { + console.error('No supported artifacts found in release directory') + process.exit(1) +}