Files
low-code-react-app-b/scripts/validate-qemu.sh

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