@@ -21,21 +21,50 @@ async function verifyReleaseAssets() {
2121 const repo = "AliFullStack" ;
2222 const token = process . env . GITHUB_TOKEN ;
2323
24- // Fetch all releases (including drafts) with retry logic
24+ if ( ! token ) {
25+ console . error ( "❌ Missing GITHUB_TOKEN environment variable!" ) ;
26+ process . exit ( 1 ) ;
27+ }
28+
29+ const inGitHubActions = process . env . GITHUB_ACTIONS === "true" ;
30+
31+ // ✅ Skip token validation in GitHub Actions (since built-in token is limited)
32+ if ( ! inGitHubActions ) {
33+ console . log ( "🔐 Checking GITHUB_TOKEN permissions..." ) ;
34+
35+ const userCheck = await fetch ( "https://api.github.com/user" , {
36+ headers : {
37+ Authorization : `token ${ token } ` ,
38+ Accept : "application/vnd.github.v3+json" ,
39+ "User-Agent" : "dyad-release-verifier" ,
40+ } ,
41+ } ) ;
42+
43+ if ( ! userCheck . ok ) {
44+ const body = await userCheck . text ( ) ;
45+ console . error ( "❌ Token authentication failed!" ) ;
46+ console . error ( `Status: ${ userCheck . status } ${ userCheck . statusText } ` ) ;
47+ console . error ( `Response body: ${ body } ` ) ;
48+ process . exit ( 1 ) ;
49+ }
50+
51+ const userData = await userCheck . json ( ) ;
52+ console . log ( `✅ Authenticated as: ${ userData . login } ` ) ;
53+ } else {
54+ console . log ( "🏃 Running inside GitHub Actions — skipping token permission check" ) ;
55+ }
56+
57+ // --- Fetch releases with retry logic ---
2558 const tagName = `v${ version } ` ;
2659 const maxRetries = 5 ;
2760 const baseDelay = 10000 ; // 10 seconds
28-
2961 let release = null ;
3062 let lastError = null ;
3163
3264 for ( let attempt = 1 ; attempt <= maxRetries ; attempt ++ ) {
3365 try {
3466 console . log (
35- `📡 Attempt ${ attempt } /${ maxRetries } : Fetching all releases to find: ${ tagName } ` ,
36- ) ;
37- console . log (
38- `🔗 API URL: https://api.github.com/repos/${ owner } /${ repo } /releases` ,
67+ `📡 Attempt ${ attempt } /${ maxRetries } : Fetching releases to find: ${ tagName } ` ,
3968 ) ;
4069
4170 const allReleasesUrl = `https://api.github.com/repos/${ owner } /${ repo } /releases` ;
@@ -47,131 +76,68 @@ async function verifyReleaseAssets() {
4776 } ,
4877 } ) ;
4978
50-
5179 if ( ! response . ok ) {
52- console . error ( `❌ GitHub API error details:` ) ;
53- console . error ( ` Status: ${ response . status } ` ) ;
54- console . error ( ` Status Text: ${ response . statusText } ` ) ;
55- console . error ( ` URL: ${ allReleasesUrl } ` ) ;
56- console . error (
57- ` Headers:` ,
58- Object . fromEntries ( response . headers . entries ( ) ) ,
59- ) ;
60-
61- // Try to get response body for more details
62- try {
63- const errorBody = await response . text ( ) ;
64- console . error ( ` Response Body: ${ errorBody } ` ) ;
65- } catch ( e ) {
66- console . error (
67- ` Could not read error response body: ${ e . message } ` ,
68- ) ;
69- }
70-
71- throw new Error (
72- `GitHub API error: ${ response . status } ${ response . statusText } ` ,
73- ) ;
80+ console . error ( `❌ GitHub API error: ${ response . status } ${ response . statusText } ` ) ;
81+ const errorBody = await response . text ( ) ;
82+ console . error ( `Response Body: ${ errorBody } ` ) ;
83+ throw new Error ( `GitHub API returned ${ response . status } ` ) ;
7484 }
7585
7686 const allReleases = await response . json ( ) ;
77- console . log ( `📦 Total releases found: ${ allReleases . length } ` ) ;
78- console . log (
79- `🔍 Available release tags:` ,
80- allReleases . map ( ( r ) => r . tag_name ) . slice ( 0 , 10 ) ,
81- ) ;
8287
83- // Check if release exists at all
8488 const releaseExists = allReleases . some ( ( r ) => r . tag_name === tagName ) ;
8589 if ( ! releaseExists ) {
86- console . error (
87- `❌ Release ${ tagName } does not exist in the repository!` ,
88- ) ;
89- console . error ( `📋 All available releases:` ) ;
90- allReleases . forEach ( ( r ) => {
91- console . error (
92- ` - ${ r . tag_name } (${ r . draft ? "DRAFT" : "PUBLISHED" } )` ,
93- ) ;
94- } ) ;
95- throw new Error ( `Release ${ tagName } not found in repository` ) ;
96- }
97-
98- release = allReleases . find ( ( r ) => r . tag_name === tagName ) ;
99-
100- if ( release ) {
101- console . log (
102- `✅ Found release on attempt ${ attempt } : ${ release . tag_name } (${ release . draft ? "DRAFT" : "PUBLISHED" } )` ,
103- ) ;
104- break ;
105- } else {
106- console . warn (
107- `⚠️ Release ${ tagName } not found on attempt ${ attempt } . Available releases (first 10):` ,
108- ) ;
109- allReleases . slice ( 0 , 10 ) . forEach ( ( r ) => {
110- console . warn (
111- ` - ${ r . tag_name } (${ r . draft ? "DRAFT" : "PUBLISHED" } )` ,
112- ) ;
113- } ) ;
114-
90+ console . warn ( `⚠️ Release ${ tagName } not found. Retrying...` ) ;
11591 if ( attempt < maxRetries ) {
116- const delay = baseDelay * attempt ; // Exponential backoff: 10s, 20s, 30s, 40s, 50s
117- console . log ( `⏳ Waiting ${ delay / 1000 } seconds before retry...` ) ;
118- await new Promise ( ( resolve ) => setTimeout ( resolve , delay ) ) ;
92+ const delay = baseDelay * attempt ;
93+ console . log ( `⏳ Waiting ${ delay / 1000 } s before retry...` ) ;
94+ await new Promise ( ( r ) => setTimeout ( r , delay ) ) ;
11995 }
96+ continue ;
12097 }
121- } catch ( error ) {
122- lastError = error ;
123- console . error ( `❌ Attempt ${ attempt } failed:` , error . message ) ;
12498
99+ release = allReleases . find ( ( r ) => r . tag_name === tagName ) ;
100+ console . log (
101+ `✅ Found release: ${ release . tag_name } (${ release . draft ? "DRAFT" : "PUBLISHED" } )` ,
102+ ) ;
103+ break ;
104+ } catch ( err ) {
105+ lastError = err ;
106+ console . error ( `❌ Attempt ${ attempt } failed: ${ err . message } ` ) ;
125107 if ( attempt < maxRetries ) {
126108 const delay = baseDelay * attempt ;
127- console . log ( `⏳ Waiting ${ delay / 1000 } seconds before retry ...` ) ;
128- await new Promise ( ( resolve ) => setTimeout ( resolve , delay ) ) ;
109+ console . log ( `⏳ Retrying in ${ delay / 1000 } s ...` ) ;
110+ await new Promise ( ( r ) => setTimeout ( r , delay ) ) ;
129111 }
130112 }
131113 }
132114
133115 if ( ! release ) {
134- console . error (
135- `❌ Release ${ tagName } not found after ${ maxRetries } attempts!` ,
136- ) ;
137- if ( lastError ) {
138- console . error ( `Last error: ${ lastError . message } ` ) ;
139- }
140- throw new Error (
141- `Release ${ tagName } not found in published releases or drafts after retries. Make sure the release exists.` ,
142- ) ;
116+ console . error ( `❌ Release ${ tagName } not found after ${ maxRetries } attempts` ) ;
117+ if ( lastError ) console . error ( `Last error: ${ lastError . message } ` ) ;
118+ process . exit ( 1 ) ;
143119 }
144120
145- console . log (
146- `✅ Found release: ${ release . tag_name } (${ release . draft ? "DRAFT" : "PUBLISHED" } )` ,
147- ) ;
148-
149121 const assets = release . assets || [ ] ;
150122
151123 console . log ( `📦 Found ${ assets . length } assets in release ${ tagName } ` ) ;
152124 console . log ( `📄 Release status: ${ release . draft ? "DRAFT" : "PUBLISHED" } ` ) ;
153125
154- // Handle different beta naming conventions across platforms
126+ // --- Define expected assets ---
155127 const normalizeVersionForPlatform = ( version , platform ) => {
156- if ( ! version . includes ( "beta" ) ) {
157- return version ;
158- }
128+ if ( ! version . includes ( "beta" ) ) return version ;
159129
160130 switch ( platform ) {
161131 case "rpm" :
162132 case "deb" :
163- // RPM and DEB use dots: 0.14.0-beta.1 -> 0.14.0.beta.1
164133 return version . replace ( "-beta." , ".beta." ) ;
165134 case "nupkg" :
166- // NuGet removes the dot: 0.14.0-beta.1 -> 0.14.0-beta1
167135 return version . replace ( "-beta." , "-beta" ) ;
168136 default :
169- // Windows installer and macOS zips keep original format
170137 return version ;
171138 }
172139 } ;
173140
174- // Define expected assets with platform-specific version handling
175141 const expectedAssets = [
176142 `dyad-${ normalizeVersionForPlatform ( version , "rpm" ) } -1.x86_64.rpm` ,
177143 `dyad-${ normalizeVersionForPlatform ( version , "nupkg" ) } -full.nupkg` ,
@@ -183,47 +149,31 @@ async function verifyReleaseAssets() {
183149 ] ;
184150
185151 console . log ( "📋 Expected assets:" ) ;
186- expectedAssets . forEach ( ( asset ) => console . log ( ` - ${ asset } ` ) ) ;
152+ expectedAssets . forEach ( ( a ) => console . log ( ` - ${ a } ` ) ) ;
187153 console . log ( "" ) ;
188154
189- // Get actual asset names
190- const actualAssets = assets . map ( ( asset ) => asset . name ) ;
191-
155+ const actualAssets = assets . map ( ( a ) => a . name ) ;
192156 console . log ( "📋 Actual assets:" ) ;
193- actualAssets . forEach ( ( asset ) => console . log ( ` - ${ asset } ` ) ) ;
157+ actualAssets . forEach ( ( a ) => console . log ( ` - ${ a } ` ) ) ;
194158 console . log ( "" ) ;
195159
196- // Check for missing assets
197- const missingAssets = expectedAssets . filter (
198- ( expected ) => ! actualAssets . includes ( expected ) ,
199- ) ;
200-
160+ // --- Compare assets ---
161+ const missingAssets = expectedAssets . filter ( ( a ) => ! actualAssets . includes ( a ) ) ;
201162 if ( missingAssets . length > 0 ) {
202- console . error ( "❌ VERIFICATION FAILED!" ) ;
203- console . error ( "📭 Missing assets:" ) ;
204- missingAssets . forEach ( ( asset ) => console . error ( ` - ${ asset } ` ) ) ;
205- console . error ( "" ) ;
206- console . error (
207- "Please ensure all platforms have completed their builds and uploads." ,
208- ) ;
163+ console . error ( "❌ VERIFICATION FAILED! Missing assets:" ) ;
164+ missingAssets . forEach ( ( a ) => console . error ( ` - ${ a } ` ) ) ;
209165 process . exit ( 1 ) ;
210166 }
211167
212- // Check for unexpected assets (optional warning)
213- const unexpectedAssets = actualAssets . filter (
214- ( actual ) => ! expectedAssets . includes ( actual ) ,
215- ) ;
216-
168+ const unexpectedAssets = actualAssets . filter ( ( a ) => ! expectedAssets . includes ( a ) ) ;
217169 if ( unexpectedAssets . length > 0 ) {
218- console . warn ( "⚠️ Unexpected assets found:" ) ;
219- unexpectedAssets . forEach ( ( asset ) => console . warn ( ` - ${ asset } ` ) ) ;
170+ console . warn ( "⚠️ Unexpected assets found:" ) ;
171+ unexpectedAssets . forEach ( ( a ) => console . warn ( ` - ${ a } ` ) ) ;
220172 console . warn ( "" ) ;
221173 }
222174
223175 console . log ( "✅ VERIFICATION PASSED!" ) ;
224- console . log (
225- `🎉 All ${ expectedAssets . length } expected assets are present in release ${ tagName } ` ,
226- ) ;
176+ console . log ( `🎉 All ${ expectedAssets . length } expected assets are present in release ${ tagName } ` ) ;
227177 console . log ( "" ) ;
228178 console . log ( "📊 Release Summary:" ) ;
229179 console . log ( ` Release: ${ release . name || tagName } ` ) ;
0 commit comments