#!/usr/bin/env bash set -euo pipefail IFS=$'\n\t' REGISTRY=${REGISTRY:-git.4nkweb.com} NAMESPACE=${NAMESPACE:-4nk} # Support d'un paramètre positionnel prioritaire pour le tag if [ "${1:-}" != "" ]; then DOCKER_TAG="$1" fi if [ -z "${DOCKER_TAG:-}" ]; then echo "[docker][erreur] DOCKER_TAG non défini (obligatoire). Fournissez-le en argument ou via l'environnement." >&2 exit 1 fi # Normalisation du tag pour Docker (sécurité côté script) DOCKER_TAG=${DOCKER_TAG##*/} DOCKER_TAG=$(printf "%s" "$DOCKER_TAG" | tr '[:upper:]' '[:lower:]' | sed 's/[^a-z0-9_.-]/-/g') echo "[docker] registry=${REGISTRY} namespace=${NAMESPACE} tag=${DOCKER_TAG}" if ! command -v docker >/dev/null 2>&1; then echo "[docker][erreur] docker introuvable" >&2 exit 1 fi if [ ! -f .gitmodules ]; then echo "[docker][erreur] .gitmodules introuvable dans $(pwd)" >&2 exit 1 fi # Prépare le répertoire de logs LOG_DIR="log/ci/${DOCKER_TAG}" mkdir -p "${LOG_DIR}" SUMMARY_FILE="${LOG_DIR}/summary.txt" : > "${SUMMARY_FILE}" # Parcourt les submodules déclarés mapfile -t submodules < <(git config -f .gitmodules --name-only --get-regexp 'submodule\..*\.path' | sed -E 's/\.path$//') for name in "${submodules[@]}"; do path=$(git config -f .gitmodules --get "${name}.path" || true) url=$(git config -f .gitmodules --get "${name}.url" || true) branch=$(git config -f .gitmodules --get "${name}.branch" || echo "master") if [ -z "${path}" ] || [ -z "${url}" ]; then echo "[docker][warn] entrée incomplète pour ${name}, ignoré" >&2 continue fi image_name=$(basename "${path}") image_name_lc=$(printf "%s" "${image_name}" | tr '[:upper:]' '[:lower:]') full_ref="${REGISTRY}/${NAMESPACE}/${image_name_lc}:${DOCKER_TAG}" if [ ! -d "${path}" ]; then echo "[docker][warn] sous-dossier ${path} manquant, on saute" >&2 continue fi mapfile -t dockerfiles < <(find "${path}" -type f -name Dockerfile | sort) if [ ${#dockerfiles[@]} -eq 0 ]; then echo "[docker] aucun Dockerfile dans ${path}, ignoré" echo "skip $(basename \"${path}\")" >> "${SUMMARY_FILE}" continue fi for df in "${dockerfiles[@]}"; do df_dir=$(dirname "${df}") rel_dir=${df_dir#${path}/} if [ "${rel_dir}" = "${df_dir}" ]; then rel_dir=""; fi suffix="" if [ -n "${rel_dir}" ]; then suffix="-$(echo "${rel_dir}" | tr '[:upper:]' '[:lower:]' | tr '/' '-')" fi image_name_variant="${image_name_lc}${suffix}" full_ref_variant="${REGISTRY}/${NAMESPACE}/${image_name_variant}:${DOCKER_TAG}" log_file="${LOG_DIR}/${image_name_variant}.log" echo "[docker] build ${full_ref_variant} depuis ${df_dir} (branche ${branch}) | log: ${log_file}" { echo "== BUILD+PUSH ${full_ref_variant} ==" echo "context=${df_dir} dockerfile=${df}" date -Is docker buildx build \ --pull \ --ssh default \ --progress=plain \ --file "${df}" \ --tag "${full_ref_variant}" \ --push \ "${df_dir}" } 2>&1 | tee -a "${log_file}" echo "${full_ref_variant} ${log_file}" >> "${SUMMARY_FILE}" done done echo "[docker] terminé" echo "[docker] récapitulatif: ${SUMMARY_FILE}"