#!/bin/bash # CI/CD Script for Docker Build and Push # This script builds a Docker image and pushes it to a private container registry # ============================================================================= # Environment Variables (with default values) # ============================================================================= CONTAINER_REGISTRY_URL="${CONTAINER_REGISTRY_URL:-127.0.0.1}" CONTAINER_REGISTRY_USERNAME="${CONTAINER_REGISTRY_USERNAME:-username}" CONTAINER_REGISTRY_NAMESPACE="${CONTAINER_REGISTRY_NAMESPACE:-username}" CONTAINER_REGISTRY_PASSWORD="${CONTAINER_REGISTRY_PASSWORD:-password}" CONTAINER_IMAGE_NAME="${CONTAINER_IMAGE_NAME:-image-name}" CONTAINER_IMAGE_TAG="${CONTAINER_IMAGE_TAG:-latest}" # Application Environment Variables VITE_S3_ENDPOINT_BLOG="${VITE_S3_ENDPOINT_BLOG:-}" VITE_S3_BUCKET_BLOG="${VITE_S3_BUCKET_BLOG:-}" # ============================================================================= # Functions # ============================================================================= # Print help message print_help() { echo "Usage: $0 [OPTIONS]" echo "" echo "Options:" echo " build Build Docker image" echo " push Push Docker image to registry" echo " help Show this help message (default)" echo "" echo "Environment Variables:" echo " CONTAINER_REGISTRY_URL Registry URL (default: 127.0.0.1)" echo " CONTAINER_REGISTRY_USERNAME Registry username (default: username)" echo " CONTAINER_REGISTRY_NAMESPACE Registry namespace (default: username)" echo " CONTAINER_REGISTRY_PASSWORD Registry password (default: password)" echo " CONTAINER_IMAGE_NAME Image name (default: image-name)" echo " CONTAINER_IMAGE_TAG Image tag (default: latest)" echo " VITE_S3_ENDPOINT_BLOG S3 endpoint for blog images" echo " VITE_S3_BUCKET_BLOG S3 bucket for blog images" echo "" echo "Examples:" echo " $0 build" echo " $0 push" echo " CONTAINER_IMAGE_TAG=v1.0.0 $0 build" } # Build Docker image build_image() { # Construct the full image name with registry, namespace, name, and tag FULL_IMAGE_NAME="${CONTAINER_REGISTRY_URL}/${CONTAINER_REGISTRY_NAMESPACE}/${CONTAINER_IMAGE_NAME}:${CONTAINER_IMAGE_TAG}" echo "==========================================" echo "Building Docker Image" echo "==========================================" echo "Image: ${FULL_IMAGE_NAME}" echo "" # Prepare build args for S3 configuration BUILD_ARGS="" if [ -n "${VITE_S3_ENDPOINT_BLOG}" ]; then BUILD_ARGS="${BUILD_ARGS} --build-arg VITE_S3_ENDPOINT_BLOG=${VITE_S3_ENDPOINT_BLOG}" echo "S3 Endpoint (Blog): ${VITE_S3_ENDPOINT_BLOG}" fi if [ -n "${VITE_S3_BUCKET_BLOG}" ]; then BUILD_ARGS="${BUILD_ARGS} --build-arg VITE_S3_BUCKET_BLOG=${VITE_S3_BUCKET_BLOG}" echo "S3 Bucket (Blog): ${VITE_S3_BUCKET_BLOG}" fi echo "" # Build the Docker image using Dockerfile in current directory docker build ${BUILD_ARGS} -t "${FULL_IMAGE_NAME}" . # Check if build was successful if [ $? -eq 0 ]; then echo "" echo "✓ Build successful: ${FULL_IMAGE_NAME}" else echo "" echo "✗ Build failed" exit 1 fi } # Push Docker image to registry push_image() { # Construct the full image name FULL_IMAGE_NAME="${CONTAINER_REGISTRY_URL}/${CONTAINER_REGISTRY_NAMESPACE}/${CONTAINER_IMAGE_NAME}:${CONTAINER_IMAGE_TAG}" echo "==========================================" echo "Pushing Docker Image to Registry" echo "==========================================" echo "Registry: ${CONTAINER_REGISTRY_URL}" echo "Image: ${FULL_IMAGE_NAME}" echo "" # Login to the container registry echo "Logging in to registry..." echo "${CONTAINER_REGISTRY_PASSWORD}" | docker login "${CONTAINER_REGISTRY_URL}" \ -u "${CONTAINER_REGISTRY_USERNAME}" \ --password-stdin # Check if login was successful if [ $? -ne 0 ]; then echo "✗ Login failed" exit 1 fi echo "✓ Login successful" echo "" # Push the image to registry echo "Pushing image..." docker push "${FULL_IMAGE_NAME}" # Check if push was successful if [ $? -eq 0 ]; then echo "" echo "✓ Push successful: ${FULL_IMAGE_NAME}" else echo "" echo "✗ Push failed" exit 1 fi # Logout from registry docker logout "${CONTAINER_REGISTRY_URL}" } # ============================================================================= # Main Script Logic # ============================================================================= # If no arguments provided, show help if [ $# -eq 0 ]; then print_help exit 0 fi # Process command line arguments case "$1" in build) build_image ;; push) push_image ;; help|--help|-h) print_help ;; *) echo "Error: Unknown option '$1'" echo "" print_help exit 1 ;; esac