Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
67 changes: 59 additions & 8 deletions .github/workflows/auto_deploy.yml
Original file line number Diff line number Diff line change
Expand Up @@ -21,26 +21,39 @@ jobs:
- name: Emit repository_dispatch to App
uses: actions/github-script@v7
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
script: |
await github.rest.repos.createDispatchEvent({
owner: context.repo.owner,
repo: context.repo.repo,
event_type: "auto-deploy",
client_payload: { base: inputs.base, head: inputs.head }
client_payload: {
base: ${{ toJson(inputs.base) }},
head: ${{ toJson(inputs.head) }}
}
})

- name: Wait for World Forge status
uses: actions/github-script@v7
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
script: |
const owner = context.repo.owner, repo = context.repo.repo, ref = inputs.head;
const owner = context.repo.owner;
const repo = context.repo.repo;
const ref = ${{ toJson(inputs.head) }};
const prefix = "world-forge/auto-deploy";
const initDeadline = Date.now() + 2*60*1000;
const hardDeadline = Date.now() + 45*60*1000;
const sleep = (ms) => new Promise(r => setTimeout(r, ms));

async function allStatuses() {
const { data } = await github.rest.repos.getCombinedStatusForRef({ owner, repo, ref });
return data.statuses || [];
}

// Track last reported terminal state per project to avoid duplicate logs
const lastReportedBySlug = {};

let expected = null;
while (Date.now() < initDeadline) {
const statuses = await allStatuses();
Expand All @@ -51,17 +64,55 @@ jobs:
const n = parseInt(a.description || "0", 10);
if (!Number.isNaN(n) && n > 0) { expected = n; break; }
}
if (expected) break;
if (expected) { core.info(`${expected} deploy${expected===1?'':'s'} are in progress`); break; }
await sleep(5000);
}
if (!expected) { core.setFailed("Auto-deploy did not publish expected deployment count."); return; }

let prevCompleted = -1, prevSuccess = -1, prevFailed = -1;
while (Date.now() < hardDeadline) {
const statuses = await allStatuses();
const perProject = statuses.filter(s => s.context.startsWith(prefix + "/"));
const success = perProject.filter(s => s.state === "success").length;
const failed = perProject.filter(s => s.state === "failure" || s.state === "error").length;
if (success + failed >= expected) { if (failed > 0) core.setFailed(`Deploy failures: ${failed}/${expected}`); return; }
const perProject = statuses.filter(s => s.context && s.context.startsWith(prefix + "/"));

// Build latest status per project slug (use updated_at/created_at to pick most recent)
const latestBySlug = {};
for (const s of perProject) {
const slug = s.context.slice(prefix.length + 1);
const time = new Date(s.updated_at || s.created_at || 0).getTime();
const prev = latestBySlug[slug];
if (!prev || time > prev._time) {
latestBySlug[slug] = { ...s, _time: time, _slug: slug };
}
}

const latestList = Object.values(latestBySlug);
const success = latestList.filter(s => s.state === "success").length;
const failed = latestList.filter(s => s.state === "failure" || s.state === "error").length;
const completed = success + failed;

if (completed !== prevCompleted || success !== prevSuccess || failed !== prevFailed) {
core.info(`completed=${completed}/${expected} success=${success} failed=${failed}`);
prevCompleted = completed; prevSuccess = success; prevFailed = failed;
}

// Emit per-project updates when terminal state changes
for (const s of latestList) {
const slug = s._slug;
const state = s.state;
const prev = lastReportedBySlug[slug];
if ((state === "failure" || state === "error") && prev !== state) {
const reason = s.description || "No details provided.";
core.info(`❌Project ${slug} failed: ${reason}`);
core.info(" ");
lastReportedBySlug[slug] = state;
} else if (state === "success" && prev !== state) {
core.info(`✅Project ${slug} passed!`);
core.info(" ");
lastReportedBySlug[slug] = state;
}
}

if (completed >= expected) { if (failed > 0) core.setFailed(`Deploy failures: ${failed}/${expected}`); return; }
await sleep(10000);
}
core.setFailed("Timed out waiting for auto-deploy results.");

67 changes: 0 additions & 67 deletions workflows/auto_deploy.yml

This file was deleted.

Loading