mirror of
https://github.com/geekgeekrun/geekgeekrun.git
synced 2026-09-07 16:37:06 +08:00
add check update logic
This commit is contained in:
@@ -152,6 +152,7 @@ jobs:
|
|||||||
- name: Create release
|
- name: Create release
|
||||||
uses: ncipollo/release-action@v1
|
uses: ncipollo/release-action@v1
|
||||||
with:
|
with:
|
||||||
|
prerelease: true
|
||||||
allowUpdates: true
|
allowUpdates: true
|
||||||
artifacts: geekgeekrun-ui@${{ github.sha }}/*
|
artifacts: geekgeekrun-ui@${{ github.sha }}/*
|
||||||
tag: ${{ github.ref }}
|
tag: ${{ github.ref }}
|
||||||
|
|||||||
@@ -0,0 +1,7 @@
|
|||||||
|
export interface NewReleaseInfo {
|
||||||
|
releaseVersion: string
|
||||||
|
releasePageUrl: string
|
||||||
|
assetUrl: string
|
||||||
|
assetName: string
|
||||||
|
releaseNote: string
|
||||||
|
}
|
||||||
@@ -0,0 +1,103 @@
|
|||||||
|
import semver from 'semver'
|
||||||
|
import packageJson from '../../../package.json'
|
||||||
|
import os from 'node:os'
|
||||||
|
import gtag from '../utils/gtag'
|
||||||
|
import { NewReleaseInfo } from '../../common/types/update'
|
||||||
|
|
||||||
|
export const currentOsPlatform = os.platform()
|
||||||
|
const RELEASE_LIST_URL = `https://api.github.com/repos/geekgeekrun/geekgeekrun/releases`
|
||||||
|
|
||||||
|
export interface GitHubReleaseItem {
|
||||||
|
tag_name: string
|
||||||
|
prerelease: boolean
|
||||||
|
draft: boolean
|
||||||
|
html_url: string
|
||||||
|
body: string
|
||||||
|
assets: Array<{
|
||||||
|
browser_download_url: string
|
||||||
|
name: string
|
||||||
|
}>
|
||||||
|
}
|
||||||
|
|
||||||
|
// find by arch, appendix
|
||||||
|
function findTargetAsset(
|
||||||
|
assets: GitHubReleaseItem['assets']
|
||||||
|
): null | GitHubReleaseItem['assets'][number] {
|
||||||
|
let assetsFilteredByPlatform: GitHubReleaseItem['assets'] = []
|
||||||
|
switch (os.platform()) {
|
||||||
|
case 'win32': {
|
||||||
|
assetsFilteredByPlatform = assets.filter((it) => it.name.endsWith('.exe'))
|
||||||
|
break
|
||||||
|
}
|
||||||
|
case 'darwin': {
|
||||||
|
assetsFilteredByPlatform = assets.filter((it) => it.name.endsWith('.dmg'))
|
||||||
|
break
|
||||||
|
}
|
||||||
|
case 'linux': {
|
||||||
|
assetsFilteredByPlatform = assets.filter((it) => it.name.endsWith('.deb'))
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!assetsFilteredByPlatform?.length) {
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
if (assetsFilteredByPlatform.length === 1) {
|
||||||
|
return assetsFilteredByPlatform[0]
|
||||||
|
}
|
||||||
|
let targetAsset
|
||||||
|
if (os.platform() === 'darwin') {
|
||||||
|
targetAsset = assetsFilteredByPlatform.find((it) => it.name.includes(`_${os.arch()}`))
|
||||||
|
}
|
||||||
|
return targetAsset
|
||||||
|
}
|
||||||
|
|
||||||
|
export const checkUpdateForUi = async (): Promise<NewReleaseInfo | null> => {
|
||||||
|
let releaseList: GitHubReleaseItem[] = []
|
||||||
|
try {
|
||||||
|
const headers = new Headers()
|
||||||
|
headers.append('Accept', 'application/vnd.github+json')
|
||||||
|
headers.append('X-GitHub-Api-Version', '2022-11-28')
|
||||||
|
await fetch(RELEASE_LIST_URL, {
|
||||||
|
method: 'GET',
|
||||||
|
headers: headers,
|
||||||
|
redirect: 'follow'
|
||||||
|
})
|
||||||
|
.then((res) => res.json())
|
||||||
|
.then((res) => {
|
||||||
|
if (Array.isArray(res)) {
|
||||||
|
releaseList = res
|
||||||
|
} else {
|
||||||
|
throw res
|
||||||
|
}
|
||||||
|
})
|
||||||
|
} catch (err) {
|
||||||
|
gtag('check_update_error', { err: JSON.stringify(err) })
|
||||||
|
console.log(err)
|
||||||
|
}
|
||||||
|
console.log(releaseList)
|
||||||
|
const availableRelease = releaseList.find((it) => !it.draft && !it.prerelease)
|
||||||
|
if (!availableRelease) {
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
const availableReleaseVersion = availableRelease.tag_name.replace(/^(ui-v)/, '')
|
||||||
|
if (!semver.gt(availableReleaseVersion, packageJson.version)) {
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
const { assets } = availableRelease
|
||||||
|
const targetAsset = findTargetAsset(assets ?? [])
|
||||||
|
if (targetAsset) {
|
||||||
|
gtag('update_found', {
|
||||||
|
currentVersion: packageJson.version,
|
||||||
|
newVersion: availableReleaseVersion
|
||||||
|
})
|
||||||
|
console.log(targetAsset)
|
||||||
|
return {
|
||||||
|
releaseVersion: availableReleaseVersion,
|
||||||
|
releasePageUrl: availableRelease.html_url,
|
||||||
|
assetUrl: targetAsset.browser_download_url,
|
||||||
|
assetName: targetAsset.name,
|
||||||
|
releaseNote: availableRelease.body
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null
|
||||||
|
}
|
||||||
@@ -5,6 +5,7 @@ import './app-menu'
|
|||||||
import initIpc from './ipc'
|
import initIpc from './ipc'
|
||||||
import gtag from '../../utils/gtag'
|
import gtag from '../../utils/gtag'
|
||||||
import initPublicIpc from '../../utils/initPublicIpc'
|
import initPublicIpc from '../../utils/initPublicIpc'
|
||||||
|
import { checkUpdateForUi } from '../../features/updater'
|
||||||
export function openSettingWindow() {
|
export function openSettingWindow() {
|
||||||
// TODO: singleton lock; how can we check if there is another process should run as singleton with arguments?
|
// TODO: singleton lock; how can we check if there is another process should run as singleton with arguments?
|
||||||
if (!app.requestSingleInstanceLock()) {
|
if (!app.requestSingleInstanceLock()) {
|
||||||
@@ -65,4 +66,6 @@ export function openSettingWindow() {
|
|||||||
globalShortcut.unregister('Command+Option+Shift+/')
|
globalShortcut.unregister('Command+Option+Shift+/')
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
checkUpdateForUi()
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user