Skip to content

Commit e0e4ede

Browse files
committed
refactor(monorepo): move workflow to correct location (#253)
# Enhance Auto-Deploy Workflow with Better Logging and Status Tracking ## Overview This PR enhances the auto-deploy GitHub workflow by improving status tracking and adding detailed logging for deployment processes. It provides better visibility into deployment progress and failures. ## Brief Changelog - Added explicit GitHub token to workflow actions - Improved JSON handling for input parameters using `toJson` - Enhanced status tracking with per-project state monitoring - Added detailed logging for deployment progress and completion status - Implemented tracking of last reported terminal state per project to avoid duplicate logs - Added visual indicators (✅/❌) for successful and failed deployments - Removed duplicate workflow file from incorrect location ## Testing and Verifying This change can be verified by running the auto-deploy workflow and observing the improved logs in the GitHub Actions console, which now show clear progress indicators, success/failure counts, and detailed per-project status updates.
1 parent 21f9293 commit e0e4ede

File tree

2 files changed

+59
-75
lines changed

2 files changed

+59
-75
lines changed

.github/workflows/auto_deploy.yml

Lines changed: 59 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -21,26 +21,39 @@ jobs:
2121
- name: Emit repository_dispatch to App
2222
uses: actions/github-script@v7
2323
with:
24+
github-token: ${{ secrets.GITHUB_TOKEN }}
2425
script: |
2526
await github.rest.repos.createDispatchEvent({
2627
owner: context.repo.owner,
2728
repo: context.repo.repo,
2829
event_type: "auto-deploy",
29-
client_payload: { base: inputs.base, head: inputs.head }
30+
client_payload: {
31+
base: ${{ toJson(inputs.base) }},
32+
head: ${{ toJson(inputs.head) }}
33+
}
3034
})
35+
3136
- name: Wait for World Forge status
3237
uses: actions/github-script@v7
3338
with:
39+
github-token: ${{ secrets.GITHUB_TOKEN }}
3440
script: |
35-
const owner = context.repo.owner, repo = context.repo.repo, ref = inputs.head;
41+
const owner = context.repo.owner;
42+
const repo = context.repo.repo;
43+
const ref = ${{ toJson(inputs.head) }};
3644
const prefix = "world-forge/auto-deploy";
3745
const initDeadline = Date.now() + 2*60*1000;
3846
const hardDeadline = Date.now() + 45*60*1000;
3947
const sleep = (ms) => new Promise(r => setTimeout(r, ms));
48+
4049
async function allStatuses() {
4150
const { data } = await github.rest.repos.getCombinedStatusForRef({ owner, repo, ref });
4251
return data.statuses || [];
4352
}
53+
54+
// Track last reported terminal state per project to avoid duplicate logs
55+
const lastReportedBySlug = {};
56+
4457
let expected = null;
4558
while (Date.now() < initDeadline) {
4659
const statuses = await allStatuses();
@@ -51,17 +64,55 @@ jobs:
5164
const n = parseInt(a.description || "0", 10);
5265
if (!Number.isNaN(n) && n > 0) { expected = n; break; }
5366
}
54-
if (expected) break;
67+
if (expected) { core.info(`${expected} deploy${expected===1?'':'s'} are in progress`); break; }
5568
await sleep(5000);
5669
}
5770
if (!expected) { core.setFailed("Auto-deploy did not publish expected deployment count."); return; }
71+
72+
let prevCompleted = -1, prevSuccess = -1, prevFailed = -1;
5873
while (Date.now() < hardDeadline) {
5974
const statuses = await allStatuses();
60-
const perProject = statuses.filter(s => s.context.startsWith(prefix + "/"));
61-
const success = perProject.filter(s => s.state === "success").length;
62-
const failed = perProject.filter(s => s.state === "failure" || s.state === "error").length;
63-
if (success + failed >= expected) { if (failed > 0) core.setFailed(`Deploy failures: ${failed}/${expected}`); return; }
75+
const perProject = statuses.filter(s => s.context && s.context.startsWith(prefix + "/"));
76+
77+
// Build latest status per project slug (use updated_at/created_at to pick most recent)
78+
const latestBySlug = {};
79+
for (const s of perProject) {
80+
const slug = s.context.slice(prefix.length + 1);
81+
const time = new Date(s.updated_at || s.created_at || 0).getTime();
82+
const prev = latestBySlug[slug];
83+
if (!prev || time > prev._time) {
84+
latestBySlug[slug] = { ...s, _time: time, _slug: slug };
85+
}
86+
}
87+
88+
const latestList = Object.values(latestBySlug);
89+
const success = latestList.filter(s => s.state === "success").length;
90+
const failed = latestList.filter(s => s.state === "failure" || s.state === "error").length;
91+
const completed = success + failed;
92+
93+
if (completed !== prevCompleted || success !== prevSuccess || failed !== prevFailed) {
94+
core.info(`completed=${completed}/${expected} success=${success} failed=${failed}`);
95+
prevCompleted = completed; prevSuccess = success; prevFailed = failed;
96+
}
97+
98+
// Emit per-project updates when terminal state changes
99+
for (const s of latestList) {
100+
const slug = s._slug;
101+
const state = s.state;
102+
const prev = lastReportedBySlug[slug];
103+
if ((state === "failure" || state === "error") && prev !== state) {
104+
const reason = s.description || "No details provided.";
105+
core.info(`❌Project ${slug} failed: ${reason}`);
106+
core.info(" ");
107+
lastReportedBySlug[slug] = state;
108+
} else if (state === "success" && prev !== state) {
109+
core.info(`✅Project ${slug} passed!`);
110+
core.info(" ");
111+
lastReportedBySlug[slug] = state;
112+
}
113+
}
114+
115+
if (completed >= expected) { if (failed > 0) core.setFailed(`Deploy failures: ${failed}/${expected}`); return; }
64116
await sleep(10000);
65117
}
66118
core.setFailed("Timed out waiting for auto-deploy results.");
67-

workflows/auto_deploy.yml

Lines changed: 0 additions & 67 deletions
This file was deleted.

0 commit comments

Comments
 (0)