e8464b3a8b
CI / test (push) Successful in 7m42s
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>
84 lines
2.5 KiB
Bash
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
|