254 lines
8.1 KiB
JavaScript
254 lines
8.1 KiB
JavaScript
#!/usr/bin/env node
|
||
|
||
/**
|
||
* GitHub.com Complete Build Test
|
||
*
|
||
* This test performs a complete build of github.com to verify
|
||
* that the entire packaging pipeline works correctly end-to-end.
|
||
*/
|
||
|
||
import { spawn } from "child_process";
|
||
import fs from "fs";
|
||
import path from "path";
|
||
import config from "./config.js";
|
||
|
||
console.log("🐙 GitHub.com Complete Build Test");
|
||
console.log("==================================\n");
|
||
|
||
const testName = "GitHub";
|
||
const appFile = path.join(config.PROJECT_ROOT, `${testName}.app`);
|
||
const dmgFile = path.join(config.PROJECT_ROOT, `${testName}.dmg`);
|
||
|
||
// Cleanup function
|
||
const cleanup = () => {
|
||
try {
|
||
if (fs.existsSync(appFile)) {
|
||
if (fs.statSync(appFile).isDirectory()) {
|
||
fs.rmSync(appFile, { recursive: true, force: true });
|
||
} else {
|
||
fs.unlinkSync(appFile);
|
||
}
|
||
console.log("✅ Cleaned up .app file");
|
||
}
|
||
if (fs.existsSync(dmgFile)) {
|
||
fs.unlinkSync(dmgFile);
|
||
console.log("✅ Cleaned up .dmg file");
|
||
}
|
||
|
||
// Clean .pake directory
|
||
const pakeDir = path.join(config.PROJECT_ROOT, "src-tauri", ".pake");
|
||
if (fs.existsSync(pakeDir)) {
|
||
fs.rmSync(pakeDir, { recursive: true, force: true });
|
||
console.log("✅ Cleaned up .pake directory");
|
||
}
|
||
} catch (error) {
|
||
console.warn("⚠️ Cleanup warning:", error.message);
|
||
}
|
||
};
|
||
|
||
// Handle cleanup on exit
|
||
process.on("exit", cleanup);
|
||
process.on("SIGINT", () => {
|
||
console.log("\n🛑 Build interrupted by user");
|
||
cleanup();
|
||
process.exit(1);
|
||
});
|
||
process.on("SIGTERM", cleanup);
|
||
|
||
console.log("🔧 Testing GitHub app packaging with optimal settings...");
|
||
console.log(
|
||
`Command: pake https://github.com --name ${testName} --width 1200 --height 800 --hide-title-bar\n`,
|
||
);
|
||
|
||
const command = `node "${config.CLI_PATH}" "https://github.com" --name "${testName}" --width 1200 --height 800 --hide-title-bar`;
|
||
|
||
const child = spawn(command, {
|
||
shell: true,
|
||
cwd: config.PROJECT_ROOT,
|
||
stdio: ["pipe", "pipe", "pipe"],
|
||
env: {
|
||
...process.env,
|
||
PAKE_CREATE_APP: "1",
|
||
},
|
||
});
|
||
|
||
let buildStarted = false;
|
||
let compilationStarted = false;
|
||
let bundlingStarted = false;
|
||
let buildCompleted = false;
|
||
|
||
console.log("📋 Build Progress:");
|
||
console.log("------------------");
|
||
|
||
child.stdout.on("data", (data) => {
|
||
const output = data.toString();
|
||
|
||
// Track build progress
|
||
if (output.includes("Installing package")) {
|
||
console.log("📦 Installing pake dependencies...");
|
||
}
|
||
if (output.includes("Package installed")) {
|
||
console.log("✅ Package installation completed");
|
||
}
|
||
if (output.includes("Building app")) {
|
||
buildStarted = true;
|
||
console.log("🏗️ Build process started...");
|
||
}
|
||
if (output.includes("Compiling")) {
|
||
compilationStarted = true;
|
||
console.log("⚙️ Rust compilation started...");
|
||
}
|
||
if (output.includes("Bundling")) {
|
||
bundlingStarted = true;
|
||
console.log("📦 App bundling started...");
|
||
}
|
||
if (output.includes("Built application at:")) {
|
||
buildCompleted = true;
|
||
console.log("✅ Application built successfully!");
|
||
}
|
||
if (output.includes("GitHub")) {
|
||
console.log("🐙 GitHub app configuration detected");
|
||
}
|
||
});
|
||
|
||
child.stderr.on("data", (data) => {
|
||
const output = data.toString();
|
||
|
||
// Track stderr progress (Tauri outputs build info to stderr)
|
||
if (output.includes("Installing package")) {
|
||
console.log("📦 Installing pake dependencies...");
|
||
}
|
||
if (output.includes("Building app")) {
|
||
buildStarted = true;
|
||
console.log("🏗️ Build process started...");
|
||
}
|
||
if (output.includes("Compiling")) {
|
||
compilationStarted = true;
|
||
console.log("⚙️ Rust compilation started...");
|
||
}
|
||
if (output.includes("Finished")) {
|
||
console.log("✅ Rust compilation finished!");
|
||
}
|
||
if (output.includes("Bundling")) {
|
||
bundlingStarted = true;
|
||
console.log("📦 App bundling started...");
|
||
}
|
||
if (output.includes("Built application at:")) {
|
||
buildCompleted = true;
|
||
console.log("✅ Application built successfully!");
|
||
}
|
||
|
||
// Only show actual errors, filter out build progress
|
||
if (
|
||
!output.includes("warning:") &&
|
||
!output.includes("verbose") &&
|
||
!output.includes("npm info") &&
|
||
!output.includes("Installing package") &&
|
||
!output.includes("Package installed") &&
|
||
!output.includes("Building app") &&
|
||
!output.includes("Compiling") &&
|
||
!output.includes("Finished") &&
|
||
!output.includes("Built application at:") &&
|
||
!output.includes("Bundling") &&
|
||
!output.includes("npm http") &&
|
||
!output.includes("Info Looking up installed") &&
|
||
output.trim().length > 0
|
||
) {
|
||
console.log("❌ Build error:", output.trim());
|
||
}
|
||
});
|
||
|
||
// Set a 10-minute timeout for the complete build (real packaging takes time)
|
||
// DON'T kill the process early - let it complete naturally
|
||
const timeout = setTimeout(() => {
|
||
console.log("\n⏱️ Build timeout reached (10 minutes)");
|
||
|
||
// Check if we actually have output files even if process is still running
|
||
const appExists = fs.existsSync(appFile);
|
||
const dmgExists = fs.existsSync(dmgFile);
|
||
|
||
if (appExists || buildCompleted) {
|
||
console.log("🎉 SUCCESS: GitHub app was built successfully!");
|
||
console.log(" App file exists, build completed despite long duration");
|
||
child.kill("SIGTERM");
|
||
process.exit(0);
|
||
} else {
|
||
console.log("❌ TIMEOUT: Build did not complete within 10 minutes");
|
||
child.kill("SIGTERM");
|
||
process.exit(1);
|
||
}
|
||
}, 600000); // 10 minutes
|
||
|
||
child.on("close", (code) => {
|
||
clearTimeout(timeout);
|
||
|
||
console.log(`\n📊 GitHub App Build Summary:`);
|
||
console.log("=============================");
|
||
console.log(`Exit Code: ${code}`);
|
||
console.log(`Build Started: ${buildStarted ? "✅" : "❌"}`);
|
||
console.log(`Compilation Started: ${compilationStarted ? "✅" : "❌"}`);
|
||
console.log(`Bundling Started: ${bundlingStarted ? "✅" : "❌"}`);
|
||
console.log(`Build Completed: ${buildCompleted ? "✅" : "❌"}`);
|
||
|
||
// Check for output files
|
||
const appExists = fs.existsSync(appFile);
|
||
const dmgExists = fs.existsSync(dmgFile);
|
||
console.log(`App File (.app): ${appExists ? "✅" : "❌"}`);
|
||
console.log(`DMG File: ${dmgExists ? "✅" : "❌"}`);
|
||
|
||
// Check .app bundle structure if it exists
|
||
if (appExists) {
|
||
try {
|
||
const contentsPath = path.join(appFile, "Contents");
|
||
const macOSPath = path.join(contentsPath, "MacOS");
|
||
const resourcesPath = path.join(contentsPath, "Resources");
|
||
|
||
console.log(`App Bundle Structure:`);
|
||
console.log(` Contents/: ${fs.existsSync(contentsPath) ? "✅" : "❌"}`);
|
||
console.log(
|
||
` Contents/MacOS/: ${fs.existsSync(macOSPath) ? "✅" : "❌"}`,
|
||
);
|
||
console.log(
|
||
` Contents/Resources/: ${fs.existsSync(resourcesPath) ? "✅" : "❌"}`,
|
||
);
|
||
} catch (error) {
|
||
console.log(`App Bundle Check: ❌ (${error.message})`);
|
||
}
|
||
}
|
||
|
||
// Real success check: app file must exist and build must have completed
|
||
if (appExists && (buildCompleted || code === 0)) {
|
||
console.log("\n🎉 COMPLETE SUCCESS: GitHub app build fully completed!");
|
||
console.log(" 🐙 GitHub.com successfully packaged as desktop app");
|
||
console.log(" 🎯 Build completed with app file generated");
|
||
console.log(" 📱 App bundle created with proper structure");
|
||
process.exit(0);
|
||
} else if (appExists) {
|
||
console.log("\n✅ SUCCESS: GitHub app was built successfully!");
|
||
console.log(" 🐙 GitHub.com packaging completed with app file");
|
||
console.log(" 🎯 Build process successful");
|
||
process.exit(0);
|
||
} else if (code === 0 && buildStarted && compilationStarted) {
|
||
console.log(
|
||
"\n⚠️ PARTIAL SUCCESS: Build process completed but no app file found",
|
||
);
|
||
console.log(" 🐙 GitHub.com build process executed successfully");
|
||
console.log(" ⚠️ App file may be in a different location");
|
||
process.exit(0);
|
||
} else {
|
||
console.log("\n❌ FAILED: GitHub app build did not complete successfully");
|
||
console.log(" ❌ No app file generated or build process failed");
|
||
process.exit(1);
|
||
}
|
||
});
|
||
|
||
child.on("error", (error) => {
|
||
clearTimeout(timeout);
|
||
console.log(`\n❌ Process Error: ${error.message}`);
|
||
console.log("🎯 Test Result: FAIL");
|
||
process.exit(1);
|
||
});
|
||
|
||
// Send empty input to handle any prompts
|
||
child.stdin.end();
|