2026-04-28 13:22:26 +02:00
|
|
|
|
#!/bin/bash
|
2026-04-28 11:28:07 +02:00
|
|
|
|
|
|
|
|
|
|
# ---------------------------------------------------------------------------
|
2026-04-28 13:22:26 +02:00
|
|
|
|
# build.sh – Build and push Docker images
|
2026-04-28 11:28:07 +02:00
|
|
|
|
#
|
|
|
|
|
|
# Usage:
|
|
|
|
|
|
# ./build.sh [OPTIONS]
|
|
|
|
|
|
#
|
|
|
|
|
|
# Options:
|
2026-04-28 13:22:26 +02:00
|
|
|
|
# -s, --snapshot Version from git ref for prototyping
|
2026-04-28 13:38:55 +02:00
|
|
|
|
# -r, --release Version from .env for releases
|
2026-04-28 13:22:26 +02:00
|
|
|
|
# -v, --version VERSION Custom version
|
2026-04-28 11:28:07 +02:00
|
|
|
|
# -p, --push Push images after build
|
2026-04-28 13:38:55 +02:00
|
|
|
|
# -o, --only SERVICE Only build this service (repeatable)
|
2026-04-28 11:28:07 +02:00
|
|
|
|
# -h, --help Show this help
|
|
|
|
|
|
#
|
|
|
|
|
|
# Examples:
|
2026-04-28 13:22:26 +02:00
|
|
|
|
# ./build.sh -r -p
|
2026-04-28 13:38:55 +02:00
|
|
|
|
# ./build.sh -s -o frontend
|
|
|
|
|
|
# ./build.sh -v dev -o backend -o frontend
|
2026-04-28 11:28:07 +02:00
|
|
|
|
# ---------------------------------------------------------------------------
|
|
|
|
|
|
|
2026-04-28 13:22:26 +02:00
|
|
|
|
# -e: Exit immediately if any command returns a non-zero exit code
|
|
|
|
|
|
# -u: Treat unset variables as errors
|
|
|
|
|
|
# -o pipefail: Make pipelines fail if any command in the pipe fails, not just the last one
|
|
|
|
|
|
set -euo pipefail
|
|
|
|
|
|
|
|
|
|
|
|
#cd to script dir
|
2026-04-28 13:38:55 +02:00
|
|
|
|
pushd "$(dirname "${BASH_SOURCE[0]}")" > /dev/null
|
2026-04-28 13:22:26 +02:00
|
|
|
|
SCRIPT_DIR="$(pwd)"
|
|
|
|
|
|
source "${SCRIPT_DIR}/.env"
|
2026-04-28 13:57:43 +02:00
|
|
|
|
# read from .env:
|
|
|
|
|
|
# REGISTRY, IMAGE_NAME, IMAGE_VERSION, SNAPSHOT_TAG
|
|
|
|
|
|
# SERVICES (subfolder name = image suffix)
|
2026-04-28 13:38:55 +02:00
|
|
|
|
popd > /dev/null
|
2026-04-28 11:28:07 +02:00
|
|
|
|
|
2026-04-28 13:57:43 +02:00
|
|
|
|
#default: build snapshot
|
|
|
|
|
|
VERSION="${IMAGE_VERSION}-${SNAPSHOT_TAG}" # read from .env
|
2026-04-28 11:28:07 +02:00
|
|
|
|
|
|
|
|
|
|
PUSH=false
|
2026-04-28 13:38:55 +02:00
|
|
|
|
ONLY=()
|
2026-04-28 11:28:07 +02:00
|
|
|
|
|
|
|
|
|
|
usage() {
|
|
|
|
|
|
sed -n '/^# Usage:/,/^# ---/p' "$0" | sed 's/^# //' | sed 's/^#//'
|
|
|
|
|
|
exit 0
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
# --- parse arguments -------------------------------------------------------
|
|
|
|
|
|
while [[ $# -gt 0 ]]; do
|
|
|
|
|
|
case $1 in
|
2026-05-07 10:28:42 +02:00
|
|
|
|
-s|--snapshot) VERSION="${IMAGE_VERSION}-SNAPSHOT$(git rev-parse --short HEAD 2>/dev/null || echo "local")"; shift ;;
|
|
|
|
|
|
-r|--release) VERSION="${IMAGE_VERSION}"; shift ;;
|
2026-04-28 13:38:55 +02:00
|
|
|
|
-v|--version) VERSION="$2"; shift 2 ;;
|
|
|
|
|
|
-p|--push) PUSH=true; shift ;;
|
|
|
|
|
|
-o|--only) ONLY+=("$2"); shift 2 ;;
|
|
|
|
|
|
-h|--help) usage ;;
|
2026-04-28 11:28:07 +02:00
|
|
|
|
*) echo "Unknown option: $1" >&2; exit 1 ;;
|
|
|
|
|
|
esac
|
|
|
|
|
|
done
|
|
|
|
|
|
|
2026-04-28 13:38:55 +02:00
|
|
|
|
# if --only was given, filter SERVICES down to those entries
|
|
|
|
|
|
if [[ ${#ONLY[@]} -gt 0 ]]; then
|
|
|
|
|
|
SERVICES=("${ONLY[@]}")
|
|
|
|
|
|
fi
|
2026-04-28 11:28:07 +02:00
|
|
|
|
|
|
|
|
|
|
echo "============================================"
|
2026-04-28 13:57:43 +02:00
|
|
|
|
echo " Docker Build - ${IMAGE_NAME}"
|
2026-04-28 13:38:55 +02:00
|
|
|
|
echo ""
|
|
|
|
|
|
echo " Services : ${SERVICES[*]}"
|
2026-04-28 11:28:07 +02:00
|
|
|
|
echo " Version : ${VERSION}"
|
|
|
|
|
|
echo " Registry : ${REGISTRY}"
|
|
|
|
|
|
echo " Push : ${PUSH}"
|
|
|
|
|
|
echo "============================================"
|
|
|
|
|
|
|
|
|
|
|
|
# --- build ------------------------------------------------------------------
|
2026-04-28 13:38:55 +02:00
|
|
|
|
for SERVICE in "${SERVICES[@]}"; do
|
|
|
|
|
|
IMAGE="${REGISTRY}/${IMAGE_NAME}-${SERVICE}:${VERSION}"
|
2026-04-28 11:28:07 +02:00
|
|
|
|
echo ""
|
2026-04-28 13:38:55 +02:00
|
|
|
|
echo ">>> Building ${SERVICE}: ${IMAGE}"
|
|
|
|
|
|
docker build --tag "${IMAGE}" "${SCRIPT_DIR}/${SERVICE}"
|
|
|
|
|
|
echo " ${SERVICE} built successfully."
|
|
|
|
|
|
done
|
2026-04-28 11:28:07 +02:00
|
|
|
|
|
|
|
|
|
|
# --- push -------------------------------------------------------------------
|
|
|
|
|
|
if $PUSH; then
|
2026-04-28 13:57:43 +02:00
|
|
|
|
docker login "${REGISTRY}" # read from .env
|
2026-04-28 13:38:55 +02:00
|
|
|
|
for SERVICE in "${SERVICES[@]}"; do
|
|
|
|
|
|
IMAGE="${REGISTRY}/${IMAGE_NAME}-${SERVICE}:${VERSION}"
|
2026-04-28 11:28:07 +02:00
|
|
|
|
echo ""
|
2026-04-28 13:38:55 +02:00
|
|
|
|
echo ">>> Pushing ${IMAGE}"
|
|
|
|
|
|
docker push "${IMAGE}"
|
|
|
|
|
|
done
|
2026-04-28 11:28:07 +02:00
|
|
|
|
echo ""
|
|
|
|
|
|
echo "Images pushed successfully."
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
echo ""
|
|
|
|
|
|
echo "Done."
|
2026-04-28 13:38:55 +02:00
|
|
|
|
for SERVICE in "${SERVICES[@]}"; do
|
|
|
|
|
|
echo " ${SERVICE} → ${REGISTRY}/${IMAGE_NAME}-${SERVICE}:${VERSION}"
|
|
|
|
|
|
done
|