#!/usr/bin/env bash set -euo pipefail # Build and push multiple Docker images to a registry (GHCR or self-hosted) # Usage: # ./build_and_push_ghcr.sh [TAG] # Environment variables (defaults shown): # TAG (arg or env, default: latest) # IMAGE_REGISTRY (default: ghcr.io) # OWNER (default: marcopedone) # SERVICES (space-separated list, default: backend web db) # USERNAME (optional): registry username for docker login # TOKEN (optional): registry password/token for docker login # # The script expects subfolders for services when building from source: # - db -> ./apps/db # - backend -> ./apps/backend # - web -> ./apps/infoalloggi TAG=${1:-${TAG:-latest}} IMAGE_REGISTRY=${IMAGE_REGISTRY:-ghcr.io} OWNER=${OWNER:-marcopedone} SERVICES=${SERVICES:-"backend web db"} USERNAME=${USERNAME:-marcopedone} TOKEN=${TOKEN:-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} set -x # Optional login if [[ -n "${USERNAME}" && -n "${TOKEN}" ]]; then echo "Logging into ${IMAGE_REGISTRY} as ${USERNAME}..." echo "${TOKEN}" | docker login "${IMAGE_REGISTRY}" -u "${USERNAME}" --password-stdin else echo "No credentials provided; assuming you're already logged into ${IMAGE_REGISTRY} or using a credential helper." fi for svc in ${SERVICES}; do case "${svc}" in db) ctx="./apps/db" dockerfile="Dockerfile" ;; backend) ctx="./apps/backend" dockerfile="Dockerfile" ;; web) ctx="./apps/infoalloggi" dockerfile="Dockerfile" ;; *) echo "Unknown service: ${svc}, skipping..."; continue ;; esac IMAGE="${IMAGE_REGISTRY}/${OWNER}/infoalloggi-${svc}:${TAG}" echo "Building ${svc} -> ${IMAGE} (context: ${ctx})" docker build -t "${IMAGE}" -f "$ctx/$dockerfile" "$ctx" echo "Pushing ${IMAGE}" docker push "${IMAGE}" done echo "All done. Built and pushed services: ${SERVICES} with tag ${TAG} to ${IMAGE_REGISTRY}/${OWNER}/infoalloggi-:${TAG}"