mirror of
https://github.com/cloudflare/vinext.git
synced 2026-09-14 19:04:59 +08:00
764a496ce7
* add oxfmt formatter: config, scripts, CI, editor setup, docs * rebuild lockfile * fix: add Format to required checks list, remove dead ignore pattern * run fmt * add format to agents.md again
76 lines
2.3 KiB
JavaScript
76 lines
2.3 KiB
JavaScript
// Sends a failure notification email when the Next.js tip workflow fails.
|
|
// Expects EMAIL_API_TOKEN, GITHUB_TOKEN, GITHUB_SERVER_URL, GITHUB_REPOSITORY,
|
|
// and GITHUB_RUN_ID to be set in the environment.
|
|
|
|
async function getFailedJobs() {
|
|
const token = process.env.GITHUB_TOKEN;
|
|
const repository = process.env.GITHUB_REPOSITORY;
|
|
const runId = process.env.GITHUB_RUN_ID;
|
|
|
|
if (!token || !repository || !runId) return [];
|
|
|
|
const res = await fetch(`https://api.github.com/repos/${repository}/actions/runs/${runId}/jobs`, {
|
|
headers: {
|
|
Authorization: `Bearer ${token}`,
|
|
Accept: "application/vnd.github+json",
|
|
},
|
|
signal: AbortSignal.timeout(15_000),
|
|
});
|
|
|
|
if (!res.ok) return [];
|
|
|
|
const { jobs } = await res.json();
|
|
return jobs.filter((j) => j.conclusion === "failure").map((j) => j.name);
|
|
}
|
|
|
|
async function sendEmail() {
|
|
const token = process.env.EMAIL_API_TOKEN;
|
|
if (!token) {
|
|
console.error("EMAIL_API_TOKEN is not set");
|
|
process.exit(1);
|
|
}
|
|
|
|
const serverUrl = process.env.GITHUB_SERVER_URL ?? "https://github.com";
|
|
const repository = process.env.GITHUB_REPOSITORY ?? "unknown/unknown";
|
|
const runId = process.env.GITHUB_RUN_ID ?? "0";
|
|
const runUrl = `${serverUrl}/${repository}/actions/runs/${runId}`;
|
|
|
|
const failedJobs = await getFailedJobs();
|
|
const failedList =
|
|
failedJobs.length > 0
|
|
? `Failed jobs:\n${failedJobs.map((j) => ` - ${j}`).join("\n")}`
|
|
: "Could not determine which jobs failed. Check the run URL.";
|
|
|
|
// TODO: replace with your actual email API endpoint and payload format
|
|
const res = await fetch("https://api.example.com/send-email", {
|
|
method: "POST",
|
|
headers: {
|
|
"Content-Type": "application/json",
|
|
Authorization: `Bearer ${token}`,
|
|
},
|
|
signal: AbortSignal.timeout(30_000),
|
|
body: JSON.stringify({
|
|
subject: `vinext tip build failed -- ${repository}`,
|
|
body: [
|
|
"The scheduled Next.js tip (canary) build failed.",
|
|
"",
|
|
failedList,
|
|
"",
|
|
`Run: ${runUrl}`,
|
|
].join("\n"),
|
|
}),
|
|
});
|
|
|
|
if (!res.ok) {
|
|
console.error(`Email API returned ${res.status}: ${await res.text()}`);
|
|
process.exit(1);
|
|
}
|
|
|
|
console.log("Failure notification sent.");
|
|
}
|
|
|
|
sendEmail().catch((err) => {
|
|
console.error("Failed to send notification:", err.message);
|
|
process.exit(1);
|
|
});
|