docker-laravel/scripts/publish.sh

134 lines
4.1 KiB
Bash
Executable File

#!/usr/bin/env bash
# ===========================================================================
# publish.sh — Push all built images to a container registry
#
# Usage:
# REGISTRY=ghcr.io/myorg ./publish.sh # push all versions
# REGISTRY=ghcr.io/myorg ./publish.sh 8.4 # push only PHP 8.4 tags
# REGISTRY=ghcr.io/myorg ./publish.sh 8.3 8.4 # push PHP 8.3 + 8.4
#
# Environment:
# REGISTRY — registry prefix (REQUIRED, e.g. ghcr.io/myorg)
# IMAGE_NAME — image name (default: docker-laravel)
# DRY_RUN — set to 1 to print commands without executing
# ===========================================================================
set -euo pipefail
if [ -z "${REGISTRY:-}" ]; then
echo "ERROR: REGISTRY is required."
echo ""
echo "Usage: REGISTRY=ghcr.io/myorg ./publish.sh [php_versions...]"
echo ""
echo "Examples:"
echo " REGISTRY=ghcr.io/myorg ./publish.sh"
echo " REGISTRY=docker.io/myuser ./publish.sh 8.4"
exit 1
fi
IMAGE_NAME="${IMAGE_NAME:-docker-laravel}"
LOCAL="${IMAGE_NAME}"
REMOTE="${REGISTRY}/${IMAGE_NAME}"
# ---------------------------------------------------------------------------
# PHP → Laravel version mapping (must match build.sh)
# ---------------------------------------------------------------------------
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"
)
declare -A LARAVEL_RECOMMENDED_PHP=(
["9"]="8.1"
["10"]="8.3"
["11"]="8.4"
["12"]="8.5"
["13"]="8.5"
)
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 push
# ---------------------------------------------------------------------------
if [ $# -gt 0 ]; then
PUSH_VERSIONS=("$@")
else
PUSH_VERSIONS=("${ALL_PHP_VERSIONS[@]}")
fi
for v in "${PUSH_VERSIONS[@]}"; do
if [[ ! -v "PHP_LARAVEL_MAP[$v]" ]]; then
echo "ERROR: Unknown PHP version: $v"
exit 1
fi
done
# ---------------------------------------------------------------------------
# Helper
# ---------------------------------------------------------------------------
run() {
if [ "${DRY_RUN:-0}" = "1" ]; then
echo "[dry-run] $*"
else
"$@"
fi
}
tag_and_push() {
local LOCAL_TAG="$1"
local REMOTE_TAG="$2"
run docker tag "${LOCAL_TAG}" "${REMOTE_TAG}"
run docker push "${REMOTE_TAG}"
}
# ---------------------------------------------------------------------------
# Push
# ---------------------------------------------------------------------------
TOTAL=0
PUSHED=0
for PHP_VERSION in "${PUSH_VERSIONS[@]}"; do
echo ""
echo "==========================================="
echo " Pushing PHP ${PHP_VERSION}"
echo "==========================================="
# Base PHP tag
tag_and_push "${LOCAL}:php${PHP_VERSION}" "${REMOTE}:php${PHP_VERSION}"
TOTAL=$((TOTAL + 1)); PUSHED=$((PUSHED + 1))
# Laravel combo tags
LARAVEL_VERSIONS="${PHP_LARAVEL_MAP[$PHP_VERSION]}"
for LV in $LARAVEL_VERSIONS; do
tag_and_push "${LOCAL}:php${PHP_VERSION}" "${REMOTE}:laravel${LV}-php${PHP_VERSION}"
TOTAL=$((TOTAL + 1)); PUSHED=$((PUSHED + 1))
# Bare laravelN tag
if [ "${LARAVEL_RECOMMENDED_PHP[$LV]}" = "$PHP_VERSION" ]; then
tag_and_push "${LOCAL}:php${PHP_VERSION}" "${REMOTE}:laravel${LV}"
TOTAL=$((TOTAL + 1)); PUSHED=$((PUSHED + 1))
fi
done
# latest
if [ "$PHP_VERSION" = "$LATEST_PHP" ]; then
tag_and_push "${LOCAL}:php${PHP_VERSION}" "${REMOTE}:latest"
TOTAL=$((TOTAL + 1)); PUSHED=$((PUSHED + 1))
fi
done
# ---------------------------------------------------------------------------
# Summary
# ---------------------------------------------------------------------------
echo ""
echo "==========================================="
echo " Publish complete"
echo "==========================================="
echo "Pushed ${PUSHED} tags to ${REGISTRY}/${IMAGE_NAME}"