#!/usr/bin/env bash # Build all services from services-matrix.env one at a time. # Usage: ./devops/docker/build-all-services.sh [start_from] # start_from: 1-based index to resume from (default: 1) set -uo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" REPO_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)" MATRIX="$SCRIPT_DIR/services-matrix.env" START_FROM=${1:-1} TAG="${IMAGE_TAG:-dev}" cd "$REPO_ROOT" # Parse services from matrix mapfile -t SERVICES < <(grep -v '^#' "$MATRIX" | grep -v '^$') TOTAL=${#SERVICES[@]} echo "=============================================" echo " Building $TOTAL services (tag: $TAG)" echo " Starting from: $START_FROM" echo "=============================================" echo "" FAILED=() BUILT=0 SKIPPED=0 for i in "${!SERVICES[@]}"; do IDX=$((i + 1)) if [[ $IDX -lt $START_FROM ]]; then ((SKIPPED++)) continue fi IFS='|' read -r SERVICE DOCKERFILE PROJECT BINARY PORT <<< "${SERVICES[$i]}" echo "[$IDX/$TOTAL] Building $SERVICE..." echo " Project: $PROJECT" echo " Binary: $BINARY" echo " Dockerfile: $DOCKERFILE" BUILD_LOG=$(mktemp) if docker build \ -f "$DOCKERFILE" \ --build-arg APP_PROJECT="$PROJECT" \ --build-arg APP_BINARY="$BINARY" \ --build-arg APP_PORT="$PORT" \ -t "stellaops/$SERVICE:$TAG" \ . > "$BUILD_LOG" 2>&1; then echo " OK: stellaops/$SERVICE:$TAG" ((BUILT++)) else echo " FAILED: $SERVICE" echo " Last 10 lines of build log:" tail -10 "$BUILD_LOG" | sed 's/^/ /' FAILED+=("$SERVICE") fi rm -f "$BUILD_LOG" echo "" done echo "=============================================" echo " Build complete" echo " Built: $BUILT" echo " Skipped: $SKIPPED" echo " Failed: ${#FAILED[@]}" if [[ ${#FAILED[@]} -gt 0 ]]; then echo " Failed services: ${FAILED[*]}" fi echo "============================================="