Files
EventHubBack/scripts/build-erlang-base-images.sh
aleksey e8464b3a8b
CI / test (push) Successful in 7m42s
Add shared Erlang builder/runtime base images from registry.
Publish erlang-builder and erlang-runtime as :latest, use them in prod and API test builds, auto-collect NIF libs, and sync CI to pull/push bases before eventhub build.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-11 12:25:42 +03:00

84 lines
2.5 KiB
Bash

#!/usr/bin/env bash
# Erlang builder + runtime в registry (git.sabilin.com/eventhub/*:latest).
#
# Usage:
# ./scripts/build-erlang-base-images.sh # pull latest или собрать локально
# ./scripts/build-erlang-base-images.sh --push # + push :latest в registry
# ./scripts/build-erlang-base-images.sh --force-build # пересобрать без pull
set -euo pipefail
PUSH=0
FORCE=0
for arg in "$@"; do
case "${arg}" in
--push) PUSH=1 ;;
--force-build) FORCE=1 ;;
esac
done
REGISTRY="${REGISTRY:-git.sabilin.com/eventhub}"
ROOT="$(cd "$(dirname "$0")/.." && pwd)"
BUILDER="${REGISTRY}/erlang-builder:latest"
RUNTIME="${REGISTRY}/erlang-runtime:latest"
check_alpine_sync() {
local erlang_ver runtime_ver erlang_mm
erlang_ver="$(docker run --rm erlang:28-alpine cat /etc/alpine-release)"
runtime_ver="$(grep '^ARG ALPINE_VERSION=' "${ROOT}/docker/erlang/Dockerfile.runtime" | cut -d= -f2)"
erlang_mm="$(echo "${erlang_ver}" | cut -d. -f1-2)"
if [[ "${erlang_mm}" != "${runtime_ver}" ]]; then
echo "ERROR: erlang:28-alpine uses Alpine ${erlang_ver}, runtime pins ${runtime_ver}"
echo " Обновите ALPINE_VERSION в docker/erlang/Dockerfile.runtime"
exit 1
fi
echo "Alpine sync OK: ${erlang_mm} (erlang image ${erlang_ver})"
}
build_one() {
local file="$1"
local tag="$2"
local extra=()
if docker image inspect "${tag}" >/dev/null 2>&1; then
extra+=(--cache-from "${tag}")
fi
bash "${ROOT}/scripts/retry-docker-build.sh" 5 60 -- \
docker buildx build \
--network=host \
--pull \
"${extra[@]}" \
--file "${file}" \
--tag "${tag}" \
--load \
--provenance=false \
--sbom=false \
"${ROOT}"
}
try_pull_bases() {
docker pull "${BUILDER}" >/dev/null 2>&1 && docker pull "${RUNTIME}" >/dev/null 2>&1
}
need_build=1
if (( FORCE == 0 )) && try_pull_bases; then
echo "Using erlang base images from registry:"
echo " ${BUILDER}"
echo " ${RUNTIME}"
need_build=0
fi
if (( need_build )); then
echo "Building erlang base images locally..."
check_alpine_sync
build_one "${ROOT}/docker/erlang/Dockerfile.builder" "${BUILDER}"
build_one "${ROOT}/docker/erlang/Dockerfile.runtime" "${RUNTIME}"
echo "=== erlang base images built ==="
echo " ${BUILDER}"
echo " ${RUNTIME}"
fi
if (( PUSH )); then
bash "${ROOT}/scripts/retry-docker-build.sh" 5 30 -- docker push "${BUILDER}"
bash "${ROOT}/scripts/retry-docker-build.sh" 5 30 -- docker push "${RUNTIME}"
echo "Pushed ${BUILDER} and ${RUNTIME}"
fi