Files
James Anderson 764a496ce7 add oxfmt formatter (#380)
* 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
2026-03-09 14:56:14 +00:00

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);
});