Skip to content

Commit 132be8d

Browse files
committed
Apply authentication fix from main branch
1 parent 5587b13 commit 132be8d

File tree

1 file changed

+85
-114
lines changed

1 file changed

+85
-114
lines changed

scripts/verify-release-assets.js

Lines changed: 85 additions & 114 deletions
Original file line numberDiff line numberDiff line change
@@ -22,44 +22,75 @@ async function verifyReleaseAssets() {
2222
const token = process.env.GITHUB_TOKEN;
2323

2424
if (!token) {
25-
throw new Error("GITHUB_TOKEN environment variable is required");
25+
console.error("❌ Missing GITHUB_TOKEN environment variable!");
26+
process.exit(1);
2627
}
2728

28-
// Log token permissions for debugging
29-
console.log(`🔐 Checking token permissions...`);
30-
try {
31-
const userResponse = await fetch("https://api.github.com/user", {
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", {
3236
headers: {
3337
Authorization: `token ${token}`,
3438
Accept: "application/vnd.github.v3+json",
3539
"User-Agent": "dyad-release-verifier",
3640
},
3741
});
3842

39-
if (userResponse.ok) {
40-
const userData = await userResponse.json();
41-
console.log(`👤 Authenticated as: ${userData.login}`);
42-
console.log(`🔑 Token scopes:`, userResponse.headers.get("x-oauth-scopes") || "Not available");
43-
console.log(`📋 Accepted permissions:`, userResponse.headers.get("x-accepted-github-permissions") || "Not available");
44-
} else {
45-
console.warn(`⚠️ Could not verify token permissions: ${userResponse.status} ${userResponse.statusText}`);
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 — no user authentication check needed");
55+
56+
// Test API access by fetching org/user info
57+
try {
58+
const appCheck = await fetch(`https://api.github.com/repos/${owner}/${repo}`, {
59+
headers: {
60+
Authorization: `token ${token}`,
61+
Accept: "application/vnd.github.v3+json",
62+
"User-Agent": "dyad-release-verifier",
63+
},
64+
});
65+
66+
if (!appCheck.ok) {
67+
const body = await appCheck.text();
68+
console.error("❌ Token authentication failed!");
69+
console.error(`Status: ${appCheck.status} ${appCheck.statusText}`);
70+
console.error(`Response body: ${body}`);
71+
process.exit(1);
72+
}
73+
74+
const repoData = await appCheck.json();
75+
console.log(`✅ Token authenticated for repository: ${repoData.full_name}`);
76+
} catch (error) {
77+
console.error("❌ Error testing token authentication:", error.message);
78+
process.exit(1);
4679
}
47-
} catch (error) {
48-
console.warn(`⚠️ Error checking token permissions: ${error.message}`);
4980
}
5081

51-
// Fetch all releases (including drafts) with retry logic
82+
// --- Fetch releases with retry logic ---
5283
const tagName = `v${version}`;
5384
const maxRetries = 5;
5485
const baseDelay = 10000; // 10 seconds
55-
5686
let release = null;
5787
let lastError = null;
5888

5989
for (let attempt = 1; attempt <= maxRetries; attempt++) {
6090
try {
61-
console.log(`📡 Attempt ${attempt}/${maxRetries}: Fetching all releases to find: ${tagName}`);
62-
console.log(`🔗 API URL: https://api.github.com/repos/${owner}/${repo}/releases`);
91+
console.log(
92+
`📡 Attempt ${attempt}/${maxRetries}: Fetching releases to find: ${tagName}`,
93+
);
6394

6495
const allReleasesUrl = `https://api.github.com/repos/${owner}/${repo}/releases`;
6596
const response = await fetch(allReleasesUrl, {
@@ -70,112 +101,68 @@ async function verifyReleaseAssets() {
70101
},
71102
});
72103

73-
console.log(`📡 API Response Status: ${response.status} ${response.statusText}`);
74-
console.log(`🔑 Token scopes:`, response.headers.get("x-oauth-scopes") || "Not available");
75-
console.log(`📋 Accepted permissions:`, response.headers.get("x-accepted-github-permissions") || "Not available");
76-
77104
if (!response.ok) {
78-
console.error(`❌ GitHub API error details:`);
79-
console.error(` Status: ${response.status}`);
80-
console.error(` Status Text: ${response.statusText}`);
81-
console.error(` URL: ${allReleasesUrl}`);
82-
console.error(` Headers:`, Object.fromEntries(response.headers.entries()));
83-
84-
// Try to get response body for more details
85-
try {
86-
const errorBody = await response.text();
87-
console.error(` Response Body: ${errorBody}`);
88-
} catch (e) {
89-
console.error(` Could not read error response body: ${e.message}`);
90-
}
91-
92-
throw new Error(
93-
`GitHub API error: ${response.status} ${response.statusText}`,
94-
);
105+
console.error(`❌ GitHub API error: ${response.status} ${response.statusText}`);
106+
const errorBody = await response.text();
107+
console.error(`Response Body: ${errorBody}`);
108+
throw new Error(`GitHub API returned ${response.status}`);
95109
}
96110

97111
const allReleases = await response.json();
98-
console.log(`📦 Total releases found: ${allReleases.length}`);
99-
console.log(`🔍 Available release tags:`, allReleases.map(r => r.tag_name).slice(0, 10));
100112

101-
// Check if release exists at all
102-
const releaseExists = allReleases.some(r => r.tag_name === tagName);
113+
const releaseExists = allReleases.some((r) => r.tag_name === tagName);
103114
if (!releaseExists) {
104-
console.error(`❌ Release ${tagName} does not exist in the repository!`);
105-
console.error(`📋 All available releases:`);
106-
allReleases.forEach(r => {
107-
console.error(` - ${r.tag_name} (${r.draft ? 'DRAFT' : 'PUBLISHED'})`);
108-
});
109-
throw new Error(`Release ${tagName} not found in repository`);
110-
}
111-
112-
release = allReleases.find((r) => r.tag_name === tagName);
113-
114-
if (release) {
115-
console.log(`✅ Found release on attempt ${attempt}: ${release.tag_name} (${release.draft ? 'DRAFT' : 'PUBLISHED'})`);
116-
break;
117-
} else {
118-
console.warn(`⚠️ Release ${tagName} not found on attempt ${attempt}. Available releases (first 10):`);
119-
allReleases.slice(0, 10).forEach(r => {
120-
console.warn(` - ${r.tag_name} (${r.draft ? 'DRAFT' : 'PUBLISHED'})`);
121-
});
122-
115+
console.warn(`⚠️ Release ${tagName} not found. Retrying...`);
123116
if (attempt < maxRetries) {
124-
const delay = baseDelay * attempt; // Exponential backoff: 10s, 20s, 30s, 40s, 50s
125-
console.log(`⏳ Waiting ${delay / 1000} seconds before retry...`);
126-
await new Promise(resolve => setTimeout(resolve, delay));
117+
const delay = baseDelay * attempt;
118+
console.log(`⏳ Waiting ${delay / 1000}s before retry...`);
119+
await new Promise((r) => setTimeout(r, delay));
127120
}
121+
continue;
128122
}
129-
} catch (error) {
130-
lastError = error;
131-
console.error(`❌ Attempt ${attempt} failed:`, error.message);
132123

124+
release = allReleases.find((r) => r.tag_name === tagName);
125+
console.log(
126+
`✅ Found release: ${release.tag_name} (${release.draft ? "DRAFT" : "PUBLISHED"})`,
127+
);
128+
break;
129+
} catch (err) {
130+
lastError = err;
131+
console.error(`❌ Attempt ${attempt} failed: ${err.message}`);
133132
if (attempt < maxRetries) {
134133
const delay = baseDelay * attempt;
135-
console.log(`⏳ Waiting ${delay / 1000} seconds before retry...`);
136-
await new Promise(resolve => setTimeout(resolve, delay));
134+
console.log(`⏳ Retrying in ${delay / 1000}s...`);
135+
await new Promise((r) => setTimeout(r, delay));
137136
}
138137
}
139138
}
140139

141140
if (!release) {
142-
console.error(`❌ Release ${tagName} not found after ${maxRetries} attempts!`);
143-
if (lastError) {
144-
console.error(`Last error: ${lastError.message}`);
145-
}
146-
throw new Error(
147-
`Release ${tagName} not found in published releases or drafts after retries. Make sure the release exists.`,
148-
);
141+
console.error(`❌ Release ${tagName} not found after ${maxRetries} attempts`);
142+
if (lastError) console.error(`Last error: ${lastError.message}`);
143+
process.exit(1);
149144
}
150145

151-
console.log(`✅ Found release: ${release.tag_name} (${release.draft ? 'DRAFT' : 'PUBLISHED'})`);
152-
153146
const assets = release.assets || [];
154147

155148
console.log(`📦 Found ${assets.length} assets in release ${tagName}`);
156149
console.log(`📄 Release status: ${release.draft ? "DRAFT" : "PUBLISHED"}`);
157150

158-
// Handle different beta naming conventions across platforms
151+
// --- Define expected assets ---
159152
const normalizeVersionForPlatform = (version, platform) => {
160-
if (!version.includes("beta")) {
161-
return version;
162-
}
153+
if (!version.includes("beta")) return version;
163154

164155
switch (platform) {
165156
case "rpm":
166157
case "deb":
167-
// RPM and DEB use dots: 0.14.0-beta.1 -> 0.14.0.beta.1
168158
return version.replace("-beta.", ".beta.");
169159
case "nupkg":
170-
// NuGet removes the dot: 0.14.0-beta.1 -> 0.14.0-beta1
171160
return version.replace("-beta.", "-beta");
172161
default:
173-
// Windows installer and macOS zips keep original format
174162
return version;
175163
}
176164
};
177165

178-
// Define expected assets with platform-specific version handling
179166
const expectedAssets = [
180167
`dyad-${normalizeVersionForPlatform(version, "rpm")}-1.x86_64.rpm`,
181168
`dyad-${normalizeVersionForPlatform(version, "nupkg")}-full.nupkg`,
@@ -187,47 +174,31 @@ async function verifyReleaseAssets() {
187174
];
188175

189176
console.log("📋 Expected assets:");
190-
expectedAssets.forEach((asset) => console.log(` - ${asset}`));
177+
expectedAssets.forEach((a) => console.log(` - ${a}`));
191178
console.log("");
192179

193-
// Get actual asset names
194-
const actualAssets = assets.map((asset) => asset.name);
195-
180+
const actualAssets = assets.map((a) => a.name);
196181
console.log("📋 Actual assets:");
197-
actualAssets.forEach((asset) => console.log(` - ${asset}`));
182+
actualAssets.forEach((a) => console.log(` - ${a}`));
198183
console.log("");
199184

200-
// Check for missing assets
201-
const missingAssets = expectedAssets.filter(
202-
(expected) => !actualAssets.includes(expected),
203-
);
204-
185+
// --- Compare assets ---
186+
const missingAssets = expectedAssets.filter((a) => !actualAssets.includes(a));
205187
if (missingAssets.length > 0) {
206-
console.error("❌ VERIFICATION FAILED!");
207-
console.error("📭 Missing assets:");
208-
missingAssets.forEach((asset) => console.error(` - ${asset}`));
209-
console.error("");
210-
console.error(
211-
"Please ensure all platforms have completed their builds and uploads.",
212-
);
188+
console.error("❌ VERIFICATION FAILED! Missing assets:");
189+
missingAssets.forEach((a) => console.error(` - ${a}`));
213190
process.exit(1);
214191
}
215192

216-
// Check for unexpected assets (optional warning)
217-
const unexpectedAssets = actualAssets.filter(
218-
(actual) => !expectedAssets.includes(actual),
219-
);
220-
193+
const unexpectedAssets = actualAssets.filter((a) => !expectedAssets.includes(a));
221194
if (unexpectedAssets.length > 0) {
222-
console.warn("⚠️ Unexpected assets found:");
223-
unexpectedAssets.forEach((asset) => console.warn(` - ${asset}`));
195+
console.warn("⚠️ Unexpected assets found:");
196+
unexpectedAssets.forEach((a) => console.warn(` - ${a}`));
224197
console.warn("");
225198
}
226199

227200
console.log("✅ VERIFICATION PASSED!");
228-
console.log(
229-
`🎉 All ${expectedAssets.length} expected assets are present in release ${tagName}`,
230-
);
201+
console.log(`🎉 All ${expectedAssets.length} expected assets are present in release ${tagName}`);
231202
console.log("");
232203
console.log("📊 Release Summary:");
233204
console.log(` Release: ${release.name || tagName}`);

0 commit comments

Comments
 (0)