docker-laravel/scripts/build.sh

138 lines
4.0 KiB
Bash
Raw Permalink Normal View History

#!/usr/bin/env bash
# ===========================================================================
# build.sh — Build all PHP version images with full Laravel tag matrix
#
# Usage:
# ./build.sh # build all versions
# ./build.sh 8.4 # build only PHP 8.4
# ./build.sh 8.3 8.4 # build PHP 8.3 + 8.4
#
# Environment:
# IMAGE_NAME — image name (default: docker-laravel)
# NODE_MAJOR — Node.js major ver (default: 22)
# PLATFORM — e.g. linux/amd64 (default: current platform)
# ===========================================================================
set -euo pipefail
IMAGE_NAME="${IMAGE_NAME:-blaxsoftware/laravel}"
NODE_MAJOR="${NODE_MAJOR:-22}"
# ---------------------------------------------------------------------------
# PHP → Laravel version mapping
# ---------------------------------------------------------------------------
declare -A PHP_LARAVEL_MAP=(
["7.4"]=""
["8.0"]="9"
["8.1"]="9 10"
["8.2"]="9 10 11 12"
["8.3"]="10 11 12 13"
["8.4"]="11 12 13"
["8.5"]="12 13"
)
# Recommended (highest) PHP version per Laravel version → gets the bare `laravelN` tag
declare -A LARAVEL_RECOMMENDED_PHP=(
["9"]="8.1"
["10"]="8.3"
["11"]="8.4"
["12"]="8.5"
["13"]="8.5"
)
# Which PHP version gets the `latest` tag
LATEST_PHP="8.4"
ALL_PHP_VERSIONS=("7.4" "8.0" "8.1" "8.2" "8.3" "8.4" "8.5")
# ---------------------------------------------------------------------------
# Determine which versions to build
# ---------------------------------------------------------------------------
if [ $# -gt 0 ]; then
BUILD_VERSIONS=("$@")
else
BUILD_VERSIONS=("${ALL_PHP_VERSIONS[@]}")
fi
# Validate requested versions
for v in "${BUILD_VERSIONS[@]}"; do
if [[ ! -v "PHP_LARAVEL_MAP[$v]" ]]; then
echo "ERROR: Unknown PHP version: $v"
echo "Available: ${ALL_PHP_VERSIONS[*]}"
exit 1
fi
done
# ---------------------------------------------------------------------------
# Build
# ---------------------------------------------------------------------------
TOTAL=${#BUILD_VERSIONS[@]}
CURRENT=0
FAILED=()
PLATFORM_ARG=""
if [ -n "${PLATFORM:-}" ]; then
PLATFORM_ARG="--platform=${PLATFORM}"
fi
for PHP_VERSION in "${BUILD_VERSIONS[@]}"; do
CURRENT=$((CURRENT + 1))
# Collect all tags for this PHP version
TAGS=()
TAGS+=("${IMAGE_NAME}:php${PHP_VERSION}")
# Laravel combo tags: laravel12-php8.4, etc.
LARAVEL_VERSIONS="${PHP_LARAVEL_MAP[$PHP_VERSION]}"
for LV in $LARAVEL_VERSIONS; do
TAGS+=("${IMAGE_NAME}:laravel${LV}-php${PHP_VERSION}")
# Convenience bare tag: laravelN → recommended PHP
if [ "${LARAVEL_RECOMMENDED_PHP[$LV]}" = "$PHP_VERSION" ]; then
TAGS+=("${IMAGE_NAME}:laravel${LV}")
fi
done
# latest tag
if [ "$PHP_VERSION" = "$LATEST_PHP" ]; then
TAGS+=("${IMAGE_NAME}:latest")
fi
TAG_ARGS=""
TAG_LIST=""
for T in "${TAGS[@]}"; do
TAG_ARGS="${TAG_ARGS} -t ${T}"
TAG_LIST="${TAG_LIST} ${T}\n"
done
echo ""
echo "==========================================="
echo " [${CURRENT}/${TOTAL}] Building PHP ${PHP_VERSION}"
echo "==========================================="
echo -e "Tags:\n${TAG_LIST}"
if docker build ${PLATFORM_ARG} \
--build-arg PHP_VERSION="${PHP_VERSION}" \
--build-arg NODE_MAJOR="${NODE_MAJOR}" \
${TAG_ARGS} \
. ; then
echo "[${CURRENT}/${TOTAL}] PHP ${PHP_VERSION} — OK"
else
echo "[${CURRENT}/${TOTAL}] PHP ${PHP_VERSION} — FAILED"
FAILED+=("$PHP_VERSION")
fi
done
# ---------------------------------------------------------------------------
# Summary
# ---------------------------------------------------------------------------
echo ""
echo "==========================================="
echo " Build complete"
echo "==========================================="
echo "Succeeded: $((TOTAL - ${#FAILED[@]}))/${TOTAL}"
if [ ${#FAILED[@]} -gt 0 ]; then
echo "Failed: ${FAILED[*]}"
exit 1
fi