provisioning/scripts/build-images.nu

138 lines
5.3 KiB
Text
Raw Normal View History

#!/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!"
}