新增 release artifact URL workflow SDK API

This commit is contained in:
2026-06-16 13:54:53 +08:00
parent d789920d7f
commit 9015de1961
9 changed files with 305 additions and 2 deletions

View File

@@ -10,6 +10,7 @@ import {
createProjectReleaseReadinessArtifactValidationSummaryViewModel,
createProjectReleaseReadinessReport,
createProjectReleaseReadinessSummaryViewModel,
loadProjectReleaseReadinessArtifactUrlWorkflow,
} from "../../../runtime/sdk/src/index.js";
const manifest = createProjectReleaseGateManifest();
@@ -184,6 +185,14 @@ const artifactValidationActionPlan = createProjectReleaseReadinessArtifactValida
const artifactJsonWorkflow = createProjectReleaseReadinessArtifactJsonWorkflow({
artifactJson: JSON.stringify(report),
});
const artifactUrlWorkflow = await loadProjectReleaseReadinessArtifactUrlWorkflow({
artifactUrl: "/project-release-readiness.json",
fetchRef: async () => ({
ok: true,
status: 200,
text: async () => JSON.stringify(report),
}),
});
assert.equal(
artifactValidationSummary.apiName,
"project-release-readiness-artifact-validation-summary-view-model",
@@ -249,6 +258,26 @@ assert.deepEqual(
["next-command", "none"],
],
);
assert.equal(artifactUrlWorkflow.apiName, "project-release-readiness-artifact-url-workflow");
assert.equal(artifactUrlWorkflow.workflowVersion, 1);
assert.equal(artifactUrlWorkflow.phase, "ready");
assert.equal(artifactUrlWorkflow.ready, true);
assert.equal(artifactUrlWorkflow.artifactUrl, "/project-release-readiness.json");
assert.equal(artifactUrlWorkflow.fetched, true);
assert.equal(artifactUrlWorkflow.httpStatus, 200);
assert.equal(artifactUrlWorkflow.fetchError, null);
assert.equal(artifactUrlWorkflow.jsonWorkflow.ready, true);
assert.equal(artifactUrlWorkflow.validation.ready, true);
assert.equal(artifactUrlWorkflow.summaryViewModel.statusLine, "Ready: Artifact evidence complete");
assert.equal(artifactUrlWorkflow.actionPlan.commandCount, 0);
assert.deepEqual(
artifactUrlWorkflow.rows.map(({ id, value }) => [id, value]),
[
["fetch", "ready"],
["json-workflow", "ready"],
["next-command", "none"],
],
);
const staleArtifactValidationSummary = createProjectReleaseReadinessArtifactValidationSummaryViewModel(
createProjectReleaseReadinessArtifactValidation({}),
);
@@ -260,6 +289,18 @@ const staleArtifactJsonWorkflow = createProjectReleaseReadinessArtifactJsonWorkf
const invalidArtifactJsonWorkflow = createProjectReleaseReadinessArtifactJsonWorkflow({
artifactJson: "{not-json",
});
const missingArtifactUrlWorkflow = await loadProjectReleaseReadinessArtifactUrlWorkflow({
artifactUrl: "",
fetchRef: null,
});
const failedArtifactUrlWorkflow = await loadProjectReleaseReadinessArtifactUrlWorkflow({
artifactUrl: "/missing.json",
fetchRef: async () => ({
ok: false,
status: 404,
text: async () => "",
}),
});
assert.equal(staleArtifactValidationSummary.phase, "blocked");
assert.match(staleArtifactValidationSummary.statusLine, /^Blocked: apiName, reportVersion/);
assert.equal(staleArtifactValidationSummary.rows.find(({ id }) => id === "gate-action-plan")?.value, "missing");
@@ -304,5 +345,17 @@ assert.deepEqual(
["next-command", "wasm-port/tests/host/verify_project_release_gate.sh"],
],
);
assert.equal(missingArtifactUrlWorkflow.ready, false);
assert.equal(missingArtifactUrlWorkflow.fetched, false);
assert.deepEqual(missingArtifactUrlWorkflow.missing.slice(0, 2), ["artifact-url", "fetch"]);
assert.equal(failedArtifactUrlWorkflow.ready, false);
assert.equal(failedArtifactUrlWorkflow.fetched, false);
assert.equal(failedArtifactUrlWorkflow.httpStatus, 404);
assert.match(failedArtifactUrlWorkflow.fetchError, /404/);
assert.equal(failedArtifactUrlWorkflow.missing[0], "artifact-fetch");
assert.equal(
failedArtifactUrlWorkflow.actionPlan.nextCommand,
"wasm-port/tests/host/verify_project_release_gate.sh",
);
console.log("project_release_gate_manifest_node_smoke=ok");

View File

@@ -56,6 +56,7 @@ import {
isSupportedIniPanelLaunchApiManifest,
isSupportedIniPanelShellIntegrationManifest,
loadIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrl,
loadProjectReleaseReadinessArtifactUrlWorkflow,
loadMachineSessionFromOpfs,
loadMachineSessionSnapshot,
loadMachineTextFiles,
@@ -116,6 +117,7 @@ const requiredExports = [
"loadIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrl",
loadIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrl,
],
["loadProjectReleaseReadinessArtifactUrlWorkflow", loadProjectReleaseReadinessArtifactUrlWorkflow],
["planIniFileContextStaging", planIniFileContextStaging],
["planSimConfigStaging", planSimConfigStaging],
["analyzeIniRuntimeBoundaries", analyzeIniRuntimeBoundaries],
@@ -355,6 +357,24 @@ assert.equal(
createProjectReleaseReadinessArtifactJsonWorkflow({ artifactJson: "not-json" }).parsed,
false,
);
assert.equal(
(await loadProjectReleaseReadinessArtifactUrlWorkflow({
artifactUrl: "/project-release-readiness.json",
fetchRef: async () => ({
ok: true,
status: 200,
text: async () => JSON.stringify(releaseReadinessArtifact),
}),
})).summaryViewModel.statusLine,
"Ready: Artifact evidence complete",
);
assert.equal(
(await loadProjectReleaseReadinessArtifactUrlWorkflow({
artifactUrl: "/missing.json",
fetchRef: async () => ({ ok: false, status: 404, text: async () => "" }),
})).missing[0],
"artifact-fetch",
);
assert.deepEqual(
createProjectReleaseReadinessArtifactValidation({}).missing,
[