Curatenie referinte pre-livrare: - inlocuit IP intern 10.11.10.18 cu hostname didi.integrare.local (extensie, docker-compose, .env.example) - inlocuit domeniu vechi didi365.eu cu didi.integrare.local (scripturi build/audit) - redenumit identificatorul aplicatiei Android eu.didi365.mobile -> didi.mobile Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
223 lines
6 KiB
Bash
223 lines
6 KiB
Bash
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
|
|
# ============================================================================
|
|
# DIDI Frontend - Build Script
|
|
# Checks prerequisites, builds Docker production image
|
|
# ============================================================================
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
WEB_DIR="$SCRIPT_DIR/web"
|
|
IMAGE_NAME="${DIDI_IMAGE_NAME:-didi-frontend}"
|
|
IMAGE_TAG="${DIDI_IMAGE_TAG:-latest}"
|
|
VITE_API_URL="${VITE_API_URL:-}"
|
|
|
|
# -- Colors ------------------------------------------------------------------
|
|
RED='\033[0;31m'
|
|
GREEN='\033[0;32m'
|
|
YELLOW='\033[1;33m'
|
|
CYAN='\033[0;36m'
|
|
BOLD='\033[1m'
|
|
NC='\033[0m'
|
|
|
|
log() { echo -e "${GREEN}[OK]${NC} $*"; }
|
|
warn() { echo -e "${YELLOW}[WARN]${NC} $*"; }
|
|
err() { echo -e "${RED}[ERR]${NC} $*" >&2; }
|
|
step() { echo -e "\n${CYAN}==> $*${NC}"; }
|
|
|
|
# -- Usage -------------------------------------------------------------------
|
|
usage() {
|
|
cat <<EOF
|
|
Usage: $(basename "$0") [OPTIONS]
|
|
|
|
Build the DIDI frontend Docker image.
|
|
|
|
Options:
|
|
--api-url URL Set VITE_API_URL (default: reads from .env.local)
|
|
--image NAME Docker image name (default: didi-frontend)
|
|
--tag TAG Docker image tag (default: latest)
|
|
--skip-verify Skip smoke test after build
|
|
--dry-run Show what would be done without doing it
|
|
-h, --help Show this help
|
|
|
|
Environment variables:
|
|
VITE_API_URL Same as --api-url
|
|
DIDI_IMAGE_NAME Same as --image
|
|
DIDI_IMAGE_TAG Same as --tag
|
|
|
|
Examples:
|
|
./build.sh
|
|
./build.sh --api-url https://didi.integrare.local
|
|
./build.sh --image didi-frontend --tag v1.2.3
|
|
./build.sh --skip-verify --dry-run
|
|
EOF
|
|
exit 0
|
|
}
|
|
|
|
# -- Parse args --------------------------------------------------------------
|
|
SKIP_VERIFY=false
|
|
DRY_RUN=false
|
|
|
|
while [[ $# -gt 0 ]]; do
|
|
case "$1" in
|
|
--api-url) VITE_API_URL="$2"; shift 2 ;;
|
|
--image) IMAGE_NAME="$2"; shift 2 ;;
|
|
--tag) IMAGE_TAG="$2"; shift 2 ;;
|
|
--skip-verify) SKIP_VERIFY=true; shift ;;
|
|
--dry-run) DRY_RUN=true; shift ;;
|
|
-h|--help) usage ;;
|
|
*) err "Unknown option: $1"; usage ;;
|
|
esac
|
|
done
|
|
|
|
# -- Prerequisites -----------------------------------------------------------
|
|
check_prerequisites() {
|
|
step "Checking prerequisites"
|
|
local ok=true
|
|
|
|
# Docker installed
|
|
if command -v docker &>/dev/null; then
|
|
log "Docker: $(docker --version 2>/dev/null | head -1)"
|
|
else
|
|
err "Docker not installed. https://docs.docker.com/get-docker/"
|
|
ok=false
|
|
fi
|
|
|
|
# Docker daemon running
|
|
if command -v docker &>/dev/null; then
|
|
if docker info &>/dev/null; then
|
|
log "Docker daemon: running"
|
|
else
|
|
err "Docker daemon not running. Try: sudo systemctl start docker"
|
|
ok=false
|
|
fi
|
|
fi
|
|
|
|
# Required files
|
|
for f in package.json Dockerfile nginx.conf index.html; do
|
|
if [[ -f "$WEB_DIR/$f" ]]; then
|
|
log "$f: found"
|
|
else
|
|
err "$f not found in $WEB_DIR"
|
|
ok=false
|
|
fi
|
|
done
|
|
|
|
# src/ directory
|
|
if [[ -d "$WEB_DIR/src" ]]; then
|
|
log "src/: found"
|
|
else
|
|
err "src/ directory not found"
|
|
ok=false
|
|
fi
|
|
|
|
if ! $ok; then
|
|
err "Prerequisites check failed."
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
# -- Resolve API URL ---------------------------------------------------------
|
|
resolve_api_url() {
|
|
if [[ -z "$VITE_API_URL" && -f "$WEB_DIR/.env.local" ]]; then
|
|
VITE_API_URL=$(grep -E '^VITE_API_URL=' "$WEB_DIR/.env.local" 2>/dev/null | cut -d'=' -f2- || true)
|
|
fi
|
|
|
|
if [[ -n "$VITE_API_URL" ]]; then
|
|
log "VITE_API_URL = $VITE_API_URL"
|
|
else
|
|
warn "VITE_API_URL is empty (same-origin mode)"
|
|
fi
|
|
}
|
|
|
|
# -- Docker build ------------------------------------------------------------
|
|
docker_build() {
|
|
step "Building Docker image: ${IMAGE_NAME}:${IMAGE_TAG}"
|
|
|
|
local build_args=()
|
|
if [[ -n "$VITE_API_URL" ]]; then
|
|
build_args+=(--build-arg "VITE_API_URL=${VITE_API_URL}")
|
|
fi
|
|
|
|
if $DRY_RUN; then
|
|
warn "[dry-run] docker build ${build_args[*]+"${build_args[*]}"} -t ${IMAGE_NAME}:${IMAGE_TAG} $WEB_DIR"
|
|
return
|
|
fi
|
|
|
|
docker build \
|
|
${build_args[@]+"${build_args[@]}"} \
|
|
-t "${IMAGE_NAME}:${IMAGE_TAG}" \
|
|
"$WEB_DIR"
|
|
|
|
log "Image built successfully"
|
|
|
|
step "Image details"
|
|
docker images "${IMAGE_NAME}:${IMAGE_TAG}" --format "table {{.Repository}}\t{{.Tag}}\t{{.Size}}\t{{.CreatedAt}}"
|
|
}
|
|
|
|
# -- Verify ------------------------------------------------------------------
|
|
verify_image() {
|
|
step "Verifying image (smoke test)"
|
|
|
|
if $DRY_RUN; then
|
|
warn "[dry-run] Would start temp container, check /health, remove it"
|
|
return
|
|
fi
|
|
|
|
local cname="didi-verify-$$"
|
|
|
|
docker run -d --name "$cname" -p 0:80 "${IMAGE_NAME}:${IMAGE_TAG}" >/dev/null 2>&1
|
|
local port
|
|
port=$(docker port "$cname" 80 | head -1 | cut -d: -f2)
|
|
|
|
local retries=10
|
|
local healthy=false
|
|
while (( retries > 0 )); do
|
|
if curl -sf "http://localhost:${port}/health" >/dev/null 2>&1; then
|
|
healthy=true
|
|
break
|
|
fi
|
|
sleep 0.5
|
|
(( retries-- ))
|
|
done
|
|
|
|
docker rm -f "$cname" >/dev/null 2>&1
|
|
|
|
if $healthy; then
|
|
log "Health check PASSED"
|
|
else
|
|
warn "Health check FAILED — image built but nginx may have issues"
|
|
fi
|
|
}
|
|
|
|
# -- Summary -----------------------------------------------------------------
|
|
summary() {
|
|
echo ""
|
|
echo -e " ${BOLD}Build complete${NC}"
|
|
echo ""
|
|
echo " Image: ${IMAGE_NAME}:${IMAGE_TAG}"
|
|
echo " API: ${VITE_API_URL:-<same-origin>}"
|
|
echo ""
|
|
echo " Run: docker run -d -p 8080:80 ${IMAGE_NAME}:${IMAGE_TAG}"
|
|
echo " Test: curl http://localhost:8080/health"
|
|
echo ""
|
|
}
|
|
|
|
# -- Main --------------------------------------------------------------------
|
|
main() {
|
|
echo ""
|
|
echo -e " ${BOLD}DIDI Frontend Build${NC}"
|
|
echo ""
|
|
|
|
check_prerequisites
|
|
resolve_api_url
|
|
docker_build
|
|
|
|
if ! $SKIP_VERIFY; then
|
|
verify_image
|
|
fi
|
|
|
|
summary
|
|
}
|
|
|
|
main
|