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:
@@ -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 \
|
||||
|
||||
@@ -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}
|
||||
|
||||
|
||||
@@ -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}"
|
||||
@@ -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}
|
||||
}
|
||||
|
||||
@@ -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}
|
||||
}
|
||||
|
||||
@@ -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">>).
|
||||
|
||||
|
||||
@@ -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() ->
|
||||
|
||||
Reference in New Issue
Block a user