

























@@ -329,18 +329,6 @@ function gitRevParse(ref) {
329329return run("git", ["rev-parse", ref], { capture: true }).trim();
330330}
331331332-async function workflowRuns(repo, workflowFile) {
333-const data = await githubApi(
334-`repos/${repo}/actions/workflows/${workflowFile}/runs?event=workflow_dispatch&per_page=100`,
335-);
336-return (data.workflow_runs ?? []).map((runEntry) => ({
337-databaseId: runEntry.id,
338-workflowName: runEntry.name,
339-event: runEntry.event,
340-createdAt: runEntry.created_at,
341-}));
342-}
343-344332async function runArtifacts(repo, runId) {
345333const data = await githubApi(`repos/${repo}/actions/runs/${runId}/artifacts?per_page=100`);
346334return (data.artifacts ?? []).map((artifact) => ({
@@ -375,12 +363,6 @@ async function resolveRunArtifactName(repo, runId, preferredName, prefix) {
375363return resolveArtifactName(await runArtifacts(repo, runId), preferredName, prefix);
376364}
377365378-async function beforeRunIds(repo, workflowFile) {
379-return new Set(
380-(await workflowRuns(repo, workflowFile)).map((runResult) => String(runResult.databaseId)),
381-);
382-}
383-384366function runAndEcho(command, args) {
385367const result = spawnSync(command, args, {
386368encoding: "utf8",
@@ -417,36 +399,28 @@ export function parseRunIdFromDispatchOutput(output) {
417399return output.match(/actions\/runs\/([0-9]+)/u)?.[1] ?? "";
418400}
419401402+export function requireRunIdFromDispatchOutput(output, workflowFile) {
403+const runId = parseRunIdFromDispatchOutput(output);
404+if (!runId) {
405+throw new Error(
406+`gh workflow run ${workflowFile} did not return an Actions run URL; refusing to guess from recent workflow_dispatch runs`,
407+);
408+}
409+return runId;
410+}
411+420412async function wait(ms) {
421413await new Promise((resolve) => {
422414setTimeout(resolve, ms);
423415});
424416}
425417426-async function findNewRunId(repo, workflowFile, workflowName, beforeIds) {
427-for (let attempt = 0; attempt < 60; attempt += 1) {
428-const match = (await workflowRuns(repo, workflowFile))
429-.filter(
430-(runValue) =>
431-runValue.workflowName === workflowName &&
432-runValue.event === "workflow_dispatch" &&
433-!beforeIds.has(String(runValue.databaseId)),
434-)
435-.toSorted((a, b) => String(b.createdAt ?? "").localeCompare(String(a.createdAt ?? "")))[0];
436-if (match?.databaseId) {
437-return String(match.databaseId);
438-}
439-await wait(5_000);
440-}
441-throw new Error(`could not find dispatched ${workflowName} run`);
442-}
443-444418function dispatchWorkflow(repo, workflowFile, workflowRef, fields) {
445419const args = ["workflow", "run", workflowFile, "--repo", repo, "--ref", workflowRef];
446420for (const [key, value] of Object.entries(fields)) {
447421args.push("-f", `${key}=${String(value)}`);
448422}
449-return parseRunIdFromDispatchOutput(runAndEcho("gh", args));
423+return requireRunIdFromDispatchOutput(runAndEcho("gh", args), workflowFile);
450424}
451425452426async function runInfo(repo, runId) {
@@ -727,18 +701,14 @@ async function runTelegramIfNeeded(options, artifactName) {
727701return { status: "skipped" };
728702}
729703const workflowFile = "npm-telegram-beta-e2e.yml";
730-const before = await beforeRunIds(options.repo, workflowFile);
731-const dispatchedRunId = dispatchWorkflow(options.repo, workflowFile, options.workflowRef, {
704+const runId = dispatchWorkflow(options.repo, workflowFile, options.workflowRef, {
732705package_spec: `openclaw@${options.tag.replace(/^v/u, "")}`,
733706package_label: options.tag,
734707package_artifact_name: artifactName,
735708package_artifact_run_id: options.npmPreflightRunId,
736709harness_ref: options.workflowRef,
737710provider_mode: options.telegramProviderMode,
738711});
739-const runId =
740-dispatchedRunId ||
741-(await findNewRunId(options.repo, workflowFile, "NPM Telegram Beta E2E", before));
742712const runLocal = await waitForSuccessfulRun(options.repo, runId, {
743713workflowName: "NPM Telegram Beta E2E",
744714workflowRef: options.workflowRef,
@@ -771,8 +741,7 @@ async function main() {
771741772742if (!options.fullReleaseRunId && !options.skipDispatch) {
773743const workflowFile = "full-release-validation.yml";
774-const before = await beforeRunIds(options.repo, workflowFile);
775-const dispatchedRunId = dispatchWorkflow(options.repo, workflowFile, options.workflowRef, {
744+options.fullReleaseRunId = dispatchWorkflow(options.repo, workflowFile, options.workflowRef, {
776745ref: options.tag,
777746provider: options.provider,
778747mode: options.mode,
@@ -781,22 +750,15 @@ async function main() {
781750options.releaseProfile === "stable" || options.releaseProfile === "full" ? "true" : "false",
782751rerun_group: "all",
783752});
784-options.fullReleaseRunId =
785-dispatchedRunId ||
786-(await findNewRunId(options.repo, workflowFile, "Full Release Validation", before));
787753}
788754789755if (!options.npmPreflightRunId && !options.skipDispatch) {
790756const workflowFile = "openclaw-npm-release.yml";
791-const before = await beforeRunIds(options.repo, workflowFile);
792-const dispatchedRunId = dispatchWorkflow(options.repo, workflowFile, options.workflowRef, {
757+options.npmPreflightRunId = dispatchWorkflow(options.repo, workflowFile, options.workflowRef, {
793758tag: options.tag,
794759preflight_only: "true",
795760npm_dist_tag: options.npmDistTag,
796761});
797-options.npmPreflightRunId =
798-dispatchedRunId ||
799-(await findNewRunId(options.repo, workflowFile, "OpenClaw NPM Release", before));
800762}
801763802764const fullRun = await waitForSuccessfulRun(options.repo, options.fullReleaseRunId, {
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。