Skip to content

Commit a8567ba

Browse files
committed
Fixed verify-release-assets.js from chatgpt
1 parent beb3b8b commit a8567ba

File tree

1 file changed

+70
-120
lines changed

1 file changed

+70
-120
lines changed

scripts/verify-release-assets.js

Lines changed: 70 additions & 120 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)