feat: bake product version from Spec and expose build in health.

Resolve MAJOR.MINOR via EventHubSpec/VERSION; CI run_number as EVENTHUB_BUILD; health returns version/build/git_sha/built_at.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-07-17 21:48:24 +03:00
parent 2b65a804d3
commit cd61aaff20
7 changed files with 72 additions and 4 deletions
+7 -1
View File
@@ -74,17 +74,23 @@ jobs:
run: bash scripts/build-erlang-base-images.sh --push
- name: Build eventhub image
env:
REGISTRY_PASSWORD: ${{ secrets.REGISTRY_PASSWORD }}
GITEA_TOKEN: ${{ secrets.REGISTRY_PASSWORD }}
run: |
set -euo pipefail
APP_VERSION="$(tr -d '[:space:]' < VERSION 2>/dev/null || echo 0.0)"
APP_VERSION="$(bash scripts/resolve-product-version.sh)"
APP_BUILD="${GITHUB_RUN_NUMBER:-0}"
GIT_SHA="${GITHUB_SHA:0:12}"
BUILT_AT="$(date -u +%Y-%m-%dT%H:%M:%SZ)"
echo "Bake: version=${APP_VERSION} build=${APP_BUILD} git_sha=${GIT_SHA}"
bash scripts/retry-docker-build.sh 5 60 -- \
docker buildx build \
--network=host \
--pull \
--file docker/Dockerfile \
--build-arg "EVENTHUB_VERSION=${APP_VERSION}" \
--build-arg "EVENTHUB_BUILD=${APP_BUILD}" \
--build-arg "EVENTHUB_GIT_SHA=${GIT_SHA}" \
--build-arg "EVENTHUB_BUILT_AT=${BUILT_AT}" \
--tag eventhub:latest \
+2
View File
@@ -36,10 +36,12 @@ RUN collect-runtime-libs.sh /app/release /opt/runtime-libs
FROM ${ERLANG_RUNTIME_IMAGE}
ARG EVENTHUB_VERSION=0.0
ARG EVENTHUB_BUILD=0
ARG EVENTHUB_GIT_SHA=unknown
ARG EVENTHUB_BUILT_AT=
ENV EVENTHUB_VERSION=${EVENTHUB_VERSION} \
EVENTHUB_BUILD=${EVENTHUB_BUILD} \
EVENTHUB_GIT_SHA=${EVENTHUB_GIT_SHA} \
EVENTHUB_BUILT_AT=${EVENTHUB_BUILT_AT}
+40
View File
@@ -0,0 +1,40 @@
#!/usr/bin/env bash
# Product version (MAJOR.MINOR) из EventHubSpec/VERSION.
# Fallback: локальный VERSION (офлайн / без токена).
set -euo pipefail
BASE="${GITEA_BASE_URL:-https://git.sabilin.com}"
TOKEN="${GITEA_TOKEN:-${REGISTRY_PASSWORD:-}}"
REF="${PRODUCT_VERSION_REF:-master}"
FALLBACK_FILE="${PRODUCT_VERSION_FILE:-VERSION}"
fetch_spec() {
local url="${BASE}/api/v1/repos/EventHub/EventHubSpec/raw/VERSION?ref=${REF}"
if [[ -n "${TOKEN}" ]]; then
curl -fsSL -H "Authorization: token ${TOKEN}" "${url}"
else
curl -fsSL "${url}"
fi
}
ver=""
if raw="$(fetch_spec 2>/dev/null)"; then
ver="$(printf '%s' "${raw}" | grep -Eo '[0-9]+\.[0-9]+' | head -1 || true)"
fi
if [[ -z "${ver}" && -f "${FALLBACK_FILE}" ]]; then
echo "WARN: EventHubSpec/VERSION недоступен — fallback ${FALLBACK_FILE}" >&2
ver="$(grep -Eo '[0-9]+\.[0-9]+' "${FALLBACK_FILE}" | head -1 || true)"
fi
if [[ -z "${ver}" ]]; then
echo "ERROR: не удалось получить product version (Spec + local VERSION)" >&2
exit 1
fi
if ! [[ "${ver}" =~ ^[0-9]+\.[0-9]+$ ]]; then
echo "ERROR: некорректный VERSION '${ver}' (ожидается MAJOR.MINOR)" >&2
exit 1
fi
printf '%s\n' "${ver}"
+2 -1
View File
@@ -29,7 +29,8 @@ trails() ->
properties => #{
status => #{type => string},
service => #{type => string},
version => #{type => string},
version => #{type => string, description => <<"MAJOR.MINOR from EventHubSpec/VERSION">>},
build => #{type => integer, description => <<"CI run_number (per-repo)">>},
git_sha => #{type => string},
built_at => #{type => string}
}
+2 -1
View File
@@ -31,7 +31,8 @@ trails() ->
properties => #{
status => #{type => string},
service => #{type => string},
version => #{type => string},
version => #{type => string, description => <<"MAJOR.MINOR from EventHubSpec/VERSION">>},
build => #{type => integer, description => <<"CI run_number (per-repo)">>},
git_sha => #{type => string},
built_at => #{type => string}
}
+17 -1
View File
@@ -1,13 +1,15 @@
-module(eventhub_build_info).
-export([info/0, version/0, git_sha/0, built_at/0]).
-export([info/0, version/0, build/0, git_sha/0, built_at/0]).
%% @doc Runtime build identity from env (baked at image build or set in compose).
%% version = MAJOR.MINOR (EventHubSpec/VERSION); build = CI run_number (per-repo).
-spec info() -> map().
info() ->
#{
status => <<"ok">>,
service => <<"eventhub">>,
version => version(),
build => build(),
git_sha => git_sha(),
built_at => built_at()
}.
@@ -15,6 +17,20 @@ info() ->
-spec version() -> binary().
version() -> env("EVENTHUB_VERSION", <<"0.0">>).
-spec build() -> non_neg_integer().
build() ->
case os:getenv("EVENTHUB_BUILD") of
false -> 0;
[] -> 0;
Value ->
try list_to_integer(Value) of
N when is_integer(N), N >= 0 -> N;
_ -> 0
catch
error:badarg -> 0
end
end.
-spec git_sha() -> binary().
git_sha() -> env("EVENTHUB_GIT_SHA", <<"unknown">>).
+2
View File
@@ -25,6 +25,8 @@ test_health_get() ->
?assertEqual(<<"ok">>, maps:get(<<"status">>, Result)),
?assertEqual(<<"eventhub">>, maps:get(<<"service">>, Result)),
?assert(is_map_key(<<"version">>, Result)),
?assert(is_map_key(<<"build">>, Result)),
?assert(is_integer(maps:get(<<"build">>, Result))),
?assert(is_map_key(<<"git_sha">>, Result)).
test_health_wrong_method() ->