From b2772f10a5729bf08bbd1f3dc6abc0cee1eb5043 Mon Sep 17 00:00:00 2001 From: mptyl Date: Tue, 18 Aug 2026 06:37:35 +0200 Subject: [PATCH] test(deploy): retain failed smoke image evidence --- scripts/unified-deployment-smoke.sh | 31 +++++++++++++++++++++++------ 1 file changed, 25 insertions(+), 6 deletions(-) diff --git a/scripts/unified-deployment-smoke.sh b/scripts/unified-deployment-smoke.sh index 36e1498e..f8902188 100755 --- a/scripts/unified-deployment-smoke.sh +++ b/scripts/unified-deployment-smoke.sh @@ -79,10 +79,12 @@ task13_write_image_evidence() { output_dir="$(dirname "$TASK13_IMAGE_EVIDENCE_OUTPUT")" mkdir -p "$output_dir" temporary="$(mktemp "$output_dir/.unified-docker-images.XXXXXX")" - if ! node - "$TASK13_IMAGE_EVIDENCE_RECORDS" "$TASK13_SOURCE_COMMIT" "$TASK13_RUN_ID" >"$temporary" <<'NODE' + if ! node - "$TASK13_IMAGE_EVIDENCE_RECORDS" "$TASK13_SOURCE_COMMIT" "$TASK13_RUN_ID" \ + "$TASK13_IMAGE_EVIDENCE_STATUS" >"$temporary" <<'NODE' const fs = require("node:fs"); -const [recordsFile, sourceCommit, runId] = process.argv.slice(2); -if (!/^[0-9a-f]{40}$/.test(sourceCommit) || !/^[0-9A-Za-z-]+$/.test(runId)) process.exit(1); +const [recordsFile, sourceCommit, runId, status] = process.argv.slice(2); +if (!/^[0-9a-f]{40}$/.test(sourceCommit) || !/^[0-9A-Za-z-]+$/.test(runId) + || !/^(?:pass|fail)$/.test(status)) process.exit(1); const images = new Map(); for (const line of fs.readFileSync(recordsFile, "utf8").split("\n").filter(Boolean)) { const fields = line.split("\t"); @@ -102,6 +104,7 @@ for (const line of fs.readFileSync(recordsFile, "utf8").split("\n").filter(Boole if (images.size === 0) process.exit(1); const document = { gate: "unified-deployment-smoke", + status, source_commit: sourceCommit, run_id: runId, images: [...images.values()].sort((left, right) => left.id.localeCompare(right.id)).map((image) => ({ @@ -121,6 +124,12 @@ NODE mv "$temporary" "$TASK13_IMAGE_EVIDENCE_OUTPUT" } +task13_capture_failed_image_evidence() { + TASK13_IMAGE_EVIDENCE_STATUS=fail + task13_record_project_image_evidence + task13_write_image_evidence +} + task13_registry_filesystem_fingerprint() { python3 - "$1" <<'PY' import hashlib @@ -1717,6 +1726,12 @@ task13_assert_built_image_ownership() { task13_cleanup() { local original_rc="$1" cleanup_rc=0 transaction="" leftovers="" image_id="" set +e + if [[ "$original_rc" -ne 0 && -n "${TASK13_PROJECT:-}" \ + && -s "${TASK13_IMAGE_EVIDENCE_RECORDS:-}" && -n "${TASK13_IMAGE_EVIDENCE_OUTPUT:-}" ]]; then + if ! task13_capture_failed_image_evidence >>"${TASK13_LOG:-/dev/null}" 2>&1; then + rm -f "$TASK13_IMAGE_EVIDENCE_OUTPUT" + fi + fi if [[ "$original_rc" -ne 0 && "${TASK13_FAILURE_LOGGED:-0}" -eq 0 ]] \ && [[ -n "${TASK13_LOG:-}" && -f "$TASK13_LOG" ]]; then printf '%s\n' '--- sanitized Task 13 diagnostic log ---' >&2 @@ -2036,6 +2051,7 @@ task13_self_test_image_evidence() ( : >"$records" TASK13_RUN_ID="task15-image-run" TASK13_SOURCE_COMMIT="0123456789abcdef0123456789abcdef01234567" + TASK13_IMAGE_EVIDENCE_STATUS="fail" TASK13_IMAGE_EVIDENCE_RECORDS="$records" TASK13_IMAGE_EVIDENCE_OUTPUT="$output" TASK13_PROJECT="task15-image-project" @@ -2070,17 +2086,17 @@ task13_self_test_image_evidence() ( esac } - task13_record_project_image_evidence task13_record_image_evidence \ 'fixture-candidate@sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc' \ 'rollback-candidate' - task13_write_image_evidence + task13_capture_failed_image_evidence unset -f docker node - "$output" <<'NODE' const manifest = JSON.parse(require("node:fs").readFileSync(process.argv[2], "utf8")); if (manifest.source_commit !== "0123456789abcdef0123456789abcdef01234567" - || manifest.run_id !== "task15-image-run" || manifest.images.length !== 3) process.exit(1); + || manifest.run_id !== "task15-image-run" || manifest.status !== "fail" + || manifest.images.length !== 3) process.exit(1); const ids = manifest.images.map((image) => image.id); if (new Set(ids).size !== 3 || ids.some((id) => !/^sha256:[0-9a-f]{64}$/.test(id))) process.exit(1); if (!manifest.images.some((image) => image.roles.includes("rollback-candidate") @@ -2434,6 +2450,7 @@ task13_initialize() { TASK13_IMAGE_EVIDENCE_RECORDS="$TASK13_TMP/image-evidence.tsv" : >"$TASK13_IMAGE_EVIDENCE_RECORDS" TASK13_IMAGE_EVIDENCE_OUTPUT="$TASK13_ROOT/.artifacts/task-15/unified-docker-images.json" + rm -f "$TASK13_IMAGE_EVIDENCE_OUTPUT" TASK13_PROFILE="local" TASK13_INSTALLATION="$TASK13_TMP/thothii-installation.yaml" TASK13_PROJECT="thothii-$(task13_sha256_text "$TASK13_INSTALLATION" | cut -c1-12)" @@ -2516,6 +2533,7 @@ task13_smoke_main() { fi task13_update_rollback task13_record_project_image_evidence + TASK13_IMAGE_EVIDENCE_STATUS=pass task13_write_image_evidence printf 'Task 13 %s deployment smoke passed.\n' "$mode" } @@ -2536,6 +2554,7 @@ task13_server_smoke_main() { task13_assert_server_runtime task13_assert_server_oidc_restore_verification task13_record_project_image_evidence + TASK13_IMAGE_EVIDENCE_STATUS=pass task13_write_image_evidence printf 'Task 13 Linux server deployment smoke passed.\n' }