Skip to content

Commit 812b699

Browse files
committed
Implement first public product release of Bering (v0.1.0)
Add CHANGELOG.md to document the initial release highlights, including batch discovery capabilities, artifact validation, and runtime service features. Update README.md to reflect the new product version and clarify installation instructions. Enhance RELEASING.md and VERSIONING.md to outline the separation of product and schema versioning. Modify CI workflows for schema publishing and release automation, ensuring proper artifact management. Update documentation to support the new release structure and clarify usage with Sheaft.
1 parent 847b2f7 commit 812b699

13 files changed

Lines changed: 510 additions & 174 deletions

File tree

.github/workflows/publish-schema.yml

Lines changed: 92 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -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

.github/workflows/release.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -92,10 +92,10 @@ jobs:
9292
done
9393
if gh release view "${GITHUB_REF_NAME}" >/dev/null 2>&1; then
9494
gh release upload "${GITHUB_REF_NAME}" "${args[@]}" --clobber
95-
gh release edit "${GITHUB_REF_NAME}" --title "${GITHUB_REF_NAME}" --notes-file dist/release-notes.md
95+
gh release edit "${GITHUB_REF_NAME}" --title "Bering ${GITHUB_REF_NAME}" --notes-file dist/release-notes.md
9696
else
9797
gh release create "${GITHUB_REF_NAME}" \
9898
"${args[@]}" \
99-
--title "${GITHUB_REF_NAME}" \
99+
--title "Bering ${GITHUB_REF_NAME}" \
100100
--notes-file dist/release-notes.md
101101
fi

CHANGELOG.md

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
# Changelog
2+
3+
## v0.1.0
4+
5+
First public product release of Bering.
6+
7+
### Highlights
8+
9+
- Batch discovery from normalized trace input, OTEL trace input, and explicit `topology_api` inputs.
10+
- Artifact validation against pinned public JSON schemas.
11+
- Runtime service with OTLP/HTTP ingest, optional OTLP/gRPC ingest, health endpoints, Prometheus metrics, and rolling snapshot emission.
12+
- Discovery overlays for additive metadata such as labels, weights, predicate references, and replica overrides.
13+
- Example artifacts, runtime config, collector wiring, Prometheus scrape config, and Grafana dashboard checked into the repository.
14+
15+
### Product vs schema versioning
16+
17+
- Product release tag: `v0.1.0`
18+
- Public schema contracts emitted by this release remain:
19+
- `io.mb3r.bering.model@1.0.0`
20+
- `io.mb3r.bering.snapshot@1.0.0`
21+
- Schema publishing to GitHub Pages remains a separate operation under `schema-v1.0.0`
22+
23+
### Packaging and install surface
24+
25+
- Reproducible release archives via GoReleaser for `linux/amd64`, `linux/arm64`, `darwin/amd64`, `darwin/arm64`, and `windows/amd64`.
26+
- Release payload includes checksums, SBOMs, contracts pack, OCI image metadata, Helm chart metadata, and `release-manifest.json`.
27+
- Explicit install path documented for release binaries, source builds, OCI image usage, Helm usage, and offline contracts pack consumption.
28+
29+
### Sheaft integration path
30+
31+
- The primary downstream handoff remains the stable model artifact `io.mb3r.bering.model@1.0.0`.
32+
- Checked-in examples and README commands show the expected handoff into Sheaft.
33+
34+
### Known limits
35+
36+
- Bering stops at discovery and publishing; it does not perform simulation, gating, or chaos orchestration.
37+
- Runtime mode intentionally keeps memory bounded to a single active tumbling window plus the previous emitted snapshot.
38+
- Late spans and in-memory caps are operational tradeoffs surfaced through metrics and logs, not hidden retries or buffering guarantees.

0 commit comments

Comments
 (0)