@@ -36,11 +36,14 @@ jobs:
3636 grep -E "^[[:space:]]*${key}[[:space:]]*=" internal/schema/constants.go | sed -E 's/.*"([^"]+)".*/\1/'
3737 }
3838
39- SCHEMA_VERSION="$(extract_const ExpectedSchemaVersion)"
40- SCHEMA_URI="$(extract_const ExpectedSchemaURI)"
41- SCHEMA_DIGEST="$(extract_const ExpectedSchemaDigest)"
42-
43- if [[ -z "${SCHEMA_VERSION}" || -z "${SCHEMA_URI}" || -z "${SCHEMA_DIGEST}" ]]; then
39+ MODEL_SCHEMA_VERSION="$(extract_const ExpectedSchemaVersion)"
40+ MODEL_SCHEMA_URI="$(extract_const ExpectedSchemaURI)"
41+ MODEL_SCHEMA_DIGEST="$(extract_const ExpectedSchemaDigest)"
42+ SNAPSHOT_SCHEMA_VERSION="$(extract_const ExpectedSnapshotSchemaVersion)"
43+ SNAPSHOT_SCHEMA_URI="$(extract_const ExpectedSnapshotSchemaURI)"
44+ SNAPSHOT_SCHEMA_DIGEST="$(extract_const ExpectedSnapshotSchemaDigest)"
45+
46+ if [[ -z "${MODEL_SCHEMA_VERSION}" || -z "${MODEL_SCHEMA_URI}" || -z "${MODEL_SCHEMA_DIGEST}" || -z "${SNAPSHOT_SCHEMA_VERSION}" || -z "${SNAPSHOT_SCHEMA_URI}" || -z "${SNAPSHOT_SCHEMA_DIGEST}" ]]; then
4447 echo "failed to resolve schema constants from internal/schema/constants.go"
4548 exit 1
4649 fi
@@ -51,24 +54,29 @@ jobs:
5154 exit 1
5255 fi
5356 TAG_VERSION="${GITHUB_REF_NAME#schema-v}"
54- if [[ "${TAG_VERSION}" != "${SCHEMA_VERSION }" ]]; then
55- echo "tag version mismatch: tag=${TAG_VERSION} schema =${SCHEMA_VERSION }"
57+ if [[ "${TAG_VERSION}" != "${MODEL_SCHEMA_VERSION}" || "${TAG_VERSION}" != "${SNAPSHOT_SCHEMA_VERSION }" ]]; then
58+ echo "tag version mismatch: tag=${TAG_VERSION} model =${MODEL_SCHEMA_VERSION} snapshot=${SNAPSHOT_SCHEMA_VERSION }"
5659 exit 1
5760 fi
5861 else
59- TAG_VERSION="${SCHEMA_VERSION }"
62+ TAG_VERSION="${MODEL_SCHEMA_VERSION }"
6063 fi
6164
62- echo "schema_version=${SCHEMA_VERSION}" >> "${GITHUB_OUTPUT}"
63- echo "schema_uri=${SCHEMA_URI}" >> "${GITHUB_OUTPUT}"
64- echo "schema_digest=${SCHEMA_DIGEST}" >> "${GITHUB_OUTPUT}"
65+ echo "model_schema_version=${MODEL_SCHEMA_VERSION}" >> "${GITHUB_OUTPUT}"
66+ echo "model_schema_uri=${MODEL_SCHEMA_URI}" >> "${GITHUB_OUTPUT}"
67+ echo "model_schema_digest=${MODEL_SCHEMA_DIGEST}" >> "${GITHUB_OUTPUT}"
68+ echo "snapshot_schema_version=${SNAPSHOT_SCHEMA_VERSION}" >> "${GITHUB_OUTPUT}"
69+ echo "snapshot_schema_uri=${SNAPSHOT_SCHEMA_URI}" >> "${GITHUB_OUTPUT}"
70+ echo "snapshot_schema_digest=${SNAPSHOT_SCHEMA_DIGEST}" >> "${GITHUB_OUTPUT}"
6571 echo "tag_version=${TAG_VERSION}" >> "${GITHUB_OUTPUT}"
6672
6773 - name : Validate schema JSON and $id binding
6874 shell : bash
6975 env :
70- EXPECTED_URI : ${{ steps.contract.outputs.schema_uri }}
71- EXPECTED_DIGEST : ${{ steps.contract.outputs.schema_digest }}
76+ EXPECTED_MODEL_URI : ${{ steps.contract.outputs.model_schema_uri }}
77+ EXPECTED_MODEL_DIGEST : ${{ steps.contract.outputs.model_schema_digest }}
78+ EXPECTED_SNAPSHOT_URI : ${{ steps.contract.outputs.snapshot_schema_uri }}
79+ EXPECTED_SNAPSHOT_DIGEST : ${{ steps.contract.outputs.snapshot_schema_digest }}
7280 run : |
7381 set -euo pipefail
7482 python - <<'PY'
@@ -77,45 +85,93 @@ jobs:
7785 import os
7886 from pathlib import Path
7987
80- schema_path = Path("api/schema/model.schema.json")
81- raw = schema_path.read_bytes()
82- payload = json.loads(raw.decode("utf-8"))
83- expected_uri = os.environ["EXPECTED_URI"]
84- actual_uri = payload.get("$id")
85- if actual_uri != expected_uri:
86- raise SystemExit(f"schema $id mismatch: got={actual_uri!r} want={expected_uri!r}")
87-
88- digest = "sha256:" + hashlib.sha256(raw).hexdigest()
89- expected_digest = os.environ["EXPECTED_DIGEST"]
90- if digest != expected_digest:
91- raise SystemExit(f"schema digest mismatch: got={digest!r} want={expected_digest!r}")
88+ checks = [
89+ (
90+ Path("api/schema/model.schema.json"),
91+ os.environ["EXPECTED_MODEL_URI"],
92+ os.environ["EXPECTED_MODEL_DIGEST"],
93+ ),
94+ (
95+ Path("api/schema/snapshot.schema.json"),
96+ os.environ["EXPECTED_SNAPSHOT_URI"],
97+ os.environ["EXPECTED_SNAPSHOT_DIGEST"],
98+ ),
99+ ]
100+
101+ for schema_path, expected_uri, expected_digest in checks:
102+ raw = schema_path.read_bytes()
103+ payload = json.loads(raw.decode("utf-8"))
104+ actual_uri = payload.get("$id")
105+ if actual_uri != expected_uri:
106+ raise SystemExit(
107+ f"schema $id mismatch for {schema_path}: got={actual_uri!r} want={expected_uri!r}"
108+ )
109+
110+ digest = "sha256:" + hashlib.sha256(raw).hexdigest()
111+ if digest != expected_digest:
112+ raise SystemExit(
113+ f"schema digest mismatch for {schema_path}: got={digest!r} want={expected_digest!r}"
114+ )
92115 PY
93116
94117 - name : Build publish artifact
95118 shell : bash
96119 env :
97- SCHEMA_VERSION : ${{ steps.contract.outputs.schema_version }}
98- SCHEMA_URI : ${{ steps.contract.outputs.schema_uri }}
99- SCHEMA_DIGEST : ${{ steps.contract.outputs.schema_digest }}
120+ MODEL_SCHEMA_VERSION : ${{ steps.contract.outputs.model_schema_version }}
121+ MODEL_SCHEMA_URI : ${{ steps.contract.outputs.model_schema_uri }}
122+ MODEL_SCHEMA_DIGEST : ${{ steps.contract.outputs.model_schema_digest }}
123+ SNAPSHOT_SCHEMA_VERSION : ${{ steps.contract.outputs.snapshot_schema_version }}
124+ SNAPSHOT_SCHEMA_URI : ${{ steps.contract.outputs.snapshot_schema_uri }}
125+ SNAPSHOT_SCHEMA_DIGEST : ${{ steps.contract.outputs.snapshot_schema_digest }}
100126 run : |
101127 set -euo pipefail
102128
103129 ROOT="out"
104- VERSION_DIR="${ROOT}/schema/model/v${SCHEMA_VERSION}"
105- LATEST_DIR="${ROOT}/schema/model/latest"
130+ MODEL_VERSION_DIR="${ROOT}/schema/model/v${MODEL_SCHEMA_VERSION}"
131+ MODEL_LATEST_DIR="${ROOT}/schema/model/latest"
132+ SNAPSHOT_VERSION_DIR="${ROOT}/schema/snapshot/v${SNAPSHOT_SCHEMA_VERSION}"
133+ SNAPSHOT_LATEST_DIR="${ROOT}/schema/snapshot/latest"
106134
107- mkdir -p "${VERSION_DIR }" "${LATEST_DIR }" "${ROOT}/schema"
135+ mkdir -p "${MODEL_VERSION_DIR }" "${MODEL_LATEST_DIR}" "${SNAPSHOT_VERSION_DIR}" "${SNAPSHOT_LATEST_DIR }" "${ROOT}/schema"
108136
109- cp api/schema/model.schema.json "${VERSION_DIR}/model.schema.json"
110- cp api/schema/model.schema.json "${LATEST_DIR}/model.schema.json"
137+ cp api/schema/model.schema.json "${MODEL_VERSION_DIR}/model.schema.json"
138+ cp api/schema/model.schema.json "${MODEL_LATEST_DIR}/model.schema.json"
139+ cp api/schema/snapshot.schema.json "${SNAPSHOT_VERSION_DIR}/snapshot.schema.json"
140+ cp api/schema/snapshot.schema.json "${SNAPSHOT_LATEST_DIR}/snapshot.schema.json"
111141
112142 UPDATED_AT="$(date -u +"%Y-%m-%dT%H:%M:%SZ")"
113143 cat > "${ROOT}/schema/index.json" <<EOF
114144 {
115145 "name": "io.mb3r.bering.model",
116- "version": "${SCHEMA_VERSION}",
117- "uri": "${SCHEMA_URI}",
118- "digest": "${SCHEMA_DIGEST}",
146+ "version": "${MODEL_SCHEMA_VERSION}",
147+ "uri": "${MODEL_SCHEMA_URI}",
148+ "digest": "${MODEL_SCHEMA_DIGEST}",
149+ "model": {
150+ "name": "io.mb3r.bering.model",
151+ "version": "${MODEL_SCHEMA_VERSION}",
152+ "uri": "${MODEL_SCHEMA_URI}",
153+ "digest": "${MODEL_SCHEMA_DIGEST}"
154+ },
155+ "snapshot": {
156+ "name": "io.mb3r.bering.snapshot",
157+ "version": "${SNAPSHOT_SCHEMA_VERSION}",
158+ "uri": "${SNAPSHOT_SCHEMA_URI}",
159+ "digest": "${SNAPSHOT_SCHEMA_DIGEST}"
160+ },
161+ "contracts": [
162+ {
163+ "name": "io.mb3r.bering.model",
164+ "version": "${MODEL_SCHEMA_VERSION}",
165+ "uri": "${MODEL_SCHEMA_URI}",
166+ "digest": "${MODEL_SCHEMA_DIGEST}"
167+ },
168+ {
169+ "name": "io.mb3r.bering.snapshot",
170+ "version": "${SNAPSHOT_SCHEMA_VERSION}",
171+ "uri": "${SNAPSHOT_SCHEMA_URI}",
172+ "digest": "${SNAPSHOT_SCHEMA_DIGEST}"
173+ }
174+ ],
119175 "updated_at": "${UPDATED_AT}"
120176 }
121177 EOF
0 commit comments