138 lines
5.3 KiB
Text
138 lines
5.3 KiB
Text
|
|
#!/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!"
|
||
|
|
}
|