import { context, getOctokit } from '@actions/github' import fetch from 'node-fetch' import { resolveUpdateLog } from './updatelog.mjs' const UPDATE_TAG_NAME = 'updater' const UPDATE_JSON_FILE = 'update-fixed-webview2.json' const UPDATE_JSON_PROXY = 'update-fixed-webview2-proxy.json' /// generate update.json /// upload to update tag's release asset async function resolveUpdater() { if (process.env.GITHUB_TOKEN === undefined) { throw new Error('GITHUB_TOKEN is required') } const options = { owner: context.repo.owner, repo: context.repo.repo } const github = getOctokit(process.env.GITHUB_TOKEN) const { data: tags } = await github.rest.repos.listTags({ ...options, per_page: 10, page: 1, }) // get the latest publish tag const tag = tags.find((t) => t.name.startsWith('v')) console.log(tag) console.log() const { data: latestRelease } = await github.rest.repos.getReleaseByTag({ ...options, tag: tag.name, }) const updateData = { name: tag.name, notes: await resolveUpdateLog(tag.name), // use Changelog.md pub_date: new Date().toISOString(), platforms: { 'windows-x86_64': { signature: '', url: '' }, 'windows-aarch64': { signature: '', url: '' }, 'windows-x86': { signature: '', url: '' }, 'windows-i686': { signature: '', url: '' }, }, } const promises = latestRelease.assets.map(async (asset) => { const { name, browser_download_url } = asset // win64 url if (name.endsWith('x64_fixed_webview2-setup.exe')) { updateData.platforms['windows-x86_64'].url = browser_download_url } // win64 signature if (name.endsWith('x64_fixed_webview2-setup.exe.sig')) { const sig = await getSignature(browser_download_url) updateData.platforms['windows-x86_64'].signature = sig } // win32 url if (name.endsWith('x86_fixed_webview2-setup.exe')) { updateData.platforms['windows-x86'].url = browser_download_url updateData.platforms['windows-i686'].url = browser_download_url } // win32 signature if (name.endsWith('x86_fixed_webview2-setup.exe.sig')) { const sig = await getSignature(browser_download_url) updateData.platforms['windows-x86'].signature = sig updateData.platforms['windows-i686'].signature = sig } // win arm url if (name.endsWith('arm64_fixed_webview2-setup.exe')) { updateData.platforms['windows-aarch64'].url = browser_download_url } // win arm signature if (name.endsWith('arm64_fixed_webview2-setup.exe.sig')) { const sig = await getSignature(browser_download_url) updateData.platforms['windows-aarch64'].signature = sig } }) await Promise.allSettled(promises) console.log(updateData) // maybe should test the signature as well // delete the null field Object.entries(updateData.platforms).forEach(([key, value]) => { if (!value.url) { console.log(`[Error]: failed to parse release for "${key}"`) delete updateData.platforms[key] } }) // 生成一个代理github的更新文件 // 使用 https://hub.fastgit.xyz/ 做github资源的加速 const updateDataNew = JSON.parse(JSON.stringify(updateData)) Object.entries(updateDataNew.platforms).forEach(([key, value]) => { if (value.url) { updateDataNew.platforms[key].url = 'https://download.clashverge.dev/' + value.url } else { console.log(`[Error]: updateDataNew.platforms.${key} is null`) } }) // update the update.json const { data: updateRelease } = await github.rest.repos.getReleaseByTag({ ...options, tag: UPDATE_TAG_NAME, }) // delete the old assets for (const asset of updateRelease.assets) { if (asset.name === UPDATE_JSON_FILE) { await github.rest.repos.deleteReleaseAsset({ ...options, asset_id: asset.id, }) } if (asset.name === UPDATE_JSON_PROXY) { await github.rest.repos .deleteReleaseAsset({ ...options, asset_id: asset.id }) .catch(console.error) // do not break the pipeline } } // upload new assets await github.rest.repos.uploadReleaseAsset({ ...options, release_id: updateRelease.id, name: UPDATE_JSON_FILE, data: JSON.stringify(updateData, null, 2), }) await github.rest.repos.uploadReleaseAsset({ ...options, release_id: updateRelease.id, name: UPDATE_JSON_PROXY, data: JSON.stringify(updateDataNew, null, 2), }) } // get the signature file content async function getSignature(url) { const response = await fetch(url, { method: 'GET', headers: { 'Content-Type': 'application/octet-stream' }, }) return response.text() } resolveUpdater().catch(console.error)