#!/bin/bash set -e DOCKER_PATH="/Applications/Docker.app/Contents/Resources/bin/docker" USERNAME="franklioxygen" # Default build arguments (can be overridden by environment variables) VITE_API_URL=${VITE_API_URL:-"http://localhost:5551/api"} VITE_BACKEND_URL=${VITE_BACKEND_URL:-"http://localhost:5551"} # Define platforms to build # Commented out arm64 as requested PLATFORMS=("linux/amd64") # "linux/arm64") # Tag definitions for TEST BACKEND_TEST_AMD64="$USERNAME/mytube:backend-test-amd64" # BACKEND_TEST_ARM64="$USERNAME/mytube:backend-test-arm64" FRONTEND_TEST_AMD64="$USERNAME/mytube:frontend-test-amd64" # FRONTEND_TEST_ARM64="$USERNAME/mytube:frontend-test-arm64" # Ensure Docker is running echo "๐Ÿ” Checking if Docker is running..." $DOCKER_PATH ps > /dev/null 2>&1 || { echo "โŒ Docker is not running. Please start Docker and try again."; exit 1; } echo "โœ… Docker is running!" # Function to build backend for a specific platform build_backend() { local platform=$1 local tag=$2 echo "๐Ÿ—๏ธ Building backend for $platform..." # Run build from root context to allow copying frontend files # Use -f backend/Dockerfile to specify the Dockerfile path $DOCKER_PATH build --platform $platform -f backend/Dockerfile -t $tag . echo "๐Ÿš€ Pushing backend image: $tag" $DOCKER_PATH push $tag echo "๐Ÿงน Cleaning up local backend image: $tag" $DOCKER_PATH rmi $tag } # Function to build frontend for a specific platform build_frontend() { local platform=$1 local tag=$2 echo "๐Ÿ—๏ธ Building frontend for $platform..." cd frontend $DOCKER_PATH build --platform $platform \ --build-arg VITE_API_URL="$VITE_API_URL" \ --build-arg VITE_BACKEND_URL="$VITE_BACKEND_URL" \ -t $tag . echo "๐Ÿš€ Pushing frontend image: $tag" $DOCKER_PATH push $tag echo "๐Ÿงน Cleaning up local frontend image: $tag" $DOCKER_PATH rmi $tag cd .. } # Function to create and push manifest list # create_and_push_manifest() { # local manifest_tag=$1 # local image_amd64=$2 # local image_arm64=$3 # # echo "๐Ÿ“œ Creating manifest list: $manifest_tag" # # Try to remove existing manifest first to avoid errors # $DOCKER_PATH manifest rm $manifest_tag 2>/dev/null || true # # if ! $DOCKER_PATH manifest create $manifest_tag \ # --amend $image_amd64 \ # --amend $image_arm64 2>/dev/null; then # echo "โš ๏ธ Failed to create manifest list: $manifest_tag" # echo " This might happen if the images are not yet available in the registry." # echo " The platform-specific images are still available individually." # return 1 # fi # # echo "๐Ÿš€ Pushing manifest list: $manifest_tag" # if ! $DOCKER_PATH manifest push $manifest_tag; then # echo "โš ๏ธ Failed to push manifest list: $manifest_tag" # $DOCKER_PATH manifest rm $manifest_tag 2>/dev/null || true # return 1 # fi # # echo "๐Ÿงน Cleaning up local manifest: $manifest_tag" # $DOCKER_PATH manifest rm $manifest_tag 2>/dev/null || true # return 0 # } # Build for each platform echo "๐Ÿ—๏ธ Building TEST images for multiple platforms with separate tags..." echo "Platforms: ${PLATFORMS[*]}" echo "" # Build backend for all platforms for platform in "${PLATFORMS[@]}"; do if [ "$platform" = "linux/amd64" ]; then build_backend "$platform" "$BACKEND_TEST_AMD64" elif [ "$platform" = "linux/arm64" ]; then # build_backend "$platform" "$BACKEND_TEST_ARM64" echo "Skipping arm64" fi done echo "" # Build frontend for all platforms for platform in "${PLATFORMS[@]}"; do if [ "$platform" = "linux/amd64" ]; then build_frontend "$platform" "$FRONTEND_TEST_AMD64" elif [ "$platform" = "linux/arm64" ]; then # build_frontend "$platform" "$FRONTEND_TEST_ARM64" echo "Skipping arm64" fi done echo "" # Create and push manifests echo "๐Ÿ“ฆ Tagging and pushing main test tags (amd64)..." # MANIFEST_ERRORS=0 # Backend # if ! create_and_push_manifest "$USERNAME/mytube:backend-test" "$BACKEND_TEST_AMD64" "$BACKEND_TEST_ARM64"; then # MANIFEST_ERRORS=$((MANIFEST_ERRORS + 1)) # fi echo "๐Ÿš€ Tagging and pushing backend test tag..." $DOCKER_PATH pull "$BACKEND_TEST_AMD64" # Ensure we have it locally if it was cleaned up (though build cleaned it up, so we need to re-tag BEFORE cleanup or pull it again. Wait, build func cleans up. # Ah, the build function cleans up: `$DOCKER_PATH rmi $tag` # So $BACKEND_TEST_AMD64 is GONE locally. # We need to re-pull it or NOT clean it up in the build function if we want to re-tag it. # OR, we just tag it remotely? No, docker tag is local. # We must pull it again or change the build function. # Changing the build function is cleaner but risky if I don't want to change the structure too much. # But calling pull is safe. $DOCKER_PATH pull "$BACKEND_TEST_AMD64" $DOCKER_PATH tag "$BACKEND_TEST_AMD64" "$USERNAME/mytube:backend-test" $DOCKER_PATH push "$USERNAME/mytube:backend-test" $DOCKER_PATH rmi "$USERNAME/mytube:backend-test" # Frontend # if ! create_and_push_manifest "$USERNAME/mytube:frontend-test" "$FRONTEND_TEST_AMD64" "$FRONTEND_TEST_ARM64"; then # MANIFEST_ERRORS=$((MANIFEST_ERRORS + 1)) # fi echo "๐Ÿš€ Tagging and pushing frontend test tag..." $DOCKER_PATH pull "$FRONTEND_TEST_AMD64" $DOCKER_PATH tag "$FRONTEND_TEST_AMD64" "$USERNAME/mytube:frontend-test" $DOCKER_PATH push "$USERNAME/mytube:frontend-test" $DOCKER_PATH rmi "$USERNAME/mytube:frontend-test" # if [ $MANIFEST_ERRORS -gt 0 ]; then # echo "" # echo "โš ๏ธ Some manifest lists failed to create/push ($MANIFEST_ERRORS error(s))" # echo " Platform-specific images are still available and can be used directly." # fi echo "" echo "โœ… Successfully built and pushed TEST images (amd64 only) to Docker Hub!" echo "" echo "Images:" echo " - $USERNAME/mytube:backend-test (amd64)" echo " - $USERNAME/mytube:frontend-test (amd64)" echo "" echo "Platform-specific images:" echo " Backend:" echo " - $BACKEND_TEST_AMD64" # echo " - $BACKEND_TEST_ARM64" echo " Frontend:" echo " - $FRONTEND_TEST_AMD64" # echo " - $FRONTEND_TEST_ARM64"