Archived
KofTwentyTwo/ci-policy: ci / fork-guard (pull_request) Skipped
KofTwentyTwo/ci-policy: ci / go-0 (pull_request) Skipped
KofTwentyTwo/ci-policy: ci / go-nix-1 (pull_request) Skipped
KofTwentyTwo/ci-policy: ci / gradle-2 (pull_request) Skipped
KofTwentyTwo/ci-policy: ci / gradle-3 (pull_request) Skipped
KofTwentyTwo/ci-policy: ci / java-docker-4 (pull_request) Skipped
KofTwentyTwo/ci-policy: ci / java-maven-5 (pull_request) Skipped
KofTwentyTwo/ci-policy: ci / manifests-6 (pull_request) Skipped
KofTwentyTwo/ci-policy: ci / nix-7 (pull_request) Skipped
KofTwentyTwo/ci-policy: ci / node-8 (pull_request) Skipped
KofTwentyTwo/ci-policy: ci / python-9 (pull_request) Skipped
KofTwentyTwo/ci-policy: ci / rust-10 (pull_request) Skipped
KofTwentyTwo/ci-policy: ci / rust-11 (pull_request) Skipped
KofTwentyTwo/ci-policy: ci / rust-12 (pull_request) Skipped
KofTwentyTwo/ci-policy: ci / source-config-13 (pull_request) Skipped
KofTwentyTwo/ci-policy: ci / source-config-14 (pull_request) Skipped
KofTwentyTwo/ci-policy: ci / image-build-0 (pull_request) Skipped
KofTwentyTwo/ci-policy: ci / image-build-1 (pull_request) Skipped
KofTwentyTwo/ci-policy: ci / image-build-2 (pull_request) Skipped
KofTwentyTwo/ci-policy: ci / image-build-3 (pull_request) Skipped
KofTwentyTwo/ci-policy: ci / image-build-4 (pull_request) Skipped
KofTwentyTwo/ci-policy: ci / image-build-5 (pull_request) Skipped
KofTwentyTwo/ci-policy: ci / image-build-6 (pull_request) Skipped
KofTwentyTwo/ci-policy: ci / image-build-7 (pull_request) Skipped
KofTwentyTwo/ci-policy: ci / not-enrolled (pull_request) Skipped
KofTwentyTwo/ci-policy: ci / content-validate-0 (pull_request) Skipped
KofTwentyTwo/ci-policy: ci / standards-0 (pull_request) Skipped
KofTwentyTwo/ci-policy: ci / node-matrix-0 (pull_request) Skipped
KofTwentyTwo/ci-policy: ci / source-config-15 (pull_request) Blocked by required conditions
KofTwentyTwo/ci-policy: Shared source and config CI / verify (pull_request) Blocked by required conditions
KofTwentyTwo/ci-policy: Shared source and config CI / secrets (pull_request) Blocked by required conditions
KofTwentyTwo/ci-policy: Shared source and config CI / gate (pull_request) Waiting for needed jobs
KofTwentyTwo/ci-policy: ci / ci-result (pull_request) Waiting for needed jobs
KofTwentyTwo/ci-policy: native / fork-deny (pull_request) Skipped
KofTwentyTwo/ci-policy: native / build-macos-0 (pull_request) Skipped
KofTwentyTwo/ci-policy: native / build-macos-1 (pull_request) Skipped
KofTwentyTwo/ci-policy: native / build-macos-2 (pull_request) Skipped
KofTwentyTwo/ci-policy: native / build-macos-3 (pull_request) Skipped
KofTwentyTwo/ci-policy: native / build-windows-4 (pull_request) Skipped
KofTwentyTwo/ci-policy: native / build-windows-5 (pull_request) Skipped
KofTwentyTwo/ci-policy: native / build-windows-6 (pull_request) Skipped
KofTwentyTwo/ci-policy: native / build-windows-7 (pull_request) Skipped
KofTwentyTwo/ci-policy: native / dotnet-8 (pull_request) Skipped
KofTwentyTwo/ci-policy: native / dotnet-9 (pull_request) Skipped
KofTwentyTwo/ci-policy: native / dotnet-10 (pull_request) Skipped
KofTwentyTwo/ci-policy: native / dotnet-11 (pull_request) Skipped
KofTwentyTwo/ci-policy: native / swift-12 (pull_request) Skipped
KofTwentyTwo/ci-policy: native / swift-13 (pull_request) Skipped
KofTwentyTwo/ci-policy: native / swift-14 (pull_request) Skipped
KofTwentyTwo/ci-policy: native / swift-15 (pull_request) Skipped
KofTwentyTwo/ci-policy: native / swift-16 (pull_request) Skipped
KofTwentyTwo/ci-policy: native / swift-17 (pull_request) Skipped
KofTwentyTwo/ci-policy: native / swift-18 (pull_request) Skipped
KofTwentyTwo/ci-policy: native / swift-19 (pull_request) Skipped
KofTwentyTwo/ci-policy: native / native-result (pull_request) Canceled after 6s
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
50 lines
2.0 KiB
Python
50 lines
2.0 KiB
Python
"""The record that says what a build consumed, so a later release can prove an existing artifact is the same build.
|
|
|
|
The build side stores this record in the artifact manifest, and the trusted publisher recomputes the expected record for the release
|
|
commit from the forge's own facts. Reuse requires the two to be equal, so every field here is something a rebuild could change:
|
|
the source tree, the component directory, the toolchain and the runtime it ran in, the platform, the planned commands and
|
|
reports, and the declared version. No field names a repository, an owner or a run.
|
|
"""
|
|
|
|
import hashlib
|
|
import json
|
|
import re
|
|
from typing import Final, TypedDict
|
|
|
|
from platform_ci.plan import Target, to_compact_json
|
|
|
|
_TREE_PATTERN: Final = re.compile(r"[0-9a-f]{40}")
|
|
RUNTIME_KEY: Final = "runtime"
|
|
|
|
|
|
class BuildInputsRecord(TypedDict):
|
|
"""The manifest's `build_inputs` object (schema 1)."""
|
|
|
|
source_tree: str
|
|
input_digest: str
|
|
toolchain: dict[str, str]
|
|
platform: str
|
|
config_digest: str
|
|
version: str
|
|
|
|
|
|
def compute_build_inputs(target: Target, source_tree: str, version: str) -> BuildInputsRecord:
|
|
"""Return the build-input record of one planned target built from one source tree with one declared version."""
|
|
if _TREE_PATTERN.fullmatch(source_tree) is None:
|
|
raise ValueError(f"source tree must be a full 40 character tree id, got {source_tree!r}")
|
|
toolchain_name = target["toolchain"]
|
|
return BuildInputsRecord(
|
|
source_tree=source_tree,
|
|
input_digest=_digest({"source_tree": source_tree, "directory": target["directory"]}),
|
|
# a container target runs in its digest-pinned image, a host target on its operator-attested runner
|
|
toolchain={toolchain_name: target["toolchain_version"], RUNTIME_KEY: target["image"] or target["runner"]},
|
|
platform=target["platform"],
|
|
config_digest=_digest(target),
|
|
version=version,
|
|
)
|
|
|
|
|
|
def _digest(value: object) -> str:
|
|
"""SHA-256 of the canonical single-line JSON form."""
|
|
return hashlib.sha256(to_compact_json(json.loads(json.dumps(value))).encode("utf-8")).hexdigest()
|