mirror of
https://github.com/johndoe6345789/metabuilder.git
synced 2026-04-25 06:14:59 +00:00
- codegen: Low-code React app with JSON-driven component system - packagerepo: Schema-driven package repository with backend/frontend - postgres: Next.js app with Drizzle ORM and PostgreSQL Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
225 lines
6.3 KiB
Bash
225 lines
6.3 KiB
Bash
#!/bin/bash
|
|
|
|
# QEMU Multi-Architecture Validation Script
|
|
# This script validates that QEMU is properly configured and multi-arch builds work
|
|
|
|
set -e
|
|
|
|
echo "🔍 QEMU Multi-Architecture Validation"
|
|
echo "======================================"
|
|
echo ""
|
|
|
|
# Colors
|
|
RED='\033[0;31m'
|
|
GREEN='\033[0;32m'
|
|
YELLOW='\033[1;33m'
|
|
BLUE='\033[0;34m'
|
|
NC='\033[0m'
|
|
|
|
PASSED=0
|
|
FAILED=0
|
|
|
|
# Function to print test results
|
|
print_result() {
|
|
if [ $1 -eq 0 ]; then
|
|
echo -e "${GREEN}✅ PASS${NC}: $2"
|
|
((PASSED++))
|
|
else
|
|
echo -e "${RED}❌ FAIL${NC}: $2"
|
|
((FAILED++))
|
|
fi
|
|
}
|
|
|
|
echo -e "${BLUE}Step 1: Checking Docker installation${NC}"
|
|
echo "--------------------------------------"
|
|
|
|
if command -v docker &> /dev/null; then
|
|
DOCKER_VERSION=$(docker --version)
|
|
print_result 0 "Docker is installed: $DOCKER_VERSION"
|
|
else
|
|
print_result 1 "Docker is not installed"
|
|
exit 1
|
|
fi
|
|
|
|
echo ""
|
|
echo -e "${BLUE}Step 2: Checking Docker Buildx${NC}"
|
|
echo "--------------------------------------"
|
|
|
|
if docker buildx version &> /dev/null; then
|
|
BUILDX_VERSION=$(docker buildx version)
|
|
print_result 0 "Docker Buildx is available: $BUILDX_VERSION"
|
|
else
|
|
print_result 1 "Docker Buildx is not available"
|
|
echo "Installing Docker Buildx..."
|
|
docker buildx install
|
|
fi
|
|
|
|
echo ""
|
|
echo -e "${BLUE}Step 3: Setting up QEMU${NC}"
|
|
echo "--------------------------------------"
|
|
|
|
echo "Installing QEMU user static binaries..."
|
|
if docker run --rm --privileged multiarch/qemu-user-static --reset -p yes > /dev/null 2>&1; then
|
|
print_result 0 "QEMU installation successful"
|
|
else
|
|
print_result 1 "QEMU installation failed"
|
|
fi
|
|
|
|
echo ""
|
|
echo -e "${BLUE}Step 4: Checking QEMU binaries${NC}"
|
|
echo "--------------------------------------"
|
|
|
|
if docker run --rm multiarch/qemu-user-static --version > /dev/null 2>&1; then
|
|
QEMU_VERSION=$(docker run --rm multiarch/qemu-user-static --version | head -n 1)
|
|
print_result 0 "QEMU binaries are functional: $QEMU_VERSION"
|
|
else
|
|
print_result 1 "QEMU binaries not accessible"
|
|
fi
|
|
|
|
echo ""
|
|
echo -e "${BLUE}Step 5: Setting up Buildx builder${NC}"
|
|
echo "--------------------------------------"
|
|
|
|
if docker buildx inspect multiarch &> /dev/null; then
|
|
echo "Builder 'multiarch' already exists"
|
|
docker buildx use multiarch
|
|
print_result 0 "Using existing builder 'multiarch'"
|
|
else
|
|
if docker buildx create --name multiarch --driver docker-container --use > /dev/null 2>&1; then
|
|
print_result 0 "Created new builder 'multiarch'"
|
|
else
|
|
print_result 1 "Failed to create builder"
|
|
fi
|
|
fi
|
|
|
|
if docker buildx inspect --bootstrap > /dev/null 2>&1; then
|
|
print_result 0 "Builder bootstrap successful"
|
|
else
|
|
print_result 1 "Builder bootstrap failed"
|
|
fi
|
|
|
|
echo ""
|
|
echo -e "${BLUE}Step 6: Checking supported platforms${NC}"
|
|
echo "--------------------------------------"
|
|
|
|
PLATFORMS=$(docker buildx inspect multiarch | grep "Platforms:" | cut -d: -f2)
|
|
echo "Available platforms:$PLATFORMS"
|
|
|
|
if echo "$PLATFORMS" | grep -q "linux/amd64"; then
|
|
print_result 0 "AMD64 platform supported"
|
|
else
|
|
print_result 1 "AMD64 platform not supported"
|
|
fi
|
|
|
|
if echo "$PLATFORMS" | grep -q "linux/arm64"; then
|
|
print_result 0 "ARM64 platform supported"
|
|
else
|
|
print_result 1 "ARM64 platform not supported"
|
|
fi
|
|
|
|
echo ""
|
|
echo -e "${BLUE}Step 7: Testing multi-arch build (dry run)${NC}"
|
|
echo "--------------------------------------"
|
|
|
|
# Create a simple test Dockerfile
|
|
TEST_DIR=$(mktemp -d)
|
|
cat > "$TEST_DIR/Dockerfile" << 'EOF'
|
|
FROM alpine:latest
|
|
RUN echo "Architecture: $(uname -m)"
|
|
CMD ["echo", "Multi-arch test successful"]
|
|
EOF
|
|
|
|
echo "Testing build for linux/amd64..."
|
|
if docker buildx build --platform linux/amd64 -t test-qemu:amd64 "$TEST_DIR" > /dev/null 2>&1; then
|
|
print_result 0 "AMD64 build successful"
|
|
else
|
|
print_result 1 "AMD64 build failed"
|
|
fi
|
|
|
|
echo "Testing build for linux/arm64..."
|
|
if docker buildx build --platform linux/arm64 -t test-qemu:arm64 "$TEST_DIR" > /dev/null 2>&1; then
|
|
print_result 0 "ARM64 build successful (cross-compiled)"
|
|
else
|
|
print_result 1 "ARM64 build failed"
|
|
fi
|
|
|
|
echo "Testing multi-platform build..."
|
|
if docker buildx build --platform linux/amd64,linux/arm64 -t test-qemu:multi "$TEST_DIR" > /dev/null 2>&1; then
|
|
print_result 0 "Multi-platform build successful"
|
|
else
|
|
print_result 1 "Multi-platform build failed"
|
|
fi
|
|
|
|
# Cleanup
|
|
rm -rf "$TEST_DIR"
|
|
|
|
echo ""
|
|
echo -e "${BLUE}Step 8: Validating CI/CD configurations${NC}"
|
|
echo "--------------------------------------"
|
|
|
|
# Check GitHub Actions
|
|
if grep -q "docker/setup-qemu-action" .github/workflows/ci.yml 2>/dev/null; then
|
|
print_result 0 "GitHub Actions CI has QEMU configured"
|
|
else
|
|
print_result 1 "GitHub Actions CI missing QEMU"
|
|
fi
|
|
|
|
if grep -q "docker/setup-qemu-action" .github/workflows/release.yml 2>/dev/null; then
|
|
print_result 0 "GitHub Actions Release has QEMU configured"
|
|
else
|
|
print_result 1 "GitHub Actions Release missing QEMU"
|
|
fi
|
|
|
|
# Check CircleCI
|
|
if grep -q "multiarch/qemu-user-static" .circleci/config.yml 2>/dev/null; then
|
|
print_result 0 "CircleCI has QEMU configured"
|
|
else
|
|
print_result 1 "CircleCI missing QEMU"
|
|
fi
|
|
|
|
# Check GitLab CI
|
|
if grep -q "multiarch/qemu-user-static" .gitlab-ci.yml 2>/dev/null; then
|
|
print_result 0 "GitLab CI has QEMU configured"
|
|
else
|
|
print_result 1 "GitLab CI missing QEMU"
|
|
fi
|
|
|
|
# Check Jenkins
|
|
if grep -q "multiarch/qemu-user-static" Jenkinsfile 2>/dev/null; then
|
|
print_result 0 "Jenkins has QEMU configured"
|
|
else
|
|
print_result 1 "Jenkins missing QEMU"
|
|
fi
|
|
|
|
echo ""
|
|
echo "======================================"
|
|
echo -e "${BLUE}Validation Summary${NC}"
|
|
echo "======================================"
|
|
echo ""
|
|
echo -e "${GREEN}Passed: $PASSED${NC}"
|
|
echo -e "${RED}Failed: $FAILED${NC}"
|
|
echo ""
|
|
|
|
if [ $FAILED -eq 0 ]; then
|
|
echo -e "${GREEN}🎉 All validations passed!${NC}"
|
|
echo ""
|
|
echo "Your system is ready for multi-architecture builds."
|
|
echo ""
|
|
echo "Next steps:"
|
|
echo " 1. Run: ./scripts/build-multiarch.sh myapp latest"
|
|
echo " 2. Or push to CI/CD and watch multi-arch builds happen automatically"
|
|
echo ""
|
|
exit 0
|
|
else
|
|
echo -e "${RED}⚠️ Some validations failed${NC}"
|
|
echo ""
|
|
echo "Please review the failures above and fix them before proceeding."
|
|
echo ""
|
|
echo "Common fixes:"
|
|
echo " - Install Docker: https://docs.docker.com/get-docker/"
|
|
echo " - Update Docker to latest version"
|
|
echo " - Run with sudo if permission denied"
|
|
echo ""
|
|
exit 1
|
|
fi
|