#!/usr/bin/env node /** * Docker Build Performance Test Script * Tests the optimized Dockerfile with BuildKit and full CPU usage */ const { execSync } = require('child_process'); const fs = require('fs'); console.log('๐Ÿš€ Docker Build Performance Test Suite'); console.log('=====================================\n'); // Test configurations const tests = [ { name: '๐Ÿ”ง Standard Build', command: 'docker compose build', description: 'Standard Docker build without optimizations' }, { name: 'โšก Optimized Build with BuildKit', command: 'DOCKER_BUILDKIT=1 docker compose --progress=plain build', description: 'Optimized build with BuildKit and progress output' }, { name: '๐Ÿš€ Parallel Optimized Build', command: 'DOCKER_BUILDKIT=1 COMPOSE_BAKE=true docker compose --progress=plain build --parallel', description: 'Full CPU parallel build with Bake integration' }, { name: '๐Ÿ”„ Development Target Build', command: 'DOCKER_BUILDKIT=1 docker compose --progress=plain build --target development', description: 'Fast development build for iteration' } ]; async function runBuildTest(test) { console.log(`\n${test.name}`); console.log('โ”€'.repeat(50)); console.log(`๐Ÿ“ ${test.description}`); console.log(`๐Ÿ’ป Command: ${test.command}\n`); const startTime = Date.now(); try { console.log('โฑ๏ธ Starting build...'); const output = execSync(test.command, { encoding: 'utf8', maxBuffer: 1024 * 1024 * 10, // 10MB buffer timeout: 600000 // 10 minute timeout }); const endTime = Date.now(); const duration = (endTime - startTime) / 1000; console.log(`โœ… Build completed in ${duration.toFixed(2)} seconds`); // Extract key metrics from build output const lines = output.split('\n'); const cacheHits = lines.filter(line => line.includes('CACHED')).length; const layers = lines.filter(line => line.match(/^#\d+/)).length; console.log(`๐Ÿ“Š Metrics:`); console.log(` โ€ข Build time: ${duration.toFixed(2)}s`); console.log(` โ€ข Cache hits: ${cacheHits}`); console.log(` โ€ข Total layers: ${layers}`); return { name: test.name, duration, cacheHits, layers, success: true }; } catch (error) { const endTime = Date.now(); const duration = (endTime - startTime) / 1000; console.log(`โŒ Build failed after ${duration.toFixed(2)} seconds`); console.log(`Error: ${error.message.slice(0, 200)}...`); return { name: test.name, duration, success: false, error: error.message }; } } async function testScreenshotService() { console.log('\n๐Ÿ–ผ๏ธ Testing Enhanced Screenshot Service'); console.log('โ”€'.repeat(50)); try { // Start container if not running console.log('๐Ÿ”„ Ensuring container is running...'); execSync('docker compose up -d', { encoding: 'utf8' }); // Wait for service to be ready console.log('โณ Waiting for service to be ready...'); await new Promise(resolve => setTimeout(resolve, 10000)); // Test the API endpoint console.log('๐Ÿงช Testing enhanced screenshot API...'); const testCommand = `curl -X POST http://localhost:3000/api/enhanced-screenshot \\ -H "Content-Type: application/json" \\ -d '{"symbol": "SOLUSD", "timeframe": "240", "layouts": ["ai"]}' \\ --max-time 60 --silent`; const response = execSync(testCommand, { encoding: 'utf8' }); console.log('๐Ÿ“ธ Screenshot API Response:', response.slice(0, 200)); return { success: true, response }; } catch (error) { console.log(`โŒ Screenshot service test failed: ${error.message}`); return { success: false, error: error.message }; } } async function runPerformanceTests() { console.log('๐ŸŽฏ Starting Docker optimization performance tests...\n'); const results = []; // Run build tests for (const test of tests) { const result = await runBuildTest(test); results.push(result); // Small delay between tests await new Promise(resolve => setTimeout(resolve, 2000)); } // Test screenshot service const screenshotResult = await testScreenshotService(); results.push({ name: '๐Ÿ–ผ๏ธ Screenshot Service', ...screenshotResult }); // Generate summary report console.log('\n๐Ÿ“Š Performance Test Results Summary'); console.log('โ•'.repeat(60)); const successfulBuilds = results.filter(r => r.success && r.duration); if (successfulBuilds.length > 0) { const avgBuildTime = successfulBuilds.reduce((sum, r) => sum + r.duration, 0) / successfulBuilds.length; const fastestBuild = successfulBuilds.reduce((min, r) => r.duration < min.duration ? r : min); console.log(`\n๐Ÿ† Best Performance: ${fastestBuild.name}`); console.log(` โฑ๏ธ Time: ${fastestBuild.duration.toFixed(2)}s`); console.log(` ๐Ÿ’พ Cache hits: ${fastestBuild.cacheHits || 0}`); console.log(`\n๐Ÿ“ˆ Average build time: ${avgBuildTime.toFixed(2)}s`); } console.log('\n๐Ÿ“‹ Individual Results:'); results.forEach(result => { const status = result.success ? 'โœ…' : 'โŒ'; const time = result.duration ? `${result.duration.toFixed(2)}s` : 'N/A'; console.log(` ${status} ${result.name}: ${time}`); }); // Recommendations console.log('\n๐Ÿ’ก Optimization Recommendations:'); console.log(' โ€ข Use DOCKER_BUILDKIT=1 for faster builds'); console.log(' โ€ข Enable --parallel for multi-threaded builds'); console.log(' โ€ข Use --progress=plain for detailed build output'); console.log(' โ€ข Consider COMPOSE_BAKE=true for better performance'); console.log(' โ€ข Use development target for faster iteration'); return results; } // Main execution if (require.main === module) { runPerformanceTests() .then(results => { console.log('\n๐ŸŽ‰ Performance testing completed!'); // Save results to file const reportFile = 'docker-performance-report.json'; fs.writeFileSync(reportFile, JSON.stringify({ timestamp: new Date().toISOString(), results, system: { nodeVersion: process.version, platform: process.platform, cpus: require('os').cpus().length } }, null, 2)); console.log(`๐Ÿ“„ Detailed report saved to: ${reportFile}`); process.exit(0); }) .catch(error => { console.error('\n๐Ÿ’ฅ Performance testing failed:', error.message); process.exit(1); }); } module.exports = { runPerformanceTests };