1+ import fetch from "node-fetch" ;
2+ import { getOctokit , context } from "@actions/github" ;
3+ import { resolveUpdateLog } from "./updatelog.mjs" ;
4+
5+ const UPDATE_TAG_NAME = "updater" ;
6+ const UPDATE_JSON_FILE = "update.json" ;
7+
8+ /// 生成 update.json 文件并更新 github updater release 中的文件
9+ async function resolveUpdater ( ) {
10+ if ( process . env . GITHUB_TOKEN === undefined ) {
11+ throw new Error ( "GITHUB_TOKEN is required" ) ;
12+ }
13+
14+ const options = { owner : context . repo . owner , repo : context . repo . repo } ;
15+ const github = getOctokit ( process . env . GITHUB_TOKEN ) ;
16+
17+ const { data : tags } = await github . rest . repos . listTags ( {
18+ ...options ,
19+ per_page : 10 ,
20+ page : 1 ,
21+ } ) ;
22+
23+ const tag = tags . find ( ( t ) => t . name . startsWith ( "v" ) ) ;
24+
25+ console . log ( tag ) ;
26+
27+ const { data : latestRelease } = await github . rest . repos . getReleaseByTag ( {
28+ ...options ,
29+ tag : tag . name ,
30+ } ) ;
31+
32+ // 根据需要选择需更新的平台,应与编译脚本平台选择对应
33+ const updateData = {
34+ version : tag . name ,
35+ notes : await resolveUpdateLog ( tag . name ) ,
36+ pub_date : new Date ( ) . toISOString ( ) ,
37+ platforms : {
38+ // comment out as needed
39+ "windows-x86_64" : { signature : "" , url : "" } ,
40+ // "darwin-aarch64": { signature: "", url: "" },
41+ "darwin-x86_64" : { signature : "" , url : "" } ,
42+ "linux-x86_64" : { signature : "" , url : "" } ,
43+ } ,
44+ } ;
45+
46+ const promises = latestRelease . assets . map ( async ( asset ) => {
47+ const { name, browser_download_url } = asset ;
48+
49+ // windows-x86_64 url
50+ if ( name . endsWith ( ".msi.zip" ) ) {
51+ updateData . platforms [ "windows-x86_64" ] . url = browser_download_url ;
52+ }
53+
54+ // windows-x86_64 signature
55+ if ( name . endsWith ( ".msi.zip.sig" ) ) {
56+ const sig = await getSignature ( browser_download_url ) ;
57+ updateData . platforms [ "windows-x86_64" ] . signature = sig ;
58+ }
59+
60+ // darwin-x86_64 url (macos intel)
61+ if ( name . endsWith ( ".app.tar.gz" ) && ! name . includes ( "aarch" ) ) {
62+ updateData . platforms [ "darwin-x86_64" ] . url = browser_download_url ;
63+ }
64+ // darwin-x86_64 signature (macos intel)
65+ if ( name . endsWith ( ".app.tar.gz.sig" ) && ! name . includes ( "aarch" ) ) {
66+ const sig = await getSignature ( browser_download_url ) ;
67+ updateData . platforms [ "darwin-x86_64" ] . signature = sig ;
68+ }
69+
70+ // darwin-aarch64 url (macos silicon)
71+ if ( name . endsWith ( "aarch64.app.tar.gz" ) ) {
72+ updateData . platforms [ "darwin-aarch64" ] . url = browser_download_url ;
73+ }
74+
75+ // darwin-aarch64 signature (macos silicon)
76+ if ( name . endsWith ( "aarch64.app.tar.gz.sig" ) ) {
77+ const sig = await getSignature ( browser_download_url ) ;
78+ updateData . platforms [ "darwin-aarch64" ] . signature = sig ;
79+ }
80+
81+ // linux-x86_64 url
82+ if ( name . endsWith ( ".AppImage.tar.gz" ) ) {
83+ updateData . platforms [ "linux-x86_64" ] . url = browser_download_url ;
84+ }
85+ // linux-x86_64 signature
86+ if ( name . endsWith ( ".AppImage.tar.gz.sig" ) ) {
87+ const sig = await getSignature ( browser_download_url ) ;
88+ updateData . platforms [ "linux-x86_64" ] . signature = sig ;
89+ }
90+ } ) ;
91+
92+ await Promise . allSettled ( promises ) ;
93+ console . log ( updateData ) ;
94+
95+ Object . entries ( updateData . platforms ) . forEach ( ( [ key , value ] ) => {
96+ if ( ! value . url ) {
97+ console . log ( `[Error]: failed to parse release for "${ key } "` ) ;
98+ delete updateData . platforms [ key ] ;
99+ }
100+ } ) ;
101+
102+ // 更新 update.json 文件
103+ const { data : updateRelease } = await github . rest . repos . getReleaseByTag ( {
104+ ...options ,
105+ tag : UPDATE_TAG_NAME ,
106+ } ) ;
107+
108+ for ( let asset of updateRelease . assets ) {
109+ if ( asset . name === UPDATE_JSON_FILE ) {
110+ await github . rest . repos . deleteReleaseAsset ( {
111+ ...options ,
112+ asset_id : asset . id ,
113+ } ) ;
114+ }
115+ }
116+
117+ await github . rest . repos . uploadReleaseAsset ( {
118+ ...options ,
119+ release_id : updateRelease . id ,
120+ name : UPDATE_JSON_FILE ,
121+ data : JSON . stringify ( updateData , null , 2 ) ,
122+ } ) ;
123+ }
124+
125+ async function getSignature ( url ) {
126+ const response = await fetch ( url , {
127+ method : "GET" ,
128+ headers : { "Content-Type" : "application/octet-stream" } ,
129+ } ) ;
130+
131+ return response . text ( ) ;
132+ }
133+
134+ resolveUpdater ( ) . catch ( console . error ) ;
0 commit comments