provisioning-outreach/presentations/rust-laspalmas-250926/demos/04-cross-compile.sh

299 lines
No EOL
8.3 KiB
Bash
Executable file

#!/bin/bash
# Demo 4: Cross-Compilation Strategy - Rust Meetup 2025
# Demostración de capacidades multi-arquitectura
set -euo pipefail
echo "🔧 Demo 4: Cross-Compilation Strategy"
echo "====================================="
# Colores para output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
log() {
echo -e "${GREEN}[$(date +'%H:%M:%S')]${NC} $1"
}
warn() {
echo -e "${YELLOW}[$(date +'%H:%M:%S')] WARN:${NC} $1"
}
error() {
echo -e "${RED}[$(date +'%H:%M:%S')] ERROR:${NC} $1"
}
# Parte 1: Auto-detección de arquitectura
echo ""
log "Parte 1: Auto-detección de arquitectura"
echo "========================================"
detect_arch() {
local arch=$(uname -m)
case $arch in
x86_64)
echo "x86_64-unknown-linux-gnu"
;;
aarch64|arm64)
echo "aarch64-unknown-linux-gnu"
;;
armv7l)
echo "armv7-unknown-linux-gnueabihf"
;;
*)
echo "unsupported"
;;
esac
}
CURRENT_ARCH=$(detect_arch)
log "Arquitectura detectada: $CURRENT_ARCH"
log "Sistema: $(uname -s) $(uname -m)"
# Mostrar targets soportados
echo ""
log "Targets de compilación soportados:"
SUPPORTED_TARGETS=(
"x86_64-unknown-linux-gnu"
"aarch64-unknown-linux-gnu"
"x86_64-apple-darwin"
"aarch64-apple-darwin"
"x86_64-pc-windows-gnu"
)
for target in "${SUPPORTED_TARGETS[@]}"; do
if [ "$target" == "$CURRENT_ARCH" ]; then
echo "$target (actual)"
else
echo " 📦 $target"
fi
done
# Parte 2: Instalación de cross-compilation tools
echo ""
log "Parte 2: Setup de herramientas cross-compilation"
echo "================================================"
echo "$ cargo install cross --git https://github.com/cross-rs/cross"
log "✅ Cross-compilation tool instalado"
echo "$ rustup target add aarch64-unknown-linux-gnu"
echo "$ rustup target add x86_64-unknown-linux-gnu"
log "✅ Targets de Rust añadidos"
# Parte 3: Configuración para herramientas Rust
echo ""
log "Parte 3: Configuración para herramientas del ecosistema"
echo "======================================================"
# Simular Cross.toml configuration
cat << 'EOF'
📄 Cross.toml configuración:
```toml
[build.env]
passthrough = [
"CARGO_HOME",
"CARGO_TARGET_DIR",
]
[target.aarch64-unknown-linux-gnu]
dockerfile = "./docker/Dockerfile.aarch64"
image = "rust-cross:aarch64"
[target.x86_64-unknown-linux-gnu]
dockerfile = "./docker/Dockerfile.x86_64"
image = "rust-cross:x86_64"
```
EOF
# Parte 4: Build script inteligente
echo ""
log "Parte 4: Build script multi-arquitectura"
echo "========================================"
build_for_target() {
local target=$1
local component=$2
log "Compilando $component para $target..."
# Simular proceso de build
case $component in
"youki")
echo " 🦀 Compilando youki (OCI runtime)..."
echo " 📦 Features: seccomp, systemd, v2"
;;
"cosmian-kms-client")
echo " 🔐 Compilando cliente Cosmian KMS..."
echo " 📦 Features: tls, async-tokio"
;;
"polkadot-node")
echo " 🕸️ Compilando nodo Polkadot..."
echo " 📦 Features: runtime-benchmarks"
;;
esac
sleep 1
log "$component compilado para $target"
}
# Simular builds para diferentes componentes
RUST_COMPONENTS=("youki" "cosmian-kms-client" "polkadot-node")
for component in "${RUST_COMPONENTS[@]}"; do
build_for_target "x86_64-unknown-linux-gnu" "$component"
build_for_target "aarch64-unknown-linux-gnu" "$component"
done
# Parte 5: Packaging inteligente
echo ""
log "Parte 5: Packaging multi-arquitectura"
echo "===================================="
package_release() {
local target=$1
local version=${2:-"v1.0.0"}
log "Empaquetando release para $target..."
# Simular estructura de package
echo " 📁 provisioning-$version-$target/"
echo " ├── bin/"
echo " │ ├── provisioning"
echo " │ ├── youki"
echo " │ └── cosmian-kms-client"
echo " ├── lib/"
echo " │ └── nu_plugins/"
echo " ├── templates/"
echo " └── install.sh"
echo " 📦 Creando tarball..."
echo " ✅ provisioning-$version-$target.tar.gz"
}
for target in "x86_64-unknown-linux-gnu" "aarch64-unknown-linux-gnu"; do
package_release "$target" "v1.0.0"
done
# Parte 6: Deploy automático según arquitectura
echo ""
log "Parte 6: Deploy inteligente por arquitectura"
echo "============================================"
simulate_deploy() {
local server_ip=$1
local server_arch=$2
log "Desplegando en servidor $server_ip ($server_arch)..."
# Detectar arquitectura del servidor (simulado)
echo " 🔍 Detectando arquitectura del servidor..."
echo " 📡 SSH: ssh user@$server_ip 'uname -m'"
echo " 📋 Resultado: $server_arch"
# Seleccionar package correcto
local package_name="provisioning-v1.0.0-$server_arch-unknown-linux-gnu.tar.gz"
echo " 📦 Seleccionando package: $package_name"
# Simular deploy
echo " 🚀 Transfiriendo archivos..."
echo " 📥 scp $package_name user@$server_ip:/tmp/"
echo " 🔧 Instalando remotamente..."
echo " ✅ Deploy completado"
}
# Simular deploy en diferentes arquitecturas
simulate_deploy "203.0.113.10" "x86_64"
simulate_deploy "203.0.113.11" "aarch64"
simulate_deploy "203.0.113.12" "x86_64"
# Parte 7: Ventajas del enfoque
echo ""
log "Parte 7: Ventajas de cross-compilation nativa"
echo "=============================================="
echo "💰 Costos optimizados:"
echo " - ARM instances ~20% más baratas que x86"
echo " - Graviton3: $0.04/hora vs t3.medium: $0.05/hora"
echo " - Ahorro anual: ~$87 por instancia"
echo ""
echo "⚡ Performance:"
echo " - Binarios nativos vs containers emulados"
echo " - youki en ARM: ~15% menos overhead vs Docker"
echo " - Polkadot: ~25% mejor throughput en Graviton"
echo ""
echo "🌐 Alcance:"
echo " - Edge computing: ARM dominante en IoT"
echo " - Mobile development: aarch64 nativo"
echo " - Apple Silicon: Mejor developer experience"
echo ""
echo "🔧 Operaciones:"
echo " - Un solo build system para todo"
echo " - Deploy automático según arquitectura destino"
echo " - Testing unificado cross-platform"
# Parte 8: Comparación con alternativas
echo ""
log "Parte 8: vs. Alternativas tradicionales"
echo "======================================="
echo "📊 Comparación con Docker multi-arch:"
echo ""
printf "%-20s %-15s %-15s\n" "Aspecto" "Cross-compile" "Docker buildx"
printf "%-20s %-15s %-15s\n" "Build time" "~3 min" "~15 min"
printf "%-20s %-15s %-15s\n" "Binary size" "~25MB" "~250MB"
printf "%-20s %-15s %-15s\n" "Runtime overhead" "0%" "5-10%"
printf "%-20s %-15s %-15s\n" "Cold start" "Inmediato" "~2-3s"
printf "%-20s %-15s %-15s\n" "Complexity" "Media" "Alta"
# Parte 9: Script de automatización
echo ""
log "Parte 9: Script de automatización completo"
echo "=========================================="
cat << 'EOF'
#!/bin/bash
# build-all.sh - Build script completo
TARGETS=("x86_64-unknown-linux-gnu" "aarch64-unknown-linux-gnu")
COMPONENTS=("youki" "cosmian-kms-client" "polkadot-node")
for target in "${TARGETS[@]}"; do
for component in "${COMPONENTS[@]}"; do
echo "Building $component for $target..."
cross build --release --target "$target" \
--manifest-path "tools/$component/Cargo.toml"
done
# Package release
mkdir -p "dist/$target"
cp target/$target/release/* "dist/$target/"
tar czf "provisioning-$target.tar.gz" -C "dist/$target" .
done
echo "✅ All builds completed!"
EOF
echo ""
log "🎯 Demo cross-compilation completada!"
echo ""
echo "⭐ Capacidades demostradas:"
echo " - Auto-detección de arquitectura"
echo " - Build multi-target automatizado"
echo " - Packaging inteligente"
echo " - Deploy automático por arquitectura"
echo " - Optimizaciones de costo y performance"
echo ""
echo "🚀 Para implementar en tu proyecto:"
echo "1. cargo install cross"
echo "2. rustup target add aarch64-unknown-linux-gnu"
echo "3. Configurar Cross.toml"
echo "4. Crear scripts de automatización"
echo "5. ¡Disfrutar de deploys multi-arch!"