#!/usr/bin/env nu # Build Docker images for provisioning platform # Usage: ./build-images.nu [service...] # ./build-images.nu # Build all services # ./build-images.nu orchestrator # Build orchestrator only # ./build-images.nu orchestrator control-center mcp-server # Multiple services use std log def main [...services: string] { let provisioning_root = (pwd) # Define all available services and their Dockerfiles let all_services = { orchestrator: { dockerfile: "provisioning/platform/crates/orchestrator/Dockerfile", tag: "provisioning-orchestrator:latest", context: "provisioning/platform", description: "Orchestrator - workflow engine and task queue", }, control-center: { dockerfile: "provisioning/platform/crates/control-center/Dockerfile", tag: "provisioning-control-center:latest", context: "provisioning/platform", description: "Control Center - policy and RBAC management", }, mcp-server: { dockerfile: "provisioning/platform/crates/mcp-server/Dockerfile", tag: "provisioning-mcp-server:latest", context: "provisioning/platform", description: "MCP Server - AI/LLM integration", }, extension-registry: { dockerfile: "provisioning/platform/crates/extension-registry/Dockerfile", tag: "provisioning-extension-registry:latest", context: "provisioning/platform", description: "Extension Registry - plugin management", }, rag: { dockerfile: "provisioning/platform/crates/rag/docker/Dockerfile", tag: "provisioning-rag:latest", context: "provisioning/platform", description: "RAG Service - retrieval augmented generation", }, provisioning-daemon: { dockerfile: "provisioning/platform/crates/provisioning-daemon/Dockerfile", tag: "provisioning-daemon:latest", context: "provisioning/platform", description: "Provisioning Daemon - Nushell execution and config rendering", }, } # Determine which services to build let target_services = if ($services | is-empty) { ["orchestrator", "control-center", "provisioning-daemon", "mcp-server", "extension-registry", "rag"] } else { $services } # Validate services for service in $target_services { try { $all_services | get $service | ignore } catch { log error $"Unknown service: $service" log error $"Available services:" log error $" • orchestrator - Orchestrator - workflow engine and task queue" log error $" • control-center - Control Center - policy and RBAC management" log error $" • mcp-server - MCP Server - AI/LLM integration" log error $" • extension-registry - Extension Registry - plugin management" log error $" • rag - RAG Service - retrieval augmented generation" log error $" • provisioning-daemon - Provisioning Daemon - Nushell execution and config rendering" error make { msg: "Invalid service specified" } } } log info "🐳 Building Docker images for provisioning platform..." log info "" log info "Services to build:" for service in $target_services { let svc_config = $all_services | get $service log info $" • ($service) - ($svc_config.description)" } log info "" # Build each service let build_results = ( $target_services | each { |service| let svc_cfg = ($all_services | get $service) let dockerfile = $"($provisioning_root)/($svc_cfg.dockerfile)" let tag = $svc_cfg.tag let context = $"($provisioning_root)/($svc_cfg.context)" log info $"📦 Building ($service)..." log info $" Dockerfile: ($svc_cfg.dockerfile)" log info $" Tag: ($tag)" log info $" Context: ($svc_cfg.context)" let build_result = (do { ^docker build -f $dockerfile -t $tag $context } | complete) if $build_result.exit_code == 0 { log info $"✅ ($service) built successfully" { service: $service, status: "success", tag: $tag } } else { log error $"❌ ($service) build failed" log error $"Error: ($build_result.stderr)" { service: $service, status: "failed", tag: $tag, error: $build_result.stderr } } } ) # Summary log info "" log info "📊 Build Summary:" let successful = ($build_results | where { $in.status == "success" } | length) let failed = ($build_results | where { $in.status == "failed" } | length) $build_results | each { |result| if $result.status == "success" { log info $" ✅ ($result.service) → ($result.tag)" } else { log error $" ❌ ($result.service) - FAILED" } } log info "" log info $" Total: ($successful) successful, ($failed) failed" if $failed > 0 { error make { msg: "Some builds failed" } } log info "✨ All images built successfully!" }